Linux 硬链接与软链接
软链接和硬链接是可以在 Linux 系统上创建的两种类型的链接。在没有意识到的情况下,您无疑已经与自己系统上的大量硬链接进行了交互。而且,您很可能也遇到过一些软链接(也称为符号链接或符号链接)。这是因为您每天在系统上使用的文件要么是硬链接,要么是指向硬盘驱动器上数据的软链接。我们通常认为的“文件”实际上是一个inode,它指向我们硬盘上的一个数据块,而硬链接就是我们与其交互的方式。
另一方面,将软链接视为仅指向硬链接的“快捷方式”是有用的。硬链接和软链接都有自己的用例,前者是访问存储在硬盘驱动器上的索引节点的一种方式,后者主要用于方便的快捷方式。在本教程中,我们将解释 Linux 中的硬链接与软链接。您将了解它们之间有何不同、各自的用途以及如何创建和操作这两种类型的链接。让我们开始吧!
在本教程中您将学习:
什么是软链接?
什么是硬链接?
如何创建硬链接和软链接
如何删除/取消链接硬链接和软链接
硬链接和软链接——有什么区别?
为了充分理解硬链接和软链接的区别以及它们的用途,我们首先必须了解文件在Linux中是如何存储的。我们系统上的每个文件都有与之关联的元数据,例如创建、修改和访问时间以及文件权限等。此信息存储为inode。索引节点还包含有关文件内容在硬盘驱动器上的位置的数据。
索引节点的用途是记住文件数据的存储位置及其所有相关元数据。例如,文件系统使用此信息来了解与该文件关联的权限和文件所有权,以及在硬盘驱动器上访问该文件的数据块的位置。为了让用户能够访问inode,Linux系统为用户提供了硬链接。硬链接指向一个 inode。
Linux 上的另一种链接类型是软链接(或符号链接)。软链接仅指向硬链接,并为我们提供了一种从其他目录或通过不同名称访问硬链接的替代方法。它们实际上是捷径。硬链接和软链接都使用户能够通过多个名称和路径访问文件和目录。
创建硬链接
现在让我们看看如何在 Linux 上创建硬链接。
你知道吗?
硬链接不能跨不同的文件系统使用,并且不可能创建到目录的硬链接。
让我们首先创建一个简单的文件以在我们的示例中使用。以下命令在当前用户的主目录中创建一个名为
myfile.txt
的文件。它将包含文本“示例文本”。$ echo "sample text" > ~/myfile.txt
我们可以使用 cat 命令检查该文件的内容。请注意,我们通过
~/myfile.txt
访问该文件 - 这本身就是一个硬链接。$ cat ~/myfile.txt sample text
现在,让我们创建一个指向新文件的硬链接。这将是我们文件的第二个硬链接,因为在上述步骤中创建的它是第一个硬链接。我们将在系统的
/tmp
目录中创建一个名为myhardlink
的硬链接。将以下命令语法与ln
结合使用:$ ln ~/myfile.txt /tmp/myhardlink
现在,如果我们在
/tmp/myhardlink
硬链接上使用cat
命令,我们会发现我们得到的内容与打开~/myfile 的内容相同.txt
文件。$ cat /tmp/myhardlink sample text
接下来,让我们检查与这两个文件关联的链接信息(硬链接)。
$ ls -l /tmp/myhardlink -rw-rw-r-- 2 linuxconfig linuxconfig 14 May 8 20:20 /tmp/myhardlink $ ls -l ~/myfile.txt -rw-rw-r-- 2 linuxconfig linuxconfig 14 May 8 20:20 /home/linuxconfig/myfile.txt
请注意上面输出所示的关联数字 2。该数字表示与特定 inode 关联的硬链接数。
注意
此时,原始的~/myfile.txt
文件和我们在/tmp/hardlink创建的硬链接没有区别
。这些都是指向同一个 inode 的硬链接。我们可以使用典型的 rm 命令或使用
unlink
命令删除硬链接。$ unlink /tmp/myhardlink
再次检查文件链接信息,我们看到现在只有 1 硬链接与该 inode 关联。
$ ls -l ~/myfile.txt -rw-rw-r-- 1 linuxconfig linuxconfig 12 Jun 8 20:20 /home/linuxconfig/myfile.txt
现在我们可以使用 rm 命令来删除原始文件:
$ rm ~/myfile.txt
此时,指向原始文件内容的索引节点的链接丢失了,因此我们认为该文件已被删除。如果没有硬链接指向某个 inode,文件系统现在可能会用新数据覆盖该 inode 位置。
创建软链接
与硬链接相反,软链接能够跨文件系统,并且还可以创建目录的符号链接。然而,符号链接仅链接到现有的硬链接(文件或目录名),而不是索引节点。因此,如果符号链接指向的实际硬链接被删除,则符号链接就会损坏。
让我们再次创建一个可以使用的示例文件,以说明软链接的工作原理。让我们在当前用户的主目录中创建一个名为“mydir”的新目录,并在其中创建一个名为“myfile”的文件。
$ mkdir ~/mydir $ touch ~/mydir/myfile
接下来,我们将使用
ln
命令结合-s
选项创建现有目录mydir
的新符号链接。$ ln -s ~/mydir /tmp/symdir
现在,我们在
/tmp
目录中创建了一个名为symdir
的符号链接。我们看一下链接信息:$ ls -l /tmp/symdir lrwxrwxrwx 1 linuxconfig linuxconfig 23 Jun 8 20:34 /tmp/symdir -> /home/linuxconfig/mydir
请注意上述输出的第一个字符。在这种情况下,字符l表示我们正在处理符号链接。
注意
创建符号链接时,请记住,ln
命令将提供的实际路径存储为字符串。如果不在同一目录中,在许多情况下,您必须提供完整路径才能使符号链接正常工作新创建的
symdir
符号链接应包含先前创建的文件myfile
:$ cd /tmp/symdir $ ls myfile $ pwd /tmp/symdir
结束语
在本教程中,我们了解了硬链接和软链接之间的区别以及在 Linux 系统上的使用情况。我们还学习了如何创建硬链接和软链接,以及如何删除它们。结论是,虽然硬链接指向索引节点,但符号链接仅指向硬链接。为了完全删除文件(或至少将其标记为文件系统可覆盖),必须删除所有硬链接。