Linux中为什么硬链接不能指向目录

说法一:

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

说法二:

先假设可以:即现在你有目录/d1/d2和目录/d3/d4硬链接,都指向同一结点(inode),现在分别在两个目录(d2和d4)下进行cd ..

结果会是怎样呢?

也许你认为,它们有相同的结点,故他们应该指向同一父目录,这应该是d1,但对于d4,其父目录又是d3,于是问题就产生了,

这取决于d2和d4是哪个先创建的,这将会给目录结构造成混乱……

说法三:

直观理解是,如果允许硬链接指向目录,假设目录.../d1/...与.../d2/...互为硬链接,那么在d1下必然包含目录项“..”,试问这个“..”应该指向d1还是d2?

深层剖析如下:

linux系统中的硬连接有两个限制:不能跨越文件系统和不允许普通用户对目录作硬连接。至于第一个限制,很好理解,而第二个就不那么好理解了。我们对任何一个目录用ls -l 命令都可以看到其连接数至少是2,这也说明了系统中是存在硬连接的,而且命令ln -d 也可以让超级用户对目录作硬连接,这些都说明了系统限制对目录进行硬连接只是一个硬性规定,并不是逻辑上不允许或技术上的不可行。那么操作系统为什么要进行限制呢?答案可能有两个。

先来说第一个,如果引入了对目录的硬连接就有可能在目录中引入循环,那么在目录遍历的时候系统就会陷入无限循环当中。也许您会说,符号连接不也可以引入循环吗,那么为什么不限制目录的符号连接呢?原因就在于在linux系统中,每个文件(目录也是文件)都对应着一个inode结构,其中inode数据结构中包含了文件类型(目录,普通文件,符号连接文件等等)的信息,也就是说操作系统在遍历目录时可以判断出符号连接,既然可以判断出符号连接当然就可以采取一些措施来防范进入过大的循环了,系统在连续遇到8个符号连接后就停止遍历,这就是为什么对目录符号连接不会进入死循环的原因了。但是对于硬连接,由于操作系统中采用的数据结构和算法限制,目前是不能防范这种死循环的。

在说明第二个原因之前,我们先来看看文件的dentry结构在系统空间中长什么样子和它们是怎么存放在系统空间的。dentry结构主要包含了文件名,文件的inode 号,指向父目录dentry结构的指针和其他一些与本次讨论无关的指针,这里关键是那个指向父目录的指针;系统中所有的dentry结构都是按杂凑值存放在杂凑表中的,这里的杂凑算法很重要,它是取文件名和文件的父目录dentry结构的地址一起杂凑运算出杂凑值的。现在我们假设有两个目录 /a和/b,其中/b是我们通过ln -d命令建立起来的对/a的硬连接。这个时候内核空间中就会存在一个/a的dentry结构和一个/b的dentry结构,由上面的知识可知,/a和/b 目录下面的每一个文件或目录都各自有对应的dentry结构(因为虽然/a目录下面的文件名没有改变,但是因为dentry结构有指向父目录dentry 的指针和计算杂凑值时考虑了父目录dentry结构的地址,这个时候dentry结构就分身乏术了),而且这种继承还会影响到所有子目录下面的文件,这样下来就会浪费很多系统空间了,特别是如果被硬连接的目录中存在大量文件和子目录的时候就更加明显了。这也许是第二个原因。

(0)

相关推荐

  • Unix系统中的硬链接和软链接详解

    简单的说连接就是可以指向文件系统中其他位置的一个快捷方式,它非常有用,可以避免键入很长的路径名或cd深入到多个文件夹中,用过Windows系统桌面的程序图标其实就是一个快捷方式,大家也可以这么理解,不 ...

  • linux系统的硬链接和软连接

    linux系统有硬链接和软连接,都是由ln指令实现,他们有什么区别的,在这里我给大家解释一下 1.创建硬链接 01 创建文件a.txt并写入hello,用ln 指令创建硬链接b,查看b中的内容与a.t ...

  • 如何在win10电脑中建立硬链接软链接和符号链接

    我们想要在win10电脑中进行文件的链接功能,想要建立硬链接.软链接和符号链接该怎么操作呢?今天就跟大家介绍一下如何在win10电脑中建立硬链接软链接和符号链接的具体操作步骤.1. 首先打开电脑,点击 ...

  • LINUX怎么理解硬链接数的含义?

    LINUX里硬链接数的含义该怎么理解?今天我们就来详细介绍一下. 1.打开LINUX操作系统,可以使用UBUNTU. 2.找到左边任务栏的终端窗口并且打开. 3.改变为桌面目录,然后查看文件和目录的具 ...

  • 实例讲解Linux系统中硬链接与软链接的创建

    首先要弄清楚,在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号.文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存在,从而实现文 ...

  • 图解linux系统的软连接和硬链接

    我自己做的图片大家参考下: 软连接硬链接的区别: 硬连接指通过索引节点来进行的连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Ind ...

  • Linux命令详解:[6]硬链接与符号链接

    Linux系统在使用和维护过程中会常常发现符号链接和硬链接的概念,那么两者到底有什么区别,又如何才能创建文件与目录的符号链接和硬链接呢?下面小编就以CentOS6.4系统为例演示如何使用符号链接和硬链 ...

  • 硬链接和软链接的区别(什么是软连接和硬连接二者有何区别)

    什么是链接?链接简单说实际上是一种文件共享的方式,是 POSIX 中的概念,主流文件系统都支持链接文件.它是用来干什么的?你可以将链接简单地理解为 Windows 中常见的快捷方式(或是 OS X 中 ...

  • Linux中文件与目录对应的硬链接与软链接方式总结

    硬链接新建的文件是已经存在的文件的一个别名,当原文件删除时,新建的文件仍然可以使用.硬链接特征:1.拥有相同的 i节点 和相同的存储block快,可以看做是同一个文件2.可通过i节点识别,i节点号相同 ...