Linux 软连接和硬连接的区别?
· 3 min read
Linux 中有 2 种链接方式,理解它们的区别是掌握文件系统的基础:
-
硬链接:同一个文件,多个文件名(共用 inode),删除本体不影响其他链接
-
软链接(符号链接):快捷方式,存储路径指向原文件,删本体就失效
核心区别对比
| 特性 | 硬链接 | 软链接(符号链接) |
|---|---|---|
| inode | 相同(同一个文件) | 不同(新文件) |
| 跨分区 | ❌ 不能 | ✅ 可以 |
| 链接目录 | ❌ 不能 | ✅ 可以 |
| 删原文件 | ✅ 不受影响,内容仍在 | ❌ 失效变红,断链 |
| 文件大小 | 和原文件一致(但不占额外空间) | 很小(只存路径) |
| 相对/绝对路径 | 无路径概念 | 分绝对路径和相对路径 |
命令格式
# 硬链接
ln 源文件 链接名
# 软链接(常用)
ln -s 源文件 链接名
理解 inode
理解硬链接的关键是理解 Linux 文件系统的 inode:
- 每个文件都有一个唯一的 inode 编号
- inode 存储文件元数据:权限、大小、时间戳、数据块位置等
- 文件名只是 inode 的一个"别名"
- 硬链接就是给同一个 inode 增加一个别名
因此:
- 硬链接和原文件地位完全平等
- 删除任何一个文件名,文件内容仍然存在
- 只有当所有链接都被删除时,文件内容才会被真正删除
软链接原理
软链接是一个独立的文件,它的内容是另一个文件的路径:
- 读取软链接时,系统会自动跳转到指向的文件
- 如果原文件被删除或移动,软链接就"断链"了
- 软链接可以指向不存在的文件(悬空链接)
实战验证
最佳实践:用ls -li 查看 inode 编号和链接信息
# 创建测试文件
echo "hello" > test.txt
# 创建硬链接
ln test.txt hard-link
# 创建软链接
ln -s test.txt soft-link
# 查看 inode 编号(硬链接和原文件相同)
ls -li
输出示例:
12345 -rw-r--r-- 2 user group 6 May 20 10:00 hard-link
12345 -rw-r--r-- 2 user group 6 May 20 10:00 test.txt
12346 lrwxr-xr-x 1 user group 8 May 20 10:00 soft-link -> test.txt
注意:硬链接的链接数是 2,软链接的类型是 l。
常见使用场景
| 场景 | 推荐方式 |
|---|---|
| 同一文件多个入口 | 硬链接 |
| 快捷方式 | 软链接 |
| 跨分区链接 | 软链接 |
| 链接目录 | 软链接 |
| 库文件版本管理 | 软链接(如 libc.so.6 -> libc-2.31.so) |