目录符号链接到 inode,而不是路径(例如目录硬链接)

目录符号链接到 inode,而不是路径(例如目录硬链接)

我试图更好地理解为什么目录硬链接是不可能的。粗略地说,我认为目录和文件如下:

directory
---------
inode            # exposed as .
inode_of_parent  # exposed as ..
content: 
    mapping from names to inodes
    a hardlink is just another name->inode entry in the mapping

file
----
inode
content

我对目录符号链接的理解是它们类似于:

symlink
-------
inode            # exposed as .  but only if the symlink can be followed
inode_of_parent  # exposed as .. but only if the symlink can be followed
target:
   a named path that, effectively, points to another inode's content

值得注意的是,符号链接的目标不指向另一个 inode,因此它不会增加任何 inode 的链接计数。如果目标解析为无效,则符号链接就是无效的。

我读了为什么 UNIX/Linux 中不允许目录硬链接?这似乎主要取决于便利性(大概还有性能)。 [旁白:无论如何,“..”似乎有效地破坏了 DAG 结构,但我猜它是以一种可预测的方式这样做的,硬链接会使事情变得更加复杂。] 关于这个问题的一些评论表明,它可以处理循环,但为了讨论的目的,我愿意接受我们想要避免它们。鉴于此,那么为什么不能有一种不同类型的符号链接来指向 inode:

alternative symlink
-------------------
inode            # exposed as .
inode_of_parent  # exposed as ..
inode_of_target
is_symlink       # this marks it as special and distinct from a directory

该符号链接必须增加目标的链接计数,这使得它对于目标的移动和重命名具有鲁棒性。所以它基本上是一个硬链接,但由于其特殊的标志,它永远不会被混淆为真正的目录,因此不会引起循环问题。情况似乎是可以控制的。

显然,这未免太简单了。所以我想知道为什么这是不可能的。可能我讲的故事不够复杂,所以请根据需要将其复杂化。

相关内容