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

Lev*_*glu 37 filesystems hard-link symlink files

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

文件和硬链接有什么区别?硬链接指向一个inode,那么什么是文件呢?inode 条目本身?还是带有硬链接的 inode?

假设我用触摸创建了一个文件。然后,一个inode条目在创建inode表。我创建了一个硬链接,它与文件具有相同的 inode 编号。那么我创建了一个新文件吗?或者文件只是定义为一个inode?

Jör*_*tag 61

非常简短的回答是:

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

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

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

记住这个比喻,特别是记住 Unix 目录像现实世界的目录一样工作,不像现实世界的文件夹,这解释了新人经常遇到的许多“奇怪之处”,例如:为什么我可以删除我不知道的文件没有写权限?嗯,一方面,您不是删除文件,而是删除文件的许多可能名称之一,为此,您只需要对目录进行写访问,而不是对文件进行写访问。就像在现实世界中一样。

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

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

文件和硬链接之间的区别,就如同电话簿中您和您姓名的行之间的区别一样。

硬链接指向一个 inode,那么什么是文件?inode 条目本身?还是带有硬链接的 inode ?

文件是一段匿名的数据。就是这样。一个文件不是一个inode,一个文件一个inode,就像你不是社会安全号,你一个SSN。

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

比方说,我用 touch 创建了一个文件,然后在Inode Table 中创建了一个 Inode 条目。

是的。

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

不。硬链接没有 inode 编号,因为它不是文件。只有文件有 inode 编号。

硬链接将名称与 inode 编号相关联。

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

是的。

或者文件只是被定义为一个 Inode ?

不。文件有一个inode,它不是一个inode。

  • 我从未真正理解(或正确思考)“目录”一词背后的隐喻。电话簿的例子是一个很好的例子;也许你应该早点介绍它(当你第一次提到现实世界时)。同样,大多数人很少在计算机之外处理“文件”,所以也许说“就像纸质文件,目录就像电话簿”会更清楚。 (15认同)
  • @IMSoP 这是代沟。在计算机出现之前,电话簿是目录的一种。剑桥词典说:“**目录:** 一本列出姓名、地址或其他事实的书 [...示例] ***在电话簿中查找他们的号码。***” (3认同)
  • @kubanczyk 确实 - 对于在数字时代之前的办公室工作的人来说,我想这些比喻似乎很明显,以至于解释它们几乎是居高临下的感觉。但是对于我这一代及以下的人来说,就像为什么汽车后部的储物区被称为“行李箱”或“行李箱”一样晦涩难懂,因此您必须真正将其拼写出来。 (2认同)
  • 说一个文件*有*一个inode有点倒退。inode 是包含有关“数据块”在哪里的信息的结构。如果没有inode,就没有文件。 (2认同)

Gil*_*il' 18

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

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

将文件视为房间,将目录条目视为门。“打开文件/foo/bar”的意思是“去走廊/foo去房间bar”。“Go to room bar”真正的意思是“打开标记的门bar进入房间”,但“go to room bar”是用较短的方式说同样的事情的一种不起眼的方式。通向同一个房间的门可能不止一扇。

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

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

  • @n611x007:如果您有新问题或后续问题,请打开一个[新问题](/questions/ask)?评论部分不适合或不适合用于新问题或扩展讨论。谢谢。 (2认同)

cou*_*ode 8

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

软链接是一个真正的引用,即它是一个包含路径名的小文件。解析软链接对应用程序是透明的:如果一个进程打开一个文件,说/this/path/here哪个是指向的符号链接,/that/other/path那么整个打开处理/that/other/path由操作系统完成。此外,如果/that/other/path碰巧本身就是一个符号链接,那么这也由操作系统处理。事实上,操作系统遵循符号链接链,直到它找到其他东西(例如一个常规文件)或直到它到达SYMLOOP_MAX(参见sysconf(3))许多条目,在这种情况下,操作系统(更准确地说:相应的系统调用)返回一个错误并设置errnoELOOP。因此,像这样的循环引用xyz -> xyz不会停止进程。(对于 Linux 系统,请参阅path_resolution(7)完整的详细信息。)

请注意,进程可以通过使用来检查路径名是否是符号链接,lstat(2)并且可以通过lchown(2)和 其他(请参阅symlink(7)完整故事)修改其文件属性(存储在 inode 表中)。

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

硬链接和符号链接(又名软链接)之间的主要明显区别之一是符号链接跨文件系统工作,而硬链接仅限于一个文件系统。也就是说,分区 A 上的文件可以从分区 B 进行符号链接,但不能从那里进行硬链接。硬链接实际上是目录中的一个条目,它由文件名和 inode 编号组成,并且 inode 编号仅在每个文件系统中是唯一的,这一点很明显。

硬链接一词实际上有些误导。虽然对于符号链接,源和目标是明显可区分的(符号链接在 inode 表中有自己的条目),但对于硬链接则不然。如果您为文件创建硬链接,则原始条目和硬链接就首先存在的内容而言是无法区分的。(因为它们指的是同一个 inode,所以它们共享它们的文件属性,例如所有者、权限、时间戳等。)这导致声明每个目录条目实际上都是一个硬链接,而硬链接一个文件只是意味着创建第二个(或第三,或第四...)硬链接。事实上,每个 inode 都存储了一个计数器,用于记录到该 inode 的硬链接数。

最后,请注意普通用户可能不会硬链接目录。这是因为这必须非常谨慎:粗心的用户可能会将循环引入到其他严格分层的文件树中,所有常用工具(如fsck)和操作系统本身都没有准备好处理。


And*_*nle 6

一个简单的答案:

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

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