为什么硬链接仅在同一文件系统内有效?


22

我正在阅读Mark Ba​​tes 撰写的命令行介绍

在第一章中,他提到硬链接不能跨越文件系统。

关于硬链接要注意的重要事项是它们仅在当前文件系统上有效。您不能在其他文件系统上创建到该文件的硬链接。为此,您需要使用符号链接,第1.4.3节。

我只知道一个文件系统。从root(/)开始的那个。硬链接不能跨越文件系统的说法对我来说没有意义。

Unix文件系统上的Wikipedia 文章也没有帮助。

Answers:


29

希望我能以一种对您有意义的方式回答这个问题。Linux中的文件系统通常由分区组成,该分区以存储文件的各种方式之一进行格式化(一定要选择!)。是您的系统文件,还是您的个人文件……它们都存储在文件系统中。您似乎已经了解了这一部分。

但是,如果您将硬盘驱动器划分为一个以上的分区(想将Apple Pie切成碎片),或者添加一个额外的硬盘驱动器(也许是USB记忆棒)怎么办?为了争辩,它们都还具有文件系统。

当您查看计算机上的文件时,您会看到分区文件系统上数据的直观表示。每个文件名都对应一个所谓的索引节点,它是您的数据在后台真正存在的地方。硬链接使您可以拥有多个“文件名”(由于缺乏更好的描述),它们指向同一索引节点。仅当这些硬链接位于同一文件系统上时,此方法才有效。而是使用符号链接指向“文件名”,然后将其链接到保存数据的索引节点。原谅我粗略的作品,但希望这可以更好地解释。

image.jpg             image2.jpg
          \           /
           [your data]

在这里,image.jpg和image2.jpg都直接指向您的数据。它们都是硬链接。然而...

image.jpg    <-----------  image2.jpg
           \ 
             [your data]

在这个(原始的)示例中,image2.jpg并不指向您的数据,而是指向image.jpg ...,这是指向您的数据的链接。

符号链接可以跨文件系统边界工作(假设已连接并安装了文件系统,如USB记忆棒)。但是,硬链接不能。它对其他文件系统上的内容或数据的存储位置一无所知。

希望这有助于更好地理解。


谢谢。我没有意识到不同的文件分区称为“文件系统”。
安东·帕拉斯

1
您可以对分区执行的操作之一是在其上放置文件系统,在其他位置可以放置文件系统,并且可以对分区执行其他操作,但是最常见的选择是该操作。
詹森

10
有一个文件层次结构以“ /”开头。这将有一个或多个文件系统安装
mpez0

@ mpez0:甚至没有,例如使用chroot(2)或真正的容器化,您可以具有多个层次结构,这些层次结构之间可能没有任何关系。
凯文

@Kevin chroot隔离了进程及其后代的一部分层次结构,但是父级仍然有一个完整的层次结构。容器化可以做到这一点,这取决于它与VM之间的距离。但是,一个评论可以包含多少细节?谢谢,
mpez0

23

文件系统是由目录条目来组织文件组成的目录结构组成。每个目录条目都将文件名与inode关联。

软链接符号)是不包含数据的目录条目,它仅指向另一个条目(同一文件系统或其他文件系统中的文件或目录)。并且当您删除指向的文件时,符号链接将变得不可用。

硬链接是包含文件名和索引节点号的目录条目 。删除最后一个硬链接后,将无法再访问该文件。

软链接和硬链接之间的区别

结论:

由于索引节点是用于表示文件系统对象的数据结构,因此它是文件系统的内部结构,您不能指向另一个文件系统的索引节点

从而, 硬链接仅在同一文件系统中有效,而软链接(符号链接)可以跨越文件系统,因为它们仅指向另一个目录条目(文件系统的接口,而不是内部对象)。


1
简洁明了的答案。
dubkat

如果另一个文件系统(例如USB)将具有一个具有相同名称的文件,并且该文件系统上的符号链接已连接到该文件上,将会怎样?
约瑟夫·克利穆克

@JosefKlimuk,假设一个软链接指向一个路径/mnt/myfile。如果将另一个文件系统挂载到中/mnt/。该软链接将解析为的已安装文件系统的条目/mnt/。因此,如果从USB设备在上安装了文件系统/mnt,则软链接将解析为该文件系统上的条目。
法肯多·维克多

2

根文件系统可以由几个文件系统组成。/usr/local可能安装在单独的分区上,/home也可能安装在网络磁盘上其他位置的另一个分区上。在这种情况下,/usr/local/bin/git(例如)的硬链接可能不会在外部创建/usr/local因为它会跨越文件系统

这样做的原因是,索引节点分别为分配//usr/local以及/home(再一次,在这个例子中),当您创建硬链接你真的只是做一个额外的名字一个inode。


2

硬链接可以保持目标不变。只要任何硬链接都可以访问,系统将确保不会释放其目标。因此,有必要在系统试图确定是否存在对特定索引节点的任何引用时,都安装所有可能包含指向特定索引节点的硬链接的介质。

鉴于inode的生存期通常是通过维护引用计数而不是扫描引用来确定的,因此有可能安排一些事情,使保持相互链接的两个或更多文件系统可以独立使用,前提是无需使用链接。在系统之间架起了桥梁,并提供了在任何一个上都不需要使用fsck的条件。但是,如果其中一个系统的inode计数受到干扰,则使该系统再次可用的唯一方法是使用fsck操作形式,该形式可以扫描两个文件系统以查找引用。由于该限制,虽然可能允许两个相互链接的文件系统独立使用,但这样做的好处可能太有限而无法使用。


很好,但是太切线了,不能成为一个好答案。

@Joe:允许硬链接到跨文件系统会带来很多技术难题,但是大多数难题都可以克服,因此引发了一个问题,即是否有令人信服的理由不应该这样做。保持连接的问题看似晦涩,但与其他问题不同,它只能通过对此类链接的使用施加严格的语义限制来解决,这将严重限制其价值。
超级猫

好点子。可以将文件系统挂载到另一台设备上并进行修改,因此inode和链接可能会“不同步”。每个文件系统都可以有一个GUID,并且链接可以合并该GUID以跟踪整个文件系统中的索引节点。FS上也可能存在某种日志,然后在挂载FS时,主机系统无需对其进行扫描,而只需读取日志并“追赶” inode链接更改(我们何时清除它,虽然?)。最重要的是,底层FS需要以不平凡的方式进行修改,并且只能在兼容的文件系统上工作。
罗尔夫

1

单个索引节点号用于表示每个文件系统中的文件。所有硬链接均基于索引节点号。文件系统参考链接在这里

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.