为什么 simlink 循环不是问题?

为什么 simlink 循环不是问题?

所以我了解到,禁止在文件夹上使用硬链接,以避免文件系统中出现无限循环。这似乎是个好主意!但为什么在文件夹上使用 simlink 创建无限循环不是问题呢?为什么系统可以处理 simlink 循环,但不能处理硬链接循环?

答案1

硬链接是指向文件系统硬数据块(inode)的指针的第二个副本,而符号链接(symlink)只是一个特殊文件,其中包含前往查看特定位置的指令(类似于 Web URL)。

如果不扫描整个文件系统元数据并查找指向相同底层数据块的对象,就不可能分辨出文件/文件夹的新硬链接之间的区别。

A符号链接另一方面,硬链接是一种特殊文件,带有一个标志,表示“我是指向文件系统位置的链接”。操作系统知道如何跟踪这些文件,但程序可以简单地说“只给我指向文件夹的文件”。硬链接不提供该选项,它文件夹,只是名称不同。

因此它们之间存在一些差异。

如果将其中一个硬链接重命名为文件,则另一个硬链接仍将指向 inode,从而指向文件/文件夹数据。

另一方面,由于符号链接只不过是一条“这里是一个地址,去那里看看”的指令,因此可以通过重命名原始文件或目录来完全使其无效。

复制目录结构时可以看到差异。

假设你有一个指向其自身父级的硬链接:

Folder A
|__Folder B

Folder B的硬链接Folder A。如果您跟踪该硬链接,那么您将Folder B永远看到其内部内容。不可能复制文件夹的全部内容,因为您将永远递归到其中。

Folder A
|__Folder B
   |__Folder B
      |__Folder B
         |__Folder B
            |__Folder B

工具可以扫描整个文件系统元数据以查看文件是否为重复的硬链接,但这并不是用户真正希望工具执行的操作。文件系统元数据可能是分布在大型磁盘上的数百万个文件指针,您肯定不希望一个简单的文件夹复制程序花几分钟扫描磁盘只是为了确定它是否可以复制目录中的 5 个文件夹。

另一方面,符号链接“仅仅”是一个包含指针的文件。

Folder A
|__(File pointer to) Folder B

因此,如果您尝试复制文件夹 A,则会得到Folder A一个文件,上面写着Go to the location of Folder A。复制例程可以立即看到符号链接是一个指向某个地方的特殊文件。它所要做的就是复制该文件,Folder A该文件Folder B是指向Folder A

相关内容