硬链接和文件有什么区别?


37

硬链接被定义为一个指向一个inode。甲软链接,也称为符号链接,被定义为指向到另一条链路而无需硬链接的限制的独立文件。

文件和硬链接有什么区别?硬链接指向索引节点,那么文件是什么?索引节点条目本身?还是具有硬链接的索引节点?

假设我用触摸创建了一个文件。然后,一个inode条目在创建inode表。然后创建一个硬链接,该硬链接具有与文件相同的索引节点号。那我创建了一个新文件吗?还是只是将文件定义为inode?



7
@infixed确实不是,我问的是文件和硬链接的区别。
Levent Divilioglu

因此,我已取消删除我的原始答案,我认为该链接问题的答案也涵盖了我的原始答案。所以它仍然“完全不是”吗?

7
文件和硬链接之间的区别与您和电话簿中带有您姓名的行之间的区别相同。
约尔格W¯¯米塔格

Answers:


61

简短的答案是:

  • 文件是匿名数据
  • 硬链接是文件的名称
  • 符号链接是一个特殊文件,其内容是路径名

Unix的文件和目录恰好像文件和目录在现实世界(和喜欢在现实世界); Unix文件系统(在概念上)的结构如下:

  • 文件是匿名的数据块;它没有名称,只有一个数字(inode)
  • 目录是一种特殊的文件,其中包含名称到文件的映射(更具体地说是inode);由于目录只是文件,因此目录可以包含目录条目,这就是实现递归的方式(请注意,当引入Unix文件系统时,这一点都不明显,很多操作系统不允许目录包含目录然后)
  • 这些目录条目称为硬链接
  • 符号链接是另一种特殊的文件,其内容为路径名;该路径名被解释为另一个文件的名称
  • 其他种类的特殊文件是:套接字,fifos,块设备,字符设备

牢记这个隐喻,特别是要记住Unix目录的工作方式类似于真实目录,不像真实文件夹,这解释了新手经常遇到的许多“怪癖”,例如:为什么我要删除自己不喜欢的文件?没有写权限?好吧,对于您而言,您并不是要删除文件,而是要删除文件的许多可能名称之一,为此,您只需要对该目录进行写访问,而无需对该文件进行写访问。就像在现实世界中一样。

或者,为什么我会有悬挂的符号链接?好的,符号链接只包含一个路径名。没有什么可以说实际上必须有一个具有该名称的文件。

我的问题只是文件和硬链接有什么区别?

文件和硬链接之间的区别与您和电话簿中带有您的名字的行之间的区别相同。

硬链接指向一个索引节点,那么文件是什么?Inode条目本身?还是具有硬链接的Inode?

文件是匿名数据。而已。文件不是索引节点,文件具有索引节点,就像您不是社会安全号码一样,您具有SSN。

硬链接是文件的名称。一个文件可以有许多名称。

假设我创建了一个带触摸的文件,然后在Inode Table中创建了一个Inode条目。

是。

然后,我创建一个硬链接,该链接具有与文件相同的Inode编号。

否。硬链接没有索引节点号,因为它不是文件。只有文件具有索引节点号。

硬链接将名称与索引节点编号相关联。

那我创建了一个新文件吗?

是。

还是仅将文件定义为Inode?

否。该文件有一个索引节点,它不是索引节点。


15
我从不真正理解(或正确考虑)“目录”一词背后的隐喻。电话簿示例就是一个很好的例子。也许您应该更早地介绍它(当您第一次提到现实世界时)。同样,大多数人很少在计算机外部处理“文件”,因此说“就像纸质文件和目录如电话簿”也许更清晰。
IMSoP '17

2
@IMSoP这是代沟。在计算机之前,电话簿是目录的一种。剑桥词典说:“ 目录:给出名称,地址或其他事实列表的书[...示例] 在电话目录中查找其号码。
kubanczyk

2
@kubanczyk的确-对于在数字前办公室工作的人们,我认为隐喻是如此明显,以至于几乎可以解释这些隐喻。但是对于我们这一代及以下一代人来说,这就像为什么在汽车后部的存储区称为“行李箱”或“行李箱”一样晦涩难懂,因此您必须将其拼写清楚。
IMSoP '17

短语“硬链接没有inode编号”中的“具有”一词可能会引起误解,因为您随后会说“硬链接将名称与inode编号相关联”。“ hardlink”目录条目的数据结构实际上包含inode#-这是将链接与inode#“关联”的方式。所谓“没有”,我认为您的意思是硬链接没有inode#,它指示链接存储在磁盘上的位置。
开尔文

