Linux创建硬链接和软链接

在 Linux 中,链接允许我们使用不同的源链接来引用目标文件。
当链接被访问时,我们被重定向到定义的目标。

创建硬链接和软链接

在这些示例中,我们将处理两种类型的链接,软链接和硬链接。
我们将使用“ln”命令来创建这两种类型的链接。

硬链接

文件系统上的每个文件本质上都是一个指向 inode 的硬链接。
inode(索引节点)是描述对象的数据结构,例如文件或者目录。
inode 存储对象的实际数据,而硬链接实际上指向 inode。

例如,如果我们创建一个新文件:

[jack@onitroad ~]# echo "testing" > /root/testing

文件“/root/testing”已经创建,本质上是一个指向包含“testing”字符串的inode的硬链接。

创建一个新的硬链接会使另一个对象指向同一个 inode。
我们可以有多个指向一个 inode 的硬链接,只要一个硬链接仍然存在,实际文件就会保留在文件系统上。

此示例使用“ln”命令创建新的硬链接。

[jack@onitroad ~]# ln /root/testing /root/hardlink

文件 /root/hardlink 指向与 /root/testing 相同的 inode,这就是为什么它只是在文件系统上显示为另一个文件:

[jack@onitroad ~]# ls -la /root
-rw-r--r--.  2 root  root       8 Jan 13 07:05 hardlink
-rw-r--r--.  2 root  root       8 Jan 13 07:05 testing

请注意用户和组所有权之前的“2”,这是指该文件有两个硬链接到它的事实,因为现在两者都指向同一个 inode。

我们可以通过查看硬链接的内容来确认这一点:

[jack@onitroad ~]#  cat /root/hardlink
testing

如果我们删除原始的 /root/testing 文件,数据仍然可以通过 /root/hardlink 访问

[jack@onitroad ~]# rm -f /root/testing
[jack@onitroad ~]# ls -la /root/hardlink
-rw-r--r--. 1 root root 8 Jan 13 07:05 /root/hardlink

现在 /root/testing 被删除了,之前的 '2' 现在是 '1',因为 /root/hardlink 是包含字符串 'testing' 的 inode 的唯一硬链接。
如果我们删除最后一个链接,数据将被删除。

由于硬链接指向相同的原始数据,如果我们通过硬链接编辑文件的内容,然后尝试通过不同的硬链接编辑文件,第一次编辑的更改将在那里,我们不会复制像使用 'cp' 命令一样,我们多次链接到磁盘上的同一位置。

硬链接只能在同一个文件系统上工作,不可能在一个文件系统上创建一个到另一个文件系统上的硬链接。
然而,这可以通过符号链接实现。

软链接

虽然硬链接指向直接 inode,但软链接(也称为符号链接或者简称为符号链接)仅用作重定向。
如果我们打开软链接,我们将被重定向到软链接指向的位置。
该链接独立于它指向的文件存在。
如果原始文件被删除,该链接将仍然存在,尽管指向一个不再存在的位置。
同样,如果删除软链接,也不影响链接指向的文件。

以下示例显示如何使用“ln”命令创建软链接。
语法几乎与前面显示的硬链接示例相同,除了使用“-s”标志来指定这是一个符号链接,而不是默认的硬链接。

在这个例子中,我们将创建一个到我们之前的硬链接的软链接,尽管我们现在知道硬链接本质上是 Linux 文件系统上的一个普通文件。

[jack@onitroad ~]# ln -s /root/hardlink /root/softlink

现在让我们看看我们创建了什么:

[jack@onitroad ~]# ls -la /root/softlink
lrwxrwxrwx. 1 root root 14 Jan 13 07:11 /root/softlink -> /root/hardlink

我们可以看到 /root/softlink 已经创建,重定向可以通过“->”箭头符号来标识,在这种情况下,它指向底层文件 /root/hardlink。

现在,如果我们尝试访问软链接,我们应该检索我们之前在硬链接部分中使用 echo 命令创建的内容。

[jack@onitroad ~]# cat /root/softlink
testing

成功!这是我们在创建硬链接之前最初在 /root/testing 文件中创建的文本(本质上只是对包含字符串“testing”的实际 inode 的另一个引用)。

这是我们迄今为止在图表中所做的:

如果我们移动或者重命名硬链接,它仍将指向包含字符串的 inode 并且可以访问,但是软链接将失败,因为它指向文件的名称“/root/hardlink”而不是 inode .

同样,如果我们删除软链接指向的文件,软链接仍然存在,但是内容已经消失,因此尝试通过软链接访问目的地失败:

[jack@onitroad ~]# rm -f /root/hardlink
[jack@onitroad ~]# ls -la /root/softlink
lrwxrwxrwx. 1 root root 14 Jan 13 07:18 /root/softlink -> /root/hardlink
[jack@onitroad ~]# cat /root/softlink
cat: /root/softlink: No such file or directory

我们还可以在不影响其指向的文件的情况下,对软链接进行整理和删除,如下所示:

[jack@onitroad ~]# rm /root/softlink
rm: remove symbolic link ‘/root/softlink’? y

这将使链接指向的目的地保持完整,只会删除软链接。

与硬链接不同,软链接可以在不同的文件系统之间交叉。
此外,软链接可以指向目录,但硬链接不能。

日期:2020-07-07 20:56:47 来源:oir作者:oir