在Linux文件中有软链接(也叫做符号链接)硬链接两种链接方式。

那么这两种链接方式是什么以及有什么区别呢?

这里先给出结论,下面再用具体的例子来进行说明:

软链接:相当于创建一个快捷方式,链接文件会占用一个新的inode值,修改链接等同修改源文件,反之一样,删除源文件链接文件失效,删除链接文件则不影响源文件。

相关命令:

# 创建软链接
[root@centos-7 xuyang233]# ln -s filename soft-link-file

硬链接:就相当于文件备份,但是此文件与源文件使用通同一个 inode 值并不占用任何空间,修改源文件或者链接文件都会同步修改,删除掉源文件对链接文件没有影响,反之也是一样。

相关命令:s

# 创建硬链接
[root@centos-7 xuyang233]# ln filename hard-link-file

验证

[root@centos-7 xuyang233]# ls -l
total 0
# 创建一个文件,并向该文件中覆盖内容“something content”
[root@centos-7 xuyang233]# touch filename && echo "something content" > filename
# 查看文件内容
[root@centos-7 xuyang233]# cat filename 
something content
# 查看文件列表并显示 inode 值
[root@centos-7 xuyang233]# ls -li
total 4
33574982 -rw-r--r--. 1 root root 18 Aug 18 06:20 filename
# 创建一个硬链接
[root@centos-7 xuyang233]# ln filename hard-link-file
[root@centos-7 xuyang233]# ls -li
total 8
33574982 -rw-r--r--. 2 root root 18 Aug 18 06:20 filename
33574982 -rw-r--r--. 2 root root 18 Aug 18 06:20 hard-link-file # 可以看出inode 值是一样的,因此并不会开辟新的存储空间
# 接下来向硬链接文件中追加内容,发现源文件中的内容也追加了
[root@centos-7 xuyang233]# echo "appended content..." >> hard-link-file 
[root@centos-7 xuyang233]# cat filename 
something content
appended content...
# 接下来创建一个软链接
[root@centos-7 xuyang233]# ln -s filename soft-link-file
[root@centos-7 xuyang233]# ls -li
total 8
33574982 -rw-r--r--. 2 root root 38 Aug 18 06:26 filename
33574982 -rw-r--r--. 2 root root 38 Aug 18 06:26 hard-link-file
# 这里软链接文件的 inode 值与源文件不一样了,并且它的文件属性上也有一个 l 的 标志,这就说明它与之前我们创建的两个文件根本不是一个类型
33575005 lrwxrwxrwx. 1 root root  8 Aug 18 06:27 soft-link-file -> filename
# 向软链接文件中追加值,发现源文件依旧被修改了
[root@centos-7 xuyang233]# echo "soft content..." >> filename 
[root@centos-7 xuyang233]# cat filename 
something content
appended content...
soft content...
# 接下来删除源文件看看硬链接和软连接会有什么变化
[root@centos-7 xuyang233]# rm -f filename 
[root@centos-7 xuyang233]# ls -li
total 4
33574982 -rw-r--r--. 1 root root 54 Aug 18 06:30 hard-link-file
33575005 lrwxrwxrwx. 1 root root  8 Aug 18 06:27 soft-link-file -> filename
# 硬链接文件内容依旧存在,因为它 inode 所指向的区块由于有一个硬链接在指向它,所以这个区块仍然有效,并且可以访问到。
[root@centos-7 xuyang233]# cat hard-link-file 
something content
appended content...
soft content...
# 但是软链接文件查看报错了,显示不存在该文件或目录
# 这是因为软链接的 inode 所指向的内容实际上是保存了一个绝对路径,当用户访问这个文件时,系统会自动将其替换成其所指的文件路径,然而这个文件已经被删除了,所以自然就会显示无法找到该文件了。
[root@centos-7 xuyang233]# cat soft-link-file 
cat: soft-link-file: No such file or directory
# 接下来我们再向软链接中写入一些内容看看会发生什么事情
[root@centos-7 xuyang233]# echo "new content..." >> soft-link-file 
[root@centos-7 xuyang233]# ls -li
total 8
33825197 -rw-r--r--. 1 root root 15 Aug 18 06:36 filename
33574982 -rw-r--r--. 1 root root 54 Aug 18 06:30 hard-link-file
33575005 lrwxrwxrwx. 1 root root  8 Aug 18 06:27 soft-link-file -> filename
[root@centos-7 xuyang233]# cat filename 
new content...
[root@centos-7 xuyang233]# cat hard-link-file 
something content
appended content...
soft content...
# 查看上面的输出,神奇的事情发生了,删掉的 filename 文件居然“回来了”
# 但是这并不是真的回来了,只不过因为写入访问软链接时,系统自动将其路径替换
# 为其所代表的绝对路径,并直接访问那个路径了,但是这个文件并不存在,所以重新创建了一个,
# 看前面的 inode 值就可以知道,这个 filename 已经不是之前那个 filename 了。
# 并且硬链接文件中内容并没有受到影响,也证实了这一猜想!

总结:

  • 硬链接: 与普通文件没什么不同,inode 都指向同一个文件在硬盘中的区块
  • 软链接: 保存了其代表的文件的绝对路径,是另外一种文件,在硬盘上有独立的区块,访问时替换自身路径。

前天遇到了小鹿,昨天是小兔子,今天是你。