问题引出
linux下有两种方式创建链接文件,今天看《深入理解linux内核》这本书的绪章中提到
“硬链接有两方面的限制:
-
不允许用户给目录创建硬链接。因为这可能把目录树变成环形图,从而就不可能通过名字定位一个文件。
-
只有在同一文件系统中的文件才能创建硬链接。”
对于第二点应该可以理解,但是第一条不是太明白,今天花点时间把这个问题研究了下。
解释
背景知识
文件系统所处理的文件需要的所有信息都包含在一个名为索引节点(inode)的数据结构中。每个文件都有自己 的索引节点,文件系统用索引节点来标识文件。
索引节点在POSIX标准中指定如下属性:
-
文件类型(普通文件、目录、块文件、符号链接、管道、套接字等)
-
与文件相关的硬链接个数
-
以字节为单位的文件长度
-
设备标识符
-
在文件系统中标识文件的索引节点号
-
文件拥有者UID
-
文件用户组ID
-
几个时间戳(节点状态改变时间、最后访问时间、最后修改时间)
-
访问权限和文件模式
首先我们要理解这两个概念什么是硬链接什么是软链接。
指向原文件的一个副本,文件名字不同,但是两者索引节点中有着相同的索引节点号。如下面给文件a,建立硬链接b,这里有了两个文件分别是a,b,他们分别有自己的索引节点信息,通过ls -i查看到两者node号相同,也就是在硬盘是指的同一块区域,而且他们的链接数都为2,两者互为副本,即使删掉任何其中任何一个,文件也不会删除,直到文件链接数为1,再删除文件才会消失。
软链接是一个短文件,它的内容包含了原文件(夹)的路径名。如下面给文件c建立软链接文件c,这样分别有了两个文件及他们的索引节点信息,通过ls -il查看两者的索引节点号不相同,任何对软链接文件的引用都可以被自动转换成指向原文件的一个引用。
好了,关于什么是硬链接软链接的知识就介绍到这里,下面我们就来看看为什么不能给文件夹创建硬链接,却可以给文件夹创建软链接
分别建立文件夹a,在a文件夹下面建立aa软链接文件指向a文件夹,那这样不就是环形目录结构了?在目录a下cd然后tab查看结果可以不断进入下一层文件夹,linux系统可以识别是软链接文件,因为他们拥有不同的文件类型和node号,阻止循环的继续
不同a与aa不同node号
使用tree命令的时候不是递归下去,如下
而一但是硬链接,在这种情况下,即文件夹的文件硬链接到父文件夹,名字不同拥有相同的node号,形成了循环,破坏了文件的明确性,文件夹下面的文件有多个父文件夹。例如
在a下创建aa文件夹,再在aa文件夹下面创建硬链接aaa指向a文件夹,这样一来,文件夹aa的父文件夹可以表示为
a/和a/aa/aaa/
同样的这之下的文件也会存在不同的路径名,如果父文件夹指向下面的文件夹,也会造成混乱,破坏了文件系统的树形结构,那样类似tree之类的的递归命令会崩溃吧!
这篇文章仅仅是帮助自己理解硬链接与软链接,如有错误或理解不到位之处,还请指出,大家互相交流
最后贴上查找资料过程中大神们的解答:
关于inode
关于不能给文件夹创建硬链接
阅读(2052) | 评论(0) | 转发(0) |