硬链接是一个指针,指向文件的索引结点。不为其分配新的inode。
软连接要分配新的inode,完成dentry->inode->block的分配(dentry中的name就是创建软连接文件的文件名)。block指向另一个dentry文件。
先看硬链接、软连接的构造方法。
删除一个文件或者目录。实际上是把inode的链接数减1,链接数是统计的硬链接,不影响其他指向此inode的链接。而会对指向该文件和目录的软链接有影响。
所以说硬链接是直接指向文件的inode,而软连接是指向目录的。
在截图中我们可以看出,ls -F 指令,软连接用@标识
上图中第一列是inode号,第三列是硬链接数,可以看到a.txt和b.txt是共享一个inode号的,且文件属性相同。由于共享了inode号,故不同的文件系统中是不能建立硬链接的。
而软链接c.txt与a.txt,b.txt的inode号以及文件属性都不同。即软连接有自己的inode号。
此时a.txt和b.txt的硬链接数都是2
以下两点软硬链接用法区别
1.硬链接不许对目录创建,而软链接而对目录创建
原因,有两点:
1.防止遍历时出现死循环。软连接之所以不会出现死循环是因为系统可以在遍历目录时,可以判断出这是一个符号链接,若连续出现符号链接超过某个此处,则终端循环。
2.dentry(目录和文件都有自己的dentry)中有一个指向父目录的指针。若父目录中有两个dentry地址,则该目录项中的每个dentry的parent向不知道指向哪个了。
2.硬链接不能跨文件系统,软链接可以跨文件系统
硬链接实现的是多个文件名指向同一个inode,即多个dentry对应一个inode。也就是每个硬链接对应一个目录项
这部分没有完全描述清楚,之后又了解再及时补充
下面插入一幅图:
通过上图我们可以上到软连接的数据区实际上指向的是源文件的dentry,所以说:
对于软连接:创建一个软链接,inode的引用计数不会增加,删除被链接的源文件,则相关软连接变成了死链接。
对于硬链接:创建硬链接,inode的引用计数会加1.
这部分有参考: