Linux 链接概念
Linux 系统中的链接主要分为两种:硬链接(Hard Link)和符号链接(Symbolic Link,又称软链接)。默认情况下,ln 命令创建的是硬链接。
硬链接
硬链接是通过文件的索引节点(Inode)来建立的连接。在 Linux 文件系统中,每个存储在磁盘分区上的文件(无论类型)都会被分配一个唯一的编号,称为索引节点号(Inode Index)。硬链接的本质是让多个不同的文件名指向同一个索引节点。
硬链接的主要作用是允许一个文件拥有多个有效的路径名。这样,用户可以为重要文件创建硬链接,起到一定的“防误删”作用。因为只要还有一个硬链接存在,该索引节点和文件的数据块就不会被释放。只有当指向某个索引节点的所有硬链接都被删除后,文件所占用的存储空间才会真正被系统回收。
软链接(符号链接)
软链接,也称为符号链接,其功能类似于 Windows 系统中的“快捷方式”。软链接本身是一个独立的特殊文件,其内容存储的是目标文件的路径信息(一个文本字符串)。
通过实验加深理解
首先,我们创建测试文件并建立链接:
touch f1 # 创建一个测试文件 f1
ln f1 f2 # 为 f1 创建一个硬链接 f2
ln -s f1 f3 # 为 f1 创建一个符号链接(软链接) f3
然后,使用 ls -li 命令查看文件的详细信息,其中 -i 选项用于显示索引节点号:
ls -li
# 输出示例:
# total 0
# 9797648 -rw-r--r-- 2 user group 0 Apr 21 08:11 f1
# 9797648 -rw-r--r-- 2 user group 0 Apr 21 08:11 f2
# 9797649 lrwxrwxrwx 1 user group 2 Apr 21 08:11 f3 -> f1
从输出可以看出:
- 文件
f1和硬链接f2拥有相同的索引节点号(9797648),并且链接计数(权限后的数字)为 2。 - 符号链接
f3拥有不同的索引节点号(9797649),文件类型标记为l(link),并明确指向f1。
接下来,通过实际操作演示软硬链接的特性:
echo "I am f1 file" >> f1 # 向原始文件 f1 写入内容
cat f1 # 输出: I am f1 file
cat f2 # 输出: I am f1 file
cat f3 # 输出: I am f1 file
rm -f f1 # 删除原始文件 f1
cat f2 # 输出: I am f1 file (硬链接依然有效,数据未丢失)
cat f3 # 输出: cat: f3: No such file or directory (软链接因目标消失而失效)
总结
通过以上实验,我们可以得出以下结论:
- 删除符号链接(
f3),对原始文件(f1)和硬链接(f2)没有任何影响。 - 删除硬链接(
f2),只会减少原始文件(f1)的链接计数,对f1和符号链接f3本身无影响。 - 删除原始文件(
f1),硬链接(f2)仍然可以正常访问文件数据,但符号链接(f3)会因指向的目标不存在而失效(“断链”)。 - 只有当指向某个文件数据块的所有硬链接(包括最初的原始文件名)都被删除后,该文件占用的磁盘空间才会被系统真正释放。
简单来说,硬链接是同一个文件的多个别名,共享同一份数据;而软链接则是一个独立的“路径指针”,指向另一个文件或目录,如果目标被移动或删除,链接就会失效。