| 特性 | 软连接(符号链接) | 硬连接 |
|---|---|---|
| 本质 | 指向另一个文件的路径的特殊文件 | 文件数据的另一个目录项(多个文件名指向同一inode) |
| inode | 有自己的独立inode | 与原文件共享同一个inode |
| 跨文件系统 | ✅ 可以 | ❌ 不可以 |
| 链接目录 | ✅ 可以 | ❌ 不可以 |
| 原文件删除后 | 变成悬空链接(失效) | 仍然可以访问数据 |
| 大小 | 存储路径字符串,很小 | 与原文件相同(不额外占用) |
| 创建命令 | ln -s 源文件 链接名 |
ln 源文件 链接名 |
| 文件类型标识 | l(ls -l 显示) |
-(普通文件) |
核心原理图解
bash
硬连接:
[inode 12345] ← 文件名A
← 文件名B (硬连接)
软连接:
[inode 11111] → 存储路径 "/path/to/target" → [inode 12345] ← 原文件名
[inode 22222] ← 软连接文件名
使用场景建议
软连接适合:
-
需要跨文件系统
-
链接目录
-
快捷方式、版本切换(如
python -> python3.11) -
需要明确知道原文件是否还存在
硬连接适合:
-
同一文件系统的备份/快照
-
需要防止误删除(类似引用计数保护)
-
节省磁盘空间的多个入口
注意事项
-
硬连接不能跨设备(不同分区/磁盘有不同的inode空间)
-
硬连接不能链接目录(防止循环引用和无限递归)
-
修改任一连接的内容,其他连接都会同步变化(指向同一份数据)
-
软连接可以形成循环(例如 A→B,B→A),需注意避免
-
软连接的目标路径 :建议使用绝对路径,避免移动后失效
快速验证示例
bash
# 创建原文件
echo "hello" > original.txt
# 创建硬连接和软连接
ln original.txt hardlink.txt
ln -s original.txt softlink.txt
# 查看 inode 信息
ls -li original.txt hardlink.txt softlink.txt
# 输出示例:
# 123456 -rw-r--r-- 2 user user 6 original.txt
# 123456 -rw-r--r-- 2 user user 6 hardlink.txt (相同 inode)
# 789012 lrwxrwxrwx 1 user user 12 softlink.txt -> original.txt
# 删除原文件
rm original.txt
# 硬连接仍可读取
cat hardlink.txt # 输出: hello
# 软连接失效
cat softlink.txt # 错误: No such file or directory