作者:sparkdev
链接:https://www.cnblogs.com/sparkdev/p/11275722.html
ln 命令用来在文件之间建立链接。在介绍 ln 命令前,我们先搞清楚究竟什么是硬链接,什么又是软链接。
Hard Link(硬链接)
我们知道,在 Linux 系统中,每个文件对应一个 inode,文件的内容存储在 inode 指向的 data block 中。要读取该文件的内容,需要通过文件所在的目录中记录的文件名找到文件的 inode 号,然后通过 inode 找到存储文件内容的 data block。
也就是说,文件名存储在目录中,inode 号执行文件存储的内容,文件名和 inode 之间有一个对应关系。那么多个文件名可不可以同时指向同一个 inode 呢?答案是可以的,这就是硬链接!从本质上来说,硬链接只是在目录下新添加了一个文件名,这个文件名与一个已有文件的 inode 相关联。我们通过 /etc/crontab 文件来进行观察:
$ ll -i /etc/crontab
131213 -rw-r--r-- 1 root root 722 Nov 16 2017 /etc/crontab
使用 ln 命令在当前目录下创建一个 /etc/crontab 文件的硬链接,然后观察其文件属性:
$ sudo ln /etc/crontab .
$ ll -i /etc/crontab crontab
131213 -rw-r--r-- 2 root root 722 Nov 16 2017 crontab
131213 -rw-r--r-- 2 root root 722 Nov 16 2017 /etc/crontab
这两个文件名关联的 inode 号完全相同,都是 131213,所以它们指向的是同一个文件。同时请注意文件属性中的第三个字段,由 1 变成了 2。这个字段被称为 "链接数",它说明有多少个文件名链接到同一个文件的 inode。
另外需要注意的一点是上面所有输出中的第二个字段中的第一位,它们都是 "-",它说明这个文件的类型为普通文件,链接类型为硬链接。
我们可以通过下图来理解硬链接在文件系统中的实现方式:
硬链接的特点
几乎不额外占用空间
只要还有一个文件名引用着文件,文件就不会被真正删除
由于硬链接只是在目录中添加了一条包含文件名和 对应 inode 的记录,所以它几乎不会消耗额外的磁盘容量。
另外在删除硬链接所关联的文件时,其实只是删除了一条目录中的记录,真正的文件并不受影响。只有在删除最后一个硬链接时才会真正删除文件的内容数据。
硬链接的局限性
不能跨文件系统创建硬链接
不能链接目录
由于这两个限制,实际使用中硬链接并没有软链接使用的广泛,下面我们看看究竟什么是软链接。
Symbolic Link(软链接)
软链接的实现方式与硬链接有本质上的不同。创建软链接时会创建一个新的文件(分配一个 inode 和对应的 data block),新文件的 data block 中存储了目标文件的路径。
还拿 /etc/crontab 文件举例子,这次创建一个软链接并查看其文件属性:
$ sudo ln -s /etc/crontab crontab2
第一列,两个文件名对应的 inode 不同,说明这是两个文件。
第二列显示的文件权限也不一样,这一点和硬链接完全不同。注意文件类型被标记为 "l",说明这是一个软链接文件。
第三列很有意思,注意 /etc/crontab 文件的链接数量,还是 2,这和创建软链接文件 crontab2 前是一样的。也就是说创建软链接并不增加原文件的链接数。
第六列是文件大小,注意新建的软链接文件大小为 12 Bytes,也就是字符串 "/etc/crontab" 的长度。
最后一列会友好的显示出软链接文件指向的源文件。
我们可以通过下图来理解软链接在文件系统中的实现方式:
从上图我们可以看出,软链接文件 crontab2 是一个实实在在的文件,有自己的 inode 和 data block。但是它的 data block 中保存的是目标文件的地址:/etc/crontab。 像 open() 这样的 API 能够识别出软链接,并根据 data block 中的目标文件径把操作重定向到目标文件上。
可以链接目录是软链接的一大优势,创建目录链接的方式和普通文件一样:
$ ln -s /bin testbin
此时进入 testbin 目录和进入 /bin 目录是一样的。
更厉害的是,还可以跨文件系统创建软链接!
删除源文件
对于软链接来说,删除源链接后,链接文件就会无法找到指向的源文件了。看下面的演示:
$ echo "hello world" > hello.txt
$ ln -s hello.txt hello2
$ cat hello2
hello world
$ rm hello.txt
$ cat hello2
cat: hello2: No such file or directory
删除原文件后,操作链接文件时的提示是:"No such file or directory"。
文件的链接数
从上文中的示例我们可以看到,当创建硬链接文件时,文件的链接数会增加 1,而创建软链接时文件的链接数却不发生变化。
下面让我们看一个目录文件的链接数,先创建一个空目录:
$ mkdir /home/nick/testdir
$ ll /home/nick | grep testdir
drwxr-xr-x 2 nick nick 4096 Jul 10 08:58 testdir/
新建的空目录有两个硬链接,分别是:
/home/nick/testdir
/home/nick/testdir/.
而 /home/nick/testdir 目录下还有一个指向其父目录的硬链接:/home/nick/testdir/..
也就是说当我们创建一个目录时,其父目录的硬链接数会增加 1。
ln 命令
ln 命令用来在文件之间建立链接,其的常用方式为:
ln source target
ln -s source target
它们分别用来创建硬链接文件和软链接文件。还有一个比较常用的选项是 f,它会强制删除已经存在的目标文件。
参考:
ln man page
鸟哥的私房菜
彻底理解“软链接”和“硬链接”
The difference between hard and soft links