ln 命令用于给文件创建链接,链接的方式分为以下 2 种:
- 软链接:类似于 Windows 系统中给文件创建快捷方式,即产生一个特殊的文件,该文件用来指向另一个文件,此链接方式同样适用于目录
- 硬链接:文件的基本信息都存储在 inode 中,而硬链接指的就是给一个文件的 inode 分配多个文件名,通过任何一个文件名,都可以找到此文件的 inode,从而读取该文件的数据信息
1 2 3 4 5 6 7 8 9
|
$ ln ~/test /tmp
$ ln -s ~/test /tmp
|
影响链接的 inode 和 block
inode(i 节点)
- inode 的默认大小为 128 Byte,用来记录文件的权限(r、w、x)、文件的所有者和属组、文件的大小、文件的状态改变时间(ctime)、文件的最近一次读取时间(atime)、文件的最近一次修改时间(mtime)、文件的数据真正保存的 block 编号
- 每个文件需要占用一个 inode,文件内容由 inode 的记录来指向
- inode 不记录文件名,文件名记录在文件所在目录的 block 中
block
-
block 的大小可以是 1KB、2KB、4KB,默认为 4KB
-
block 用于实际的数据存储,如果一个 block 放不下数据,则可以占用多个 block
例如,有一个 10KB 的文件需要存储,则会占用 3 个 block,虽然最后一个 block 不能占满,但也不能再放入其他文件的数据。这 3 个 block 有可能是连续的,也有可能是分散的。
所以,如果想要读取文件内容,就必须借助目录中记录的文件名找到该文件的 inode,才能成功找到文件内容所在的 block 块
查找 /root/test 要经过以下步骤
- 找到根目录的 inode 信息(根目录的 inode 是系统已知的,inode 号是 2),判断用户是否有权限访问根目录的 block
- 如果有权限,则可以在根目录的 block 中访问到 /root 的文件名及对应的 inode 号
- 通过 /root/ 目录的 inode 号,查找到 /root/ 目录的 inode 信息,接着判断用户是否有权限访问 /root/ 目录的 block
- 如果有权限,则可以从 /root/ 目录的 block 中读取到 test 文件的文件名及对应的 inode 号
- 通过 test 文件的 inode 号,就可以找到 test 文件的 inode 信息,接着判断用户是否有权限访问 test 文件的 block
- 如果有权限,则可以读取 block 中的数据,这样就完成了 /root/test 文件的读取与访问
硬链接
在 inode 中,是不会记录文件名称的,而是把文件名记录在上级目录的 block 中。也就是说,目录的 block 中记录的是这个目录下所有一级子文件和子目录的文件名及对应的 inode;而文件的 block 中记录的才是文件实际的数据
给源文件 /root/test 建立了硬链接文件 /tmp/test_hard 之后,/tmp/ 目录的 block 中就会建立 test_hard 的信息,这个信息主要包含文件名和对应的 inode
通过 /tmp/test_hard 查找 /root/test 要经过以下步骤
- 找到根目录的 inode 信息,判断用户是否有权限访问根目录的 block
- 如果有权限,则可以在根目录的 block 中访问到 /tmp 的文件名及对应的 inode 号
- 通过 /tmp/ 目录的 inode 号,查找到 /tmp/ 目录的 inode 信息,接着判断用户是否有权限访问 /tmp/ 目录的 block
- 如果有权限,则可以从 /tmp/ 目录的 block 中读取到 test_hard 文件的文件名及对应的 inode 号
- 通过 test_hard 文件的 inode 号,因为 /root/test 和 /tmp/test_hard 有着相同的 inode 号,所以,此时也就是找到了 /root/test 的 inode 信息,接着判断用户是否有权限访问 test_hard 文件的 block
- 如果有权限,则可以读取 block 中的数据,这样就完成了 /root/test 文件的读取与访问
硬链接的特点:
- 不论是修改源文件,还是修改硬链接文件,另一个文件中的数据都会随之发生改变
- 不论是删除源文件,还是删除硬链接文件,只要还有一个文件存在,这个文件都可以被访问
- 硬链接不会建立新的 inode 信息
- 硬链接不能跨文件系统(分区)建立,因为在不同的文件系统中,inode 是重新计算的
- 硬链接不能链接目录,因为如果给目录建立硬链接,那么不仅目录本身需要重新建立,目录下所有的子文件,包括子目录中的所有子文件都需要建立硬链接,这对当前的 Linux 来讲过于复杂
软链接
软链接和硬链接在原理上最主要的不同在于:硬链接不会建立自己的 inode 索引和 block(数据块),而是直接指向源文件的 inode 信息和 block,所以硬链接和源文件的 inode是一致的;而软链接会真正建立自己的 inode 索引和 block,所以软链接和源文件的 inode是不一致的,而且在软链接的 block 中,写的不是真正的数据,而仅仅是源文件的文件名及 inode。
通过 /tmp/test_soft 查找 /root/test 要经过以下步骤
- 找到根目录的 inode 索引信息,然后判断用户是否有权限访问根目录的 block
- 如果有权限,则可以在根目录的 block 中访问到 /tmp 的文件名及对应的 inode 号
- 接着访问 /tmp/ 目录的 inode 信息,判断用户是否有权限访问 /tmp/ 目录的 block
- 如果有权限,就会在 block 中读取到软链接文件 test_soft 的 inode 号,因为软链接文件会真正建立自己的 inode 索引和 block,所以软链接文件和源文件的 inode 号是不一样的
- 通过 test_soft 的 inode 号,找到了 test_soft 文件 inode 信息,判断用户是否有权限访问 block
- 如果有权限,就会发现 test_soft 文件的 block 中没有实际数据,仅有源文件 /root/test 的 inode 号
- 接着通过源文件的 inode 号,访问到源文件 /root/test 的 inode 信息,判断用户是否有权限访问 block
- 如果有权限,就会在 /root/test 文件的 block 中读取到真正的数据,从而完成数据访问
软链接的特点(和 Windows 中的快捷方式完全一致):
- 不论是修改源文件,还是修改软链接文件,另一个文件中的数据都会随之发生改变
- 删除软链接文件,源文件不受影响;删除原文件,软链接文件将找不到实际的数据,从而显示文件不存在
- 软链接会新建自己的 inode 信息和 block,只是在 block 中不存储实际文件数据,而存储的是源文件的文件名及 inode
- 软链接可以链接目录
- 软链接可以跨分区
be slow to promise and quick to perform.