Rahul Sharma Asked: 2024-02-03 15:00:41 +0800 CST2024-02-03 15:00:41 +0800 CST 2024-02-03 15:00:41 +0800 CST 如果我们删除原始文件,为什么硬链接不会损坏?[复制] 772 如果我们删除原始文件,为什么硬链接不会损坏?如果我删除原始文件,那么软链接会损坏,但硬链接不会损坏,所以为什么它不会损坏 linux 3 个回答 Voted Jörg W Mittag 2024-02-04T01:07:15+08:002024-02-04T01:07:15+08:00 您似乎误解了Unix 中的硬链接和文件是什么。 Unix 文件系统的基础是文件。文件是非结构化的匿名字节流。文件没有名称。它只有一个文件序列号,基本上是一个唯一的(对于该文件系统)标识符。(文件序列号有时称为inode) 有几种不同类型的特殊文件由POSIX标准化: 设备特殊文件(进一步分为) 字符设备特殊文件 阻止特殊文件 FIFO特殊文件(命名管道) 套接字特殊文件 目录特殊文件 符号链接特殊文件 操作系统可以添加自己的特殊文件,例如Solaris有doors。 设备文件用于提供与设备交互的接口,例如传统上/dev/sda与第一硬盘交互的接口。FIFO 特殊文件的工作方式类似于 shell 管道,但由于它们有名称,因此读取和写入它们的两个进程可以在不同的时间和不同的安全上下文中启动。套接字允许类似于网络套接字的进程间通信,但仅限于本地计算机。 现在我们讨论与您的问题相关的两种特殊文件:目录和符号链接。 目录特殊文件实际上与现实生活中的目录非常相似。例如,考虑一下电话簿:它列出了人员的姓名及其电话号码。这正是 Unix 文件系统中目录的作用:它列出文件的名称及其文件序列号。 这种名称和文件序列号的配对就是我们所说的硬链接(或简称链接)。 当您在 Unix 中使用该rm实用程序“删除文件”时,您实际上并不是在“删除文件”。您正在从目录中删除该名称的条目,换句话说,您正在删除硬链接,而不是文件。这称为取消链接,实际上调用的rm是POSIX 库函数unlink。 所以,当你做类似的事情时 touch foo 您尚未创建名为 的文件foo。您创建了一个没有名称但具有某些特定文件序列号的文件,并且您已向当前目录添加了一个目录条目,该目录条目将该名称链接foo到您刚刚创建的文件的文件序列号。 现在,当您使用该ln实用程序创建第二个硬链接时: ln foo bar 您已在当前目录中创建了第二个目录条目,该条目将名称链接bar到所链接的同一文件序列号foo。 重要的是要认识到这两个链接都不是特殊的。它们是完全相同的。 如果您现在取消链接foo: rm foo 您所做的只是删除将名称链接foo到文件序列号的目录条目。您没有删除该文件。因此,您仍然可以使用该名称访问该文件bar,因为根本没有触及该目录条目。 事实上,在 Unix 中你不能删除文件。您只能删除链接。一旦文件不再有指向它的链接并且不再打开,文件系统本身就会删除该文件。 然而,符号链接是一个包含路径的特殊文件。即,当你这样做时 ln -s /path/to/quux baz 您实际上是将字符串/path/to/quux写入文件中。更准确地说,您正在使用内容创建一个符号链接特殊文件/path/to/quux ,并在当前目录中创建一个目录条目,该目录条目将名称baz与刚刚创建的文件的文件序列号链接起来。 /path/to/quux是否解析为文件序列号实际上并不重要。事实上,有些程序使用它来进行一些巧妙的配置。例如,fnord和gatting 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 层)。 将目录制作为特殊文件可以免费为您提供分层文件系统,而无需添加任何特殊结构。这是一个非常优雅的设计。 Best Answer Danila Vershinin 2024-02-03T15:32:59+08:002024-02-03T15:32:59+08:00 这是因为硬链接本质上是对同一文件的引用,并且就硬链接而言不存在“原始”文件。它们指向磁盘上相同的数据结构(包含文件所有元数据的索引节点)。 而软链接指向文件名而不是描述文件的数据结构。 shodanshok 2024-02-03T22:28:14+08:002024-02-03T22:28:14+08:00 在 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.txt,test.txt具有相同inode编号的 和 确实是同一文件 - 通过两个不同的名称引用。仅删除这两个名称之一并不会真正inode从文件系统中删除(取消链接),而另一个名称不受影响。 软链接是完全不同的东西 - 它不是到原始文件的真正链接,而是指向原始文件路径/名称的inode特殊小文件(有自己的不同) 。删除原始文件会留下损坏的(“损坏的”)指针。inode
您似乎误解了Unix 中的硬链接和文件是什么。
Unix 文件系统的基础是文件。文件是非结构化的匿名字节流。文件没有名称。它只有一个文件序列号,基本上是一个唯一的(对于该文件系统)标识符。(文件序列号有时称为inode)
有几种不同类型的特殊文件由POSIX标准化:
操作系统可以添加自己的特殊文件,例如Solaris有doors。
设备文件用于提供与设备交互的接口,例如传统上
/dev/sda
与第一硬盘交互的接口。FIFO 特殊文件的工作方式类似于 shell 管道,但由于它们有名称,因此读取和写入它们的两个进程可以在不同的时间和不同的安全上下文中启动。套接字允许类似于网络套接字的进程间通信,但仅限于本地计算机。现在我们讨论与您的问题相关的两种特殊文件:目录和符号链接。
目录特殊文件实际上与现实生活中的目录非常相似。例如,考虑一下电话簿:它列出了人员的姓名及其电话号码。这正是 Unix 文件系统中目录的作用:它列出文件的名称及其文件序列号。
这种名称和文件序列号的配对就是我们所说的硬链接(或简称链接)。
当您在 Unix 中使用该
rm
实用程序“删除文件”时,您实际上并不是在“删除文件”。您正在从目录中删除该名称的条目,换句话说,您正在删除硬链接,而不是文件。这称为取消链接,实际上调用的rm
是POSIX 库函数unlink
。所以,当你做类似的事情时
您尚未创建名为 的文件
foo
。您创建了一个没有名称但具有某些特定文件序列号的文件,并且您已向当前目录添加了一个目录条目,该目录条目将该名称链接foo
到您刚刚创建的文件的文件序列号。现在,当您使用该
ln
实用程序创建第二个硬链接时:您已在当前目录中创建了第二个目录条目,该条目将名称链接
bar
到所链接的同一文件序列号foo
。重要的是要认识到这两个链接都不是特殊的。它们是完全相同的。
如果您现在取消链接
foo
:您所做的只是删除将名称链接
foo
到文件序列号的目录条目。您没有删除该文件。因此,您仍然可以使用该名称访问该文件bar
,因为根本没有触及该目录条目。事实上,在 Unix 中你不能删除文件。您只能删除链接。一旦文件不再有指向它的链接并且不再打开,文件系统本身就会删除该文件。
然而,符号链接是一个包含路径的特殊文件。即,当你这样做时
您实际上是将字符串
/path/to/quux
写入文件中。更准确地说,您正在使用内容创建一个符号链接特殊文件/path/to/quux
,并在当前目录中创建一个目录条目,该目录条目将名称baz
与刚刚创建的文件的文件序列号链接起来。/path/to/quux
是否解析为文件序列号实际上并不重要。事实上,有些程序使用它来进行一些巧妙的配置。例如,fnord和gatting Web 服务器使用符号链接来表示 HTTP 重定向,因此当您这样做时:然后导航到
http://mydomain/search.html
会将您重定向到https://www.google.com/
。所以,简而言之:
因为你没有删除原来的文件。您仅删除了多个链接之一。无法再使用该特定名称访问该文件,但该文件仍然存在并且仍然可以使用其他名称访问。
再次强调,您并没有删除原始文件。您正在删除该名称。但符号链接指向名称而不是文件。因此,符号链接现在指向无法再解析为文件的名称。
旁注:您可能已经注意到一些有趣的事情:目录提供名称到文件的映射。但目录本身也是文件。因此,目录也会自动提供名称到目录的映射。
换句话说:目录在Unix中是可以任意嵌套的!
今天这听起来可能不太令人兴奋,因为广泛使用的每个文件系统都允许任意深度的嵌套层次结构。但近 60 年前 Unix 诞生时,情况完全不是这样。当时的一些文件系统要么根本没有目录,要么有固定的嵌套级别(例如 2 层)。
将目录制作为特殊文件可以免费为您提供分层文件系统,而无需添加任何特殊结构。这是一个非常优雅的设计。
这是因为硬链接本质上是对同一文件的引用,并且就硬链接而言不存在“原始”文件。它们指向磁盘上相同的数据结构(包含文件所有元数据的索引节点)。
而软链接指向文件名而不是描述文件的数据结构。
在 Linux 上,文件系统范围内唯一标识文件的是
inode
数字。这只不过是一个数字ID,保证在整个文件系统中是唯一的(注意:可以回收,但在同一文件系统中inodes
没有两个“活动”文件可以具有相同的)。inode
文件名只不过是附加在
inode
特定目录内的“方便标签”。硬链接文件只不过是在相同或不同的目录中添加另一个这样方便的名称(在第一种情况下,新的硬链接必须具有不同的名称)。您可以
inode
通过查看该号码ls -i
。例如:请注意
zzz.txt
,test.txt
具有相同inode
编号的 和 确实是同一文件 - 通过两个不同的名称引用。仅删除这两个名称之一并不会真正inode
从文件系统中删除(取消链接),而另一个名称不受影响。软链接是完全不同的东西 - 它不是到原始文件的真正链接,而是指向原始文件路径/名称的
inode
特殊小文件(有自己的不同) 。删除原始文件会留下损坏的(“损坏的”)指针。inode