详解 Linux 系统硬链接和软链接

1、Linux 链接的概念

Linux 链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link,也称为软链接)。默认情况下,ln 命令产生硬链接。

硬链接

硬链接指通过索引节点来进行连接。在 Linux 的文件系统中,保存在磁盘分区中的文件,无论其是什么类型,都会给它分配一个编号,称为索引节点号(Inode Index)。在 Linux 中,多个文件名指向同一索引节点是允许的。通常,这种连接就是硬链接。

硬链接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬链接到重要文件,以防止“误删”的功能。其原因是,由于对应该文件的索引节点有一个以上的连接,只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,在 Linux 系统,要实现真正删除一个文件,要求与该文件相关的所有硬链接均被删除。

软链接

另外一种连接称之为符号链接(Symbolic Link),也叫软链接。软链接文件有类似于 Windows 的快捷方式。在符号链接中,文件实际上是一个特殊的文本文件,其中包含的有另一文件的位置信息。

2、硬链接/软链接实操

下面,我们通过一些实验,来验证 Linux 的硬链接和软链接的行为。

# 创建一个测试文件 file1
$ touch file1

# 创建 file1 的一个硬链接文件 file2
$ ln file1 file2

# 创建 file1 的一个符号链接文件 file3
$ ln -s file1 file3

# -i 参数显示文件的 inode 节点信息
$ ls -li
total 0
8504662 -rw-r--r--  2 docker staff 0 Oct 19 13:52 file1
8504662 -rw-r--r--  2 docker staff 0 Oct 19 13:52 file2
8504663 lrwxrwxrwx  1 docker staff 2 Oct 19 13:52 file3 -> file1

从上面的结果中可以看出,硬链接文件 file2 与原文件 file1 的 inode 节点相同(都是 8504662),然而符号链接文件的 inode 节点不同。

让我们继续测试。

# 向 file1 输入内容
$ echo "I am file1 file" >> file1

# 查看 file1 文件的内容
$ cat file1
I am file1 file

# 查看 file2 文件的内容
$ cat file2
I am file1 file

# 查看 file3 文件的内容
$ cat file3
I am file1 file

# 删除 file1 文件
$ rm -f file1

# 查看 file2 文件的内容
$ cat file2
I am file1 file

# 查看 file3 文件的内容
$ cat file3
cat: file3: No such file or directory

通过上面的测试可以看出:当删除原始文件 file1 后,硬链接 file2 不受影响,但是符号链接 file3 文件无效。

3、总结

根据上面的相关的测试,我们可以得出以下结论:

  • 删除符号链接 file3,对 file1 和 file2 无影响;
  • 删除硬链接 file2,对 file1 和 file3 也无影响;
  • 删除原文件 file1,对硬链接 file2 没有影响,但符号链接 file3 会失效;
  • 同时删除原文件 file1 和硬链接 file2,整个文件会真正的被删除。

全文完,感谢阅读!

分享