2
说一个文件一个索引节点有点倒退。索引节点是一种结构,其中包含有关“数据块”在何处的信息。如果没有索引节点,则没有文件。
Barmar '17

18

硬链接是目录条目。如果文件以不同的名称或不同的目录存在,则它可能具有多个目录条目。当目录条目与同一文件的其他目录条目关联时,该目录条目称为“硬链接”。

索引节点包含文件的元数据,而不是其名称和内容(内容的位置,权限,时间戳等)。每个文件有一个索引节点。(并非所有文件系统都将元数据放在磁盘上一个可清晰识别的空间中,您可以将其称为“ inode”,但这是一种常见的体系结构。)目录条目将名称链接到inode。可能有多个目录条目链接到同一索引节点,因此称为“链接”。这样的链接被称为“硬链接”,与“软链接”或“符号链接”相对,后者不说“为此名称,请使用此索引节点”,而是“对于此名称,请查找该其他名称”。

将文件视为房间,将目录条目视为门。“打开文件/foo/bar”的意思是“去走廊/foo去房间bar”。“去房间bar”实际上意味着“打开标记的门bar并进入房间”,但是“去房间bar”是用简短的方式说同样的话的平凡方式。通往同一个房间的门可能不止一个。

当您创建到现有文件的硬链接(ln existing new)时,您将在创建指向同一文件的第二个链接,即正在创建一个新目录条目,该目录条目链接到已经存在的文件。创建后,这两个目录条目具有相同的状态:没有一个是“主”目录,而没有一个是“辅助”目录,它们只是链接到同一文件。

您也可以删除指向文件的所有链接,而无需删除文件本身。如果在程序仍打开文件的情况下删除文件(即删除其所有目录条目),则会发生这种情况。该文件保留在文件系统上,只有在最后一个打开文件的进程关闭该文件时,它才会被真正删除。在“房间和门”的比喻中,没有门的房间仍会占用空间。


硬链接和软链接分别是什么时候首次引入的?
n611x007 '17

2
@ n611x007:如果您有新问题或后续问题,请问一个新问题?评论部分不适用于新问题或扩展讨论。谢谢。
David Foerster

1
@ n611x007硬链接早于Unix,v1拥有它们。Unix中的符号链接较新。维基百科有一些历史。
吉尔斯(Gillles)“所以-别再邪恶了”

房间和门是一个很好的类比!然后,符号链接就像门上的标志。
curiousdannii

1
@curiousdannii:符号链接更像是房间里坐着一个人,他们说“ oi m8错误的办公室去#234代替”
与莫妮卡的Lightness Races

8

除了所有其他答案,我还要指出以下重要属性:

软链接是真实的引用,即,它是一个包含路径名的小文件。解决软链接对应用程序是透明的:如果进程打开了一个文件,比如说/this/path/here它是一个符号链接,/that/other/path则指向该文件的所有操作/that/other/path都由操作系统完成。此外,如果/that/other/path碰巧本身就是一个符号链接,则OS也会对此进行处理。实际上,操作系统遵循符号链接链,直到找到其他内容(例如,常规文件)或到达SYMLOOP_MAX(参见sysconf(3))许多条目为止,在这种情况下,操作系统(更确切地说是:根据系统调用)返回错误并进行设置errnoELOOP。因此,类似的循环引用xyz -> xyz不会使过程停止。(对于Linux系统,请参阅path_resolution(7)以获取全部详细信息。)

请注意,进程可以通过使用lstat(2)和来检查路径名是否为符号链接,并且可以通过lchown(2)和其他方式修改其文件属性(存储在inode表中)(symlink(7)有关全部信息,请参见)。

现在,在权限方面,您会注意到符号链接始终具有权限777(rwxrwxrwx以符号表示)。这是由于以下事实:无论如何,可以通过访问实际文件来绕过任何其他权限。相反,如果最初不能访问符号链接文件,则777不能使该符号链接文件可访问。例如,具有权限777的符号链接指向具有权限640的文件不会使该文件不能被“其他”(公众)访问。换句话说,xyz当且仅当文件可以直接访问(即没有间接访问权限)时,才可以通过符号链接访问文件。因此,符号链接的权限没有任何安全影响。

硬链接和符号链接(又称软链接)之间的主要可见区别之一是,符号链接可跨文件系统工作,而硬链接则限于一个文件系统。即,可以将分区A上的文件从分区B符号链接到,但是不能从那里对其进行硬链接。从以下事实可以明显看出,硬链接实际上是目录中的一个条目,它由文件名和inode编号组成,并且inode编号仅在每个文件系统中都是唯一的。

