Linux 中的文件分为 Hard Link 和 Symbolic Link 两种。Hard Link 文件又被称为硬连接文件、实体连接文件,Symbolic Link 文件则常被称为符号连接、软连接文件。html
ln 命令用来在文件之间创建连接。在介绍 ln 命令前,让咱们先来搞清楚究竟什么是硬连接,什么又是软连接。node
咱们知道,在 Linux 系统中,每一个文件对应一个 inode,文件的内容在存储在 inode 指向的 data block 中。要读取该文件的内容,须要经过文件所在的目录中记录的文件名找到文件的 inode 号,而后经过 inode 找到存储文件内容的 data block(参考《Linux 文件与目录》)。
也就是说,文件名存储在目录中,inode 号执行文件存储的内容,文件名和 inode 之间有一个对应关系。那么多个文件名可不能够同时指向同一个 inode 呢?答案是能够的,这就是硬连接!从本质上来讲,硬连接只是在目录下新添加了一个文件名,这个文件名与一个已有文件的 inode 相关联。让咱们也经过 /etc/crontab 文件来进行观察:linux
$ ll -i /etc/crontab 131213 -rw-r--r-- 1 root root 722 Nov 16 2017 /etc/crontab
使用 ln 命令在当前目录下建立一个 /etc/crontab 文件的硬连接,而后观察其文件属性:spa
$ 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。
另外须要注意的一点是上面全部输出中的第二个字段中的第一位,它们都是 "-",它说明这个文件的类型为普通文件,连接类型为硬连接。.net
咱们能够经过下图来理解硬连接在文件系统中的实现方式:code
硬连接的特色htm
因为硬连接只是在目录中添加了一条包含文件名和 对应 inode 的记录,因此它几乎不会消耗额外的磁盘容量。
另外在删除硬连接所关联的文件时,其实只是删除了一条目录中的记录,真正的文件并不受影响。只有在删除最后一个硬连接时才会真正删除文件的内容数据。 blog
硬连接的局限性crontab
因为这两个限制,实际使用中硬连接并无软连接使用的普遍,下面咱们看看究竟什么是软连接。字符串
软连接的实现方式与硬连接有本质上的不一样。建立软连接时会建立一个新的文件(分配一个 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 source target
ln -s source target
它们分别用来建立硬连接文件和软连接文件。还有一个比较经常使用的选项是 f,它会强制删除已经存在的目标文件。
参考:
ln man page
鸟哥的私房菜
完全理解“软连接”和“硬连接”
The difference between hard and soft links