为什么在添加任何目录之前,新目录的硬链接计数为2?


38

说我只是创建目录newDirectory,然后执行ls -ld命令。我看到硬链接的数量是2。从一开始,究竟是什么使硬链接2真正实现?另外,当前目录中的子目录数是否等于硬链接数-2?


Answers:


39

从历史上看,第一个Unix文件系统在每个目录中创建两个条目:.指向目录本身,并..指向其父目录。这为应用程序和OS本身提供了遍历文件系统的简便方法。

因此,每个目录的链接计数为2 + n,其中n是子目录数。链接是该目录在其父目录中的.条目,目录本身的条目以及..每个子目录中的条目。例如,假设这是以/parent所有目录为根的子树的内容:

/parent
/parent/dir
/parent/dir/sub1
/parent/dir/sub2
/parent/dir/sub3

然后dir有5链接数:该dir条目/parent中,.在入口/parent/dir,三个..在每个条目/parent/dir/sub1/parent/dir/sub2/parent/dir/sub3。由于/parent/dir/sub1没有子目录,因此其链接数为2(中的sub1条目/parent/dir和中的.条目/parent/dir/sub1)。

为了最大程度地减少没有“适当”父级的根目录的特殊大小,根目录包含一个..指向自身的条目。这样,它的链接数也为2加上子目录的数量,2为/./..

后来的文件系统趋向于跟踪内存中的父目录,通常不需要.并且..作为实际条目存在。典型的现代UNIX系统将...作为特殊值,作为独立于文件系统类型的文件系统代码的一部分。即使磁盘上什么也没有,有些文件系统仍然包含...条目,或者假装成。

不管是否存在...条目,大多数文件系统仍然报告目录的链接数为2 + n ,但是也有例外,例如btrfs不会这样做。


4
..指向父目录不会影响当前目录的链接数。计数2来自,.目录的(原始)名称列出了自身。你把它的方式是有点模糊,使得它听起来像...是两个。..应该仅用于解释数学运算的原理2+n:)
th3an0maly

@ th3an0maly指向父级会影响父级的链接数。我真的不明白“每个子目录中的..条目”是如何模棱两可的,而且我也不理解“目录名本身列出”的含义。
吉尔斯(Gillles)“所以-别再邪恶了”

实际上,这个答案:unix.stackexchange.com/a/101516/160264正是我一直在暗示的内容。我读完您的答案后再阅读,因为您的答案是最高的。
th3an0maly

@ th3an0maly我还是不知道你在暗示什么。您能清楚地表达它,而不是暗示它吗?
吉尔斯(Gillles)“所以-别再邪恶了”

@goldilocks的答案很明确。我的意思是说,您的答案可能更像他的。但是那时我在读你的答案时还没有读过他的答案。第一行恰好是我最初的评论所说的:“目录本身有一个目录,目录.内部有一个目录。” 如果您仍然不清楚,很抱歉,我无法进一步澄清。我能做得更好的就是在评论中复制并粘贴他的答案。
th3an0maly

13

目录本身有一个,目录.内部有一个。

另外,当前目录中的子目录数是否等于硬链接数-2?

这是有道理的,因为每个子目录都会创建一个..硬链接,除此之外,您将无法创建到目录的硬链接。1 但是,对于任何严重的问题,我都不相信,尤其是。因为很容易计算子目录并获得实数。

如果您只是在查看ls输出以了解多少个子,那确实可以给您一个不错的想法。

1至少,您不能这样做ln。我没有尝试过编程,并且man 2 link是模糊的-有用于连接到一个目录中没有明显的错误,虽然有可能适用(一对夫妇EMLINKEPERM)。因此,除非有某个标准说某个目录唯一可能的硬链接是...,否则,我只会将该硬链接数视为偶然的线索。


2
是否允许目录链接以及是否可以从链接计数中计算子目录,都取决于您使用的是哪个文件系统-有些允许,有些则不允许。
alanc

请注意,macOS的Time Machine实际上将目录硬链接到以前的备份。这样,他们可以假装每个增量备份是完整副本,并且他们可以删除任何增量而不影响其他增量。它也非常脆弱,我使用常规的syscall玩它,并且彻底用软管清理了文件系统。
w00t
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.