Linux 中的文件分为 Hard Link 和 Symbolic Link 两种。Hard Link 文件又被称为硬链接文件、实体链接文件,Symbolic Link 文件则常被称为符号链接、软链接文件。 ln 命令用来在文件之间建立链接。在介绍 ln 命令前,让我们先来搞清楚究竟什么是硬链接,什么又是软链接。 Hard Link(硬链接)我们知道,在 Linux 系统中,每个文件对应一个 inode,文件的内容在存储在 inode 指向的 data block 中。要读取该文件的内容,需要通过文件所在的目录中记录的文件名找到文件的 inode 号,然后通过 inode 找到存储文件内容的 data block(参考《Linux 文件与目录》https://www.cnblogs.com/sparkdev/p/11249659.html)。
$ ll -i /etc/crontab 使用 ln 命令在当前目录下创建一个 /etc/crontab 文件的硬链接,然后观察其文件属性: $ sudo ln /etc/crontab . 这两个文件名关联的 inode 号完全相同,都是 131213,所以它们指向的是同一个文件。同时请注意文件属性中的第三个字段,由 1 变成了 2。这个字段被称为 '链接数',它说明有多少个文件名链接到同一个文件的 inode。
我们可以通过下图来理解硬链接在文件系统中的实现方式: 硬链接的特点
由于硬链接只是在目录中添加了一条包含文件名和 对应 inode 的记录,所以它几乎不会消耗额外的磁盘容量。
硬链接的局限性
由于这两个限制,实际使用中硬链接并没有软链接使用的广泛,下面我们看看究竟什么是软链接。 Symbolic Link(软链接)软链接的实现方式与硬链接有本质上的不同。创建软链接时会创建一个新的文件(分配一个 inode 和对应的 data block),新文件的 data block 中存储了目标文件的路径。 $ sudo ln -s /etc/crontab crontab2 第一列,两个文件名对应的 inode 不同,说明这是两个文件。 第二列显示的文件权限也不一样,这一点和硬链接完全不同。注意文件类型被标记为 'l',说明这是一个软链接文件。
我们可以通过下图来理解软链接在文件系统中的实现方式: 从上图我们可以看出,软链接文件 crontab2 是一个实实在在的文件,有自己的 inode 和 data block。但是它的 data block 中保存的是目标文件的地址:/etc/crontab。 像 open() 这样的 API 能够识别出软链接,并根据 data block 中的目标文件径把操作重定向到目标文件上。 可以链接目录是软链接的一大优势,创建目录链接的方式和普通文件一样:
此时进入 testbin 目录和进入 /bin 目录是一样的。 更厉害的是,还可以跨文件系统创建软链接! 删除源文件
删除原文件后,操作链接文件时的提示是:'No such file or directory'。 文件的链接数从上文中的示例我们可以看到,当创建硬链接文件时,文件的链接数会增加 1,而创建软链接时文件的链接数却不发生变化。
$ mkdir /home/nick/testdir 新建的空目录有两个硬链接,分别是: /home/nick/testdir 而 /home/nick/testdir 目录下还有一个指向其父目录的硬链接:/home/nick/testdir/.. 也就是说当我们创建一个目录时,其父目录的硬链接数会增加 1。 ln 命令ln 命令用来在文件之间建立链接,其的常用方式为:
参考:
●编号825,输入编号直达本文 ●输入m获取文章目录 |
|