术语“硬链接”实际上有点误导。尽管对于符号链接,源和目标可以明显地区分开(符号链接在inode表中有其自己的条目),但对于硬链接却不是这样。如果您为文件创建一个硬链接,则最初的条目和硬链接在先存在的内容上是无法区分的。(由于它们引用同一个索引节点,因此它们共享其文件属性,例如所有者,权限,时间戳等。)这导致以下声明:每个目录条目实际上都是硬链接,而硬链接文件仅意味着创建第二个(或第三或第四...)硬链接。实际上,每个索引节点都存储一个计数器,用于存储到该索引节点的硬链接数。

最后,请注意,普通用户可能不会硬链接目录。这是因为必须极其谨慎地执行此操作:粗心的用户可能将循环引入否则严格地分层的文件树中,而所有常规工具(如fsck)和OS本身都不准备处理这些循环。


6

一个简单的答案:

  • 目录中的文件条目是指向该文件的硬链接。

  • 某些文件具有多个这样的硬链接,因为允许到同一文件的多个硬链接。


3

在Unix的早期,内部文件是特定磁盘驱动器上的inode。文件名是一种更友好的访问方式。

硬链接为一个inode分配了多个文件名。您可以创建一个文件,将第二个名称硬链接至该文件,然后删除该第一个名称,这与仅以第二个名称创建文件完全没有区别。

确实,程序删除文件所需的系统调用是“ unlink(2)”。直到姓氏与索引节点解除链接,数据才会消失。(并且该inode未被某个进程打开)

这使Linux在仍运行程序的同时更轻松地进行升级。如果进程正在运行可执行文件,并且发生更新,则程序名称将被重用,但是包含旧版本的inode仍然存在,因此可以继续运行。当运行该旧版本的最后一个进程停止时,该旧版本的存储将被释放。

之所以产生软链接,是因为当您拥有一个具有多个安装点的单一文件树时,您无法从一个硬盘驱动器到另一个硬盘驱动器的inode建立硬链接。因此,发明了软链接。



2
early days为什么现在有什么不同?您的答案似乎并不能反映该观点?
n611x007 '02

@ n611x007因为诸如Linux之类的“当今”事物可以挂载不适合inode模型的非unix类型的文件系统。例如FAT衍生物和ISO-9660。这是一种更加多样化的文件系统生态系统,而不是一种适合所有人的文件系统
固定为

1

文件是写在磁盘上的数据。该数据由其inode引用,该inode包含有关文件的元数据,该文件告诉系统此文件使用了磁盘上的哪些块。硬链接指向此文件的索引节点号。

因此,从技术上讲,是的,您正在创建一个新文件,但是此文件包含的全部是它引用的文件的inode编号及其名称。最好将其视为创建指向索引节点的指针或指向文件的指针。


1

文件是关于文件系统中条目的广泛使用的概念。

通常它包括目录常规文件(硬链接)和符号链接(软链接)。甚至可能包括设备和插座。

我的问题只是文件和硬链接有什么区别?硬链接指向一个索引节点,那么文件是什么?Inode条目本身?还是具有硬链接的Inode?

假设我创建了一个带触摸的文件,然后在Inode表中创建了一个Inode条目。然后,我创建一个硬链接,该链接具有与文件相同的Inode编号。那我创建了一个新文件吗?还是仅将文件定义为Inode?

由于即使符号链接通常也被视为文件,因此硬链接本身也可以被视为文件。您可以说这是一个文件,无论它是硬链接还是软链接。

这个概念有点模棱两可,因此也可以说一个inode条目是一个文件,尽管您实际上可能想引用数据。

如果您是C ++或Java程序员,则可能需要阅读有关std :: filesystem :: file_typejava.io.Filejava.nio.file.Files的信息

有关硬链接和软链接之间差异的详细信息,请参见后缀注释中的链接。


1

具有给定名称的“文件”与“硬链接”之间的区别是历史之一。具有给定名称的(常规)文件是使用creat系统调用创建的,硬链接是使用链接系统调用创建的。

但是,当人们谈论并记住目录条目的历史并将它们分别称为文件和硬链接时,文件系统却没有。“原始文件”和“硬链接”的目录条目在质量上是完全无法区分的:两者都在文件名和文件的inode之间建立引用,并且一旦最后一个这样的引用消失(引用不只是用于以下内容的文件名)一个文件,也可以访问一个打开的文件的文件描述符。

因此,当人们对比“文件”和“硬链接”时,第一个以“链接计数为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.