硬链接是以文件副本引用的形式存在的,他跟源文件拥有同一个inode节点;
ln test.txt hard_link
软连接是以路径的形式存在的, 他的inode节点所对应的数据块存储的是源文件的路径。
权限位中"l"表示这是一个软链接文件;其次,在文件的后面通过 "->" 显示出源文件的完整名字。
ln -s test.txt soft_link
他们的区别的是:软连接可以跨文件系统创建,而且可以对目录进行创建,硬链接都不行,
所以,相对来说,软连接更加灵活,删除软连接不会产生任何影响,但是如果源文件被删除了,那么所有的软连接就失效了,很像windows下的快捷方式。
硬链接说白了是一个指针,指向指定的文件索引节点inode,系统并不为它重新分配inode。inode中有一个计数,硬链接同时会使这个计数加一,当计数为0时才真正删除文件。
- 首先找到根目录的 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 文件的读取与访问。
- 不论是修改源文件(test 文件),还是修改硬链接文件(test-hard 文件),另一个文件中的数据都会发生改变。
- 不论是删除源文件,还是删除硬链接文件,只要还有一个文件存在,这个文件(inode 号是 262147 的文件)都可以被访问。
- 硬链接不会建立新的 inode 信息,也不会更改 inode 的总数。
- 硬链接不能跨文件系统(分区)建立,因为在不同的文件系统中,inode 号是重新计算的。
- 硬链接不能链接目录,因为如果给目录建立硬链接,那么不仅目录本身需要重新建立,目录下所有的子文件,包括子目录中的所有子文件都需要建立硬链接,这对当前的 Linux 来讲过于复杂。
- 硬链接的限制比较多,既不能跨文件系统,也不能链接目录,而且源文件和硬链接文件之间除 inode 号是一样的之外,没有其他明显的特征。
软链接也称作符号链接,软链接的源文件必须写绝对路径,权限位中"l"表示这是一个软链接文件;其次,在文件的后面通过 "->" 显示出源文件的完整名字。
软链接和源文件的 inode 号是不一致的,其访问过程为:
-
首先找到根目录的 inode 索引信息,然后判断用户是否有权限访问根目录的 block。
-
如果有权限访问根目录的 block,就会在 block 中查找到 /tmp/ 目录的 inode 号。
-
接着访问 /tmp/ 目录的 inode 信息,判断用户是否有权限访问 /tmp/ 目录的 block。
-
如果有权限,就会在 block 中读取到软链接文件 check-soft 的 inode 号。因为软链接1. 文件会真正建立自己的 inode 索引和 block,所以软链接文件和源文件的 inode 号是不一样的。
-
通过软链接文件的 inode 号,找到了 check-soft 文件 inode 信息,判断用户是否有权限访问 block。
-
如果有权限,就会发现 check-soft 文件的 block 中没有实际数据,仅有源文件 check 的 inode 号。
-
接着通过源文件的 inode 号,访问到源文件 check 的 inode 信息,判断用户是否有权限访问 block。
通过这个过程,我们就可以总结出软链接的特点(软链接的特点和 Windows 中的快捷方式完全一致)。
- 不论是修改源文件(check),还是修改硬链接文件(check-soft),另一个文件中的数据都会发生改变。
- 删除软链接文件,源文件不受影响。而删除原文件,软链接文件将找不到实际的数据,从而显示文件不存在。
- 软链接会新建自己的 inode 信息和 block,只是在 block 中不存储实际文件数据,而存储的是源文件的文件名及 inode 号。
- 软链接可以链接目录。
- 软链接可以跨分区。