在 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
这将使链接指向的目的地保持完整,只会删除软链接。
与硬链接不同,软链接可以在不同的文件系统之间交叉。
此外,软链接可以指向目录,但硬链接不能。