如果我们删除原始文件,为什么硬链接不会损坏?

如果我们删除原始文件,为什么硬链接不会损坏?

如果我们删除原始文件,为什么硬链接不会损坏?如果我删除原始文件,那么软链接会损坏,但硬链接不会损坏,所以为什么它不会损坏

答案1

你似乎误解了什么是硬链接和一个文件是在 Unix 中。

Unix 文件系统的基础是文件。 A文件是一个非结构化的匿名的字节流。一份文件没有名字。它只有一个文件序列号,基本上是一个唯一的(对于该文件系统)标识符。 (文件序列号有时称为索引节点

有几种不同的类型特殊文件其标准化程度为POSIX:

操作系统可以添加自己类型的特殊文件,例如,索拉里斯

设备文件用于提供与设备交互的接口,例如传统上/dev/sda与第一硬盘交互的接口。 FIFO 特殊文件的工作方式类似于 shell 管道,但由于它们有名称,因此读取和写入它们的两个进程可以在不同的时间和不同的安全上下文中启动。套接字允许类似于网络套接字的进程间通信,但仅限于本地计算机。

现在我们来讨论与您的问题相关的两种特殊文件:目录和符号链接。

目录特殊文件实际上与现实生活中的目录非常相似。例如,考虑一下电话簿:它列出了人员的姓名及其电话号码。这正是 Unix 文件系统中目录的作用:它列出文件的名称及其文件序列号。

名称和文件序列号配对就是我们所说的硬链接(要不就关联

当你在 Unix 中使用“删除文件”时实用rm程序, 你是不是实际上是“删除文件”。您正在删除目录中该名称的条目,换句话说,你是删除硬链接,而不是文件。这就是所谓的取消链接事实上,所使用的 POSIX 库函数rm被称为unlink

所以,当你做类似的事情时

touch foo

你有不是创建了一个名为foo.您创建了一个没有名称但具有特定文件序列号的文件您已在当前目录中添加了一个目录条目,该目录条目将名称链接foo到刚刚创建的文件的文件序列号。

现在,当你使用实用ln程序创建一个第二硬链接:

ln foo bar

你已经创建了一个第二当前目录中的目录条目,该目录条目将名称链接到所链接的bar同一文件序列号。foo

重要的是要认识到这两个链接都不是特殊的。它们是完全相同的。

如果您现在取消链接foo

rm foo

foo您所做的只是删除将名称链接到文件序列号的目录条目。你做到了不是删除该文件。因此,您仍然可以使用该名称访问该文件,bar因为根本没有触及该目录条目。

事实上,你不能删除 Unix 中的文件。您只能删除链接。一旦文件不再有指向它的链接并且不再打开,文件系统本身就会删除该文件。

A符号链接然而,这是一个特殊文件,其中包含小路。即,当你这样做时

ln -s /path/to/quux baz

你是字面上地将字符串写入/path/to/quux文件。更准确地说,您正在创建一个包含以下内容的符号链接特殊文件/path/to/quux 您正在当前目录中创建一个目录条目,该目录条目将名称baz与刚刚创建的文件的文件序列号链接起来。

/path/to/quux是否解析为文件序列号实际上并不重要。事实上,有些程序使用它来进行一些巧妙的配置。例如,福诺德加特林Web 服务器使用符号链接来表示 HTTP 重定向,因此当您这样做时:

ln -s https://www.google.com/ /var/www/search.html

然后导航到http://mydomain/search.html会将您重定向到https://www.google.com/

所以,简而言之:

如果我们删除原始文件,为什么硬链接不会损坏?

因为你没有删除原来的文件。您仅删除了多个链接之一。无法再使用该特定名称访问该文件,但该文件仍然存在并且仍然可以使用其他名称访问。

如果我删除原始文件,那么 sorflink 就会损坏

再次强调,您并没有删除原始文件。您正在删除姓名。但符号链接指向姓名而不是文件。因此,符号链接现在指向无法再解析为文件的名称。


旁注:您可能已经注意到一些有趣的事情:目录提供名称到文件的映射。但目录本身也是文件。因此,目录也会自动提供名称到目录的映射。

换句话说:目录在Unix中是可以任意嵌套的!

今天这听起来可能不太令人兴奋,因为广泛使用的每个文件系统都允许任意深度的嵌套层次结构。但近 60 年前 Unix 诞生时,情况完全不是这样。当时的一些文件系统要么根本没有目录,要么有固定的嵌套级别(例如 2 层)。

将目录制作为特殊文件可以免费为您提供分层文件系统,而无需添加任何特殊结构。这是一个非常优雅的设计。

答案2

这是因为硬链接本质上是对同一文件的引用,并且就硬链接而言不存在“原始”文件。它们指向磁盘上相同的数据结构(包含文件所有元数据的索引节点)。

而软链接指向文件名而不是描述文件的数据结构。

答案3

在 Linux 上,文件系统范围内唯一标识文件的是inode数字。这只不过是一个数字ID,保证在整个文件系统中是唯一的(注意:inodes可以回收,但inode在同一文件系统中没有两个“活动”文件可以具有相同的)。

文件名只不过是附加inode在特定目录内的“方便标签”。硬链接文件只不过是添加其他在相同或不同的目录中使用这样方便的名称(在第一种情况下,新的硬链接必须具有不同的名称)。

您可以inode通过查看该号码ls -i。例如:

# ls -alni
total 4
 68329917 drwxr-xr-x.  2 1000 1000   37 Feb  3 15:25 .
101396179 drwx------. 25 1000 1000 4096 Feb  3 15:24 ..
 68329918 -rw-r--r--.  2 1000 1000    0 Feb  3 15:25 test.txt
 68329918 -rw-r--r--.  2 1000 1000    0 Feb  3 15:25 zzz.txt

请注意zzz.txttest.txt具有相同的inode数字,实际上是相同的文件 - 通过两个不同的名称引用。仅删除这两个名称之一并不会真正inode从文件系统中删除(取消链接),而另一个名称不受影响。

A软链接是完全不同的东西 - 它不是原始文件的真正链接,而是指向原始文件的inode特殊小文件(有其自己的不同)inode路径/名称。删除原始文件会留下损坏的(“损坏的”)指针。

相关内容