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

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

A硬链接被定义为指向 inode 的指针。 A软链接,也称为符号链接,被定义为指向另一个链接的独立文件,不受硬链接的限制。

文件和硬链接有什么区别?硬链接指向一个inode,那么什么是文件呢? inode 条目本身?或者带有硬链接的索引节点?

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

答案1

非常简短的答案是:

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

Unix 文件和目录工作确切地就像现实世界中的文件和目录(以及不是喜欢文件夹在现实世界中);Unix 文件系统(概念上)结构如下:

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

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

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

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

文件和硬链接之间的区别就像您和电话簿中包含您姓名的行之间的区别一样。

硬链接指向一个inode,那么什么是文件呢?索引节点条目本身?或者带有硬链接的索引节点?

文件是一段匿名数据。就是这样。文件不是inode,而是文件一个索引节点,就像您不是社会安全号码一样,您SSN。

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

假设我用 touch 创建了一个文件,然后在中创建了一个 Inode 条目索引节点表

是的。

我创建了一个硬链接,它与文件具有相同的索引节点号。

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

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

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

是的。

或者文件只是定义为 Inode ?

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

答案2

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

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

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

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

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

答案3

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

软链接是真正的引用,即它是一个包含路径名的小文件。解析软链接对应用程序来说是透明的:如果一个进程打开一个文件,假设/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)修改其文件属性(存储在 inode 表中) (参见参考资料 的整个故事)。lchown(2)symlink(7)

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

硬链接和符号链接(又名软链接)之间的主要明显区别之一是符号链接跨文件系统工作,而硬链接仅限于一个文件系统。也就是说,分区 A 上的文件可以符号链接到分区 B,但不能从分区 B 进行硬链接。从以下事实可以清楚地看出这一点:硬链接实际上是目录中的一个条目,它由文件名和索引节点号组成,并且索引节点号仅针对每个文件系统是唯一的。

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

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

答案4

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

硬链接将多个文件名分配给一个 inode。您可以创建一个文件,将第二个名称硬链接到它并删除第一个名称,这与首先使用第二个名称创建文件没有什么区别。

事实上,程序删除文件需要使用的系统调用是“unlink(2)”。在姓氏与索引节点取消链接之前,数据不会消失。 (并且索引节点没有被某处的进程打开)

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

软链接的出现是因为当您拥有具有多个安装点的单一文件树时,您无法从一个硬盘驱动器到另一个硬盘驱动器上的索引节点建立硬链接。于是软链接就被发明了。

相关内容