Linux 中的硬链接和符号链接

https://linux265.com/news/7471.html

类似 Windows 系统中的快捷方式,在 Linux 系统中它们叫链接,存在两种形式 ,一种是硬链接,一种是符号链接。通常,符号链接也被称为软链接,下面我们就介绍一下这两种链接。

硬链接

由于 Linux 下的文件是通过索引节点(Inode)来识别文件,在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都会给它分配一个编号,称为索引节点号。

硬链接就是指向同一个索引节点 inode 的链接,而一个 inode 节点可以存在任意数目的硬链接。在删除硬链接时,inode 节点上的数据并不会被删除。所以,要删除存在硬链接的文件的数据,除了删除文件本身,还必须删除该文件所有的硬链接。

举例说明:

首先我们通过 touch命令来创建一个文件 a.txt,然后通过 ln命令 创建 a.txt 的硬链接 a-link.txt,之后通过 ls命令 查看这两个文件的 inode 值,你会发现其 inode 值是一样的,命令如下:

[root@localhost~]# touch a.txt
[root@localhost~]# ln a.txt a-link.txt
[root@localhost~]# ls -i a.txt a-link.txt

ls -li 命令执行后,你会看到如下内容:

400746 -rw-r--r-- 2 root root        0 6月  18 06:47 a-link.txt
400746 -rw-r--r-- 2 root root        0 6月  18 06:47 a.txt

第一列 400746 就是 inode 值,两个文件的 inode 值是一致的,第三列是该文件存在的硬链接数,可以看到 a.txt 和 a-link.txt 显示都是 2。这里需要注意,在 Linux 系统中硬链接和源文件是无法区别的,两个文件具有相同的大小、创建时间等信息。其实它们就是拥有相同 inode 的文件,可以看成就是同一个文件,只是文件名不同。

这时候我们删掉文件 a.txt,看一下 inode 值是否依旧存在:

[root@localhost~]# rm a.txt
[root@localhost~]# ls -i a-link.txt

输出结果:

400746 a-link.txt

这时我们会看到,硬链接文件指向的 inode 值没有变化,依旧是400746。即便删除原来的 a.txt,也不会引起该文件指向的 inode 值发生变化。

所以,要删除存在硬链接文件,必须删除该文件及该文件存在的所有硬链接,这时才会真的删除该文件数据。

需要注意:

1、只有文件才可以创建硬链接,目录不可以创建。

2、硬链接只能在同一文件系统中文件创建,不能跨文件系统。

符号链接(软链接)

在 Linux 系统中,符号链接的使用更广泛。与硬链接不同,符号链接是一种专门的文件类型,符号链接通过文件名称来指向另一个文件,所以它不像硬链接一样和源文件有相同的inode值。符号链接的删除,并不影响源文件,但源文件删除后,符号链接就会失效。

举例说明:

首先,我们通过 touch命令 创建 b.txt 文件,之后通过 ln -s 命令来创建 b.txt 的软链接文件。

[root@localhost~]# touch b.txt
[root@localhost~]# ln -s b.txt b-link.txt

之后,我们通过 ls -li 命令来查看创建的文件,你会看到如下内容:

[root@localhost ~]# ls -li
400749 lrwxrwxrwx 1 root root        5 6月  18 08:06 b-link.txt -> b.txt
400748 -rw-r--r-- 1 root root        0 6月  18 08:06 b.txt

从结果上可以看出,两个文件的第一列 inode 值是不一样的,这说明符号链接和其指向的文件并不相同,而且从结果中可以很明确的看出 b-link.txt 是指向 b.txt 文件的,这点比硬链接直观。

我们来删除掉 b.txt 文件,验证一下符号链接文件是否有效:

[root@localhost~]# rm b.txt
[root@localhost~]# cat b-link.txt
cat: b-link.txt: 没有那个文件或目录

从上面的结果可以看出,删除 b.txt 源文件后,再查看 b-link.txt 文件,就会提示“没有那个文件或目录”,说明此时的符号链接文件 b-link.txt 已经无效了。

通过上面对硬链接和符号链接的介绍,大致可以归纳为以下对比:

特点硬链接符号链接
名称解析 较快,因为硬链接中高喊对链接对象的直接引用 较慢,符号链接包含链接对象的路径,因此,必须解析路径名称才可以找到链接的对象。
链接对象 链接对象必须存在才可以创建硬链接 链接对象不一定存在,不存在一样可以创建符号链接文件。
是否要求同一文件系统 要求在同一个文件系统中。 不要求,符号链接可以跨越不同的文件系统。
删除链接对象的要求 只有删除所有的硬链接才相当于删除文件。 无要求,删除链接对象后,使用符号链接会给出错误执行错误提示。

写在最后

通过本文,我们初步了解了硬链接和符号链接的区别。

在Linux系统中,符号链接比硬链接灵活很多,符号链接可以给任何类型文件系统中的文件创建符号链接,而硬链接不可以,符号链接可以很直观的看出那个是链接,那个是源文件,而硬件链接你分辨不出。

posted @ 2022-10-19 17:01  petercao  阅读(431)  评论(0编辑  收藏  举报