【问题标题】:NFS + Hard Links?NFS + 硬链接?
【发布时间】:2013-03-30 00:43:33
【问题描述】:

我知道硬链接的一个条件是它们不能跨越文件系统。这是否适用于 NFS 挂载?鉴于以下目录结构,我是否能够在目录 A 中创建指向目录 B 中文件的硬链接?

/root
    /A
    /B  <-NFS mount

例如,我想运行ln /root/B/file.txt /root/A/linkedfile.txt

【问题讨论】:

    标签: nfs hardlink


    【解决方案1】:

    好吧,因为/B 是一个单独的文件系统(一个挂载的 NFS 文件系统),你不能在它和/A 之间建立硬链接,因为它们不在同一个文件系统上。

    这是因为硬链接不会复制 data 只将 pointer 的副本复制到该数据,因此它们必须位于相同的“地址空间”。

    【讨论】:

    • 硬链接和软链接在某种意义上都是指针。不同之处在于软链接存储目标文件系统路径的文本表示,而硬链接(因为它只是一个目录条目)仅存储目标的 inode 编号,因此必须与目标位于同一文件系统上链接本身所在的目录。
    • 我觉得不得不指出,硬链接的替代方案是符号链接。
    • 我要补充一点,目录中的文件名也只是指针。没有“原始文件”和“到该文件的硬链接”的概念——它们是一个对象的两个名称,而且没有一个名称是特殊的。和@JesseHallett,我有点不同意他们是替代品的想法;我认为最好只是说它们是不同的东西。
    【解决方案2】:

    最好先准确了解硬链接是什么。

    通常在类 unix 系统上,目录中的文件名指向一个 inode 编号——本质上是一个文件编号。 “硬链接”只是创建另一个具有相同 inode 编号的文件名。现在您必须使用指向相同编号文件的不同名称。

    但请注意,这两个名称之间并没有真正的直接联系。关系是 Name1 和 Name2 都将它们的 inode 编号设置为 12756 - 但没有什么可以说“我手中的这个东西是两个文件之间的链接”。它们只是共享一个 ID 号的两个数据库条目。您可以对共享 ID 号的文件名进行查询(很慢,因为您要遍历系统上的每个文件条目),但仅此而已。

    因此,创建“两个文件系统之间的硬链接”并没有任何意义——因为两个文件系统具有不同的编号方案(系统 1 上的 inode 1234 和系统 2 上的 1234 指向完全不同的文件),并且唯一需要存储的是名称+inodeNumber,没有什么可做的。

    【讨论】:

      猜你喜欢
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多