04月25, 2015

为什么linux不支持对文件夹的硬连接(hard link)?

注意:这是一篇从旧博客恢复的文章。

原地址:http://freemeepo.com/blog/archives/216


今天看鸟哥看到这个问题,感觉没有搞明白,于是仔细想了想再加上查到的一些资料,总算是搞清楚了。

鸟哥给出的解释是

“不能跨 Filesystem 还好理解,那不能 hard link 到目录又是怎么回事呢?这是因为如果使用 hard link 链接到目录时, 链接的数据需要连同被链接目录底下的所有数据都创建链接,举例来说,如果你要将 /etc 使用实体链接创建一个 /etc_hd 的目录时,那么在 /etc_hd 底下的所有档名同时都与 /etc 底下的檔名要创建 hard link 的,而不是仅连结到 /etc_hd 与 /etc 而已。 并且,未来如果需要在 /etc_hd 底下创建新文件时,连带的, /etc 底下的数据又得要创建一次 hard link ,因此造成环境相当大的复杂度。 所以啰,目前 hard link 对于目录暂时还是不支持的啊!”

按照鸟哥的意思,我不仅给这个文件夹的hard link分配一个inode,还要分配一个block,存放跟那个文件夹一样的文件信息。这样的话,就相当于复制了一个文件夹(只是复制文件夹,因为文件夹本身也是文件,这个文件记录这个文件夹里的文件信息)。

但是,如果我们只给这个文件夹的hard link分配一个inode,使它的inode指向这个文件夹,这样是不是就可行了呢?看起来是可行的,但是并不是这样。

这个网页是这么说的:

硬链接不能对目录创建是受限于文件系统的设计(见 清单 4.对目录创建硬链接将失败)。现 Linux 文件系统中的目录均隐藏了两个个特殊的目录:当前目录(.)与父目录(..)。查看这两个特殊目录的 inode 号可知其实这两目录就是两个硬链接(注意目录 /mnt/lost+found/ 的 inode 号)。若系统允许对目录创建硬连接,则会产生目录环。

首先,linux中有两个特殊的目录,.与..。它们本身其实就是文件夹的硬连接,除此之外就没有文件夹的硬连接了。设想有如下情况:有如下文件夹~/tmp/a,然后我创建一个~/test/b的hard link。这时问题来了,我~/tmp/a/..究竟代表什么呢?如果你说那肯定是~/tmp啊,那~/test/b/..呢?因为他们指向的是同一个文件夹,所以.与..这两个特殊的文件夹是只存在一份的,所以很显然~/test/b/..不可能再代表~/test,不可能同一个..文件夹表示的路径不同。而且如果当我删掉~/tmp时,此时只存在~/test/b,那~/test/b/..的指向就成个另外一个问题,因为删除hard link的时候,只要删除它的inode就可以,并不会修改里面的..文件夹的信息。想要改..文件夹的信息是非常困难的,因为不知道究竟是哪些文件夹是这个文件夹的hard link,而只知道链接到某个文件的数量。

另外,那个网页中提到“若系统允许对目录创建硬连接,则会产生目录环”。考虑下面这个例子:

假设存在~/tmp/a与~/test/b,a和b都是hard link,a指向~/test,b指向~/tmp。那么当我对~执行find命令的时候,就会走入这样的环中:~/tmp/a/b/a/b/a/b……。这显然是不合理的。

本文链接:https://debug.fanzheng.org/post/why-not-hard-link-of-directory-in-linux.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。