前言:
1. linux除了进程之外,其余的都是文件。 目录也是文件。 链接也是文件
2.是文件就由两部分组成: 1.元数据 2. 用户数据。 其中元数据包含inode, 其中inode包含inode号。 可以ls -il可以查看inde号。也可以根据find -inum 查询文件名。
3. 文件名是不只是test.txt. 它是包含路径的。
4. 根据文件的inode号访问文件的用户数据。
5. 文件名、inode号、用户数据之间存在映射关系。 多个文件名可能对应一个inode号。 但是一个文件名不能对应 多个inode号。 其中用户数据同inode号是一一对应的。 关系如下图所示
更详细的可以参看:https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/index.html
查看文件内容过程。
目录的inode -找到->目录的用户数据-->文件的inode-->文件的用户的数据。
核心:文件的inode是保存在目录的用户数据中的。
具体的可参看:https://www.cnblogs.com/crazylqy/p/5821105.html
硬链接:ln soure taret
软连接: ln -s source targe
在A下面执行ln ../B/b hard_link_b 会发生什么呢?
答:
在目录(文件)A的数据区中, 会增加一条信息如下:
当你cat hard_link_b的时候, 会从文件A的数据区中查找hard_link_b对应的inode号. 根据inode号访问b的用户数据。
在A下面执行ln -s ../B/b soft_link_b会发生什么呢?
在目录(文件)A的数据区中, 会增加如下一条信息:
metadata | userdata | |
文件名 | inode | |
soft_link_b | 34115383 | ../B/b |
当你cat soft_link_b的时候, 会根据soft_link_b 查找到inode号 34115383, 根据34115383访问软连接的用户数据, 其中是个文件名。 根据这个文件名../B/b然后再去查找inode号, 再访问其中的数据。
总之:
硬链接是将hard_link_b的文件名和文件b的用户数据直接建立联系。
软连接是将soft_link_b同文件b的文件名(../B/b)直接建立联系。 这就是相当于windows的快捷方式。 windows的快捷方式怎么操作, 软链接就怎么操作。
因此:改变文件b的名字或路径(../B/b), 软连接失效。 而硬链接继续有效。
此处需要再解释一下。
rm -f ../B/b 只是将目录B的用户数据区中的b文件名、及其inode删除掉。 b的用户数据及其inode仍旧存在。 所以你可以通过硬链接来访问他。
为什么b的用户数据及其inode仍旧存在?
答:
一个文件,如果没有文件名关联他的inode的时候, 才会被真正的删除。 这也是其他的博文中说的, 使用硬链接可以防止文件被误删。 rm -f ../B/b, 此时仍有hardlink这个文件名同其inode关联。 所以b并没有被真正的删除。