深色模式
硬链接与软链接
概述
硬链接和软链接最容易混的地方,是两者都像“另一个名字”,但它们指向的对象并不一样。硬链接更接近“给同一个文件内容再起一个目录项名字”,软链接则更接近“保存一段目标路径的快捷方式”。
只背命令参数不够,最好先把文件、路径、inode 之间的关系理顺。关系一清楚,为什么硬链接不能跨文件系统、为什么删除原文件后软链接会失效,也就顺了。
文件名和文件内容不是一回事
在类 Unix 文件系统里,目录项、文件名、inode、数据块并不是同一个层次。
可以先粗略理解成:
- 文件名:目录里给人看的名字
- inode:文件元数据和数据位置的索引
- 数据块:真正存内容的地方
也就是说,一个“文件”并不只是一个名字。名字更像入口,inode 才更接近系统内部真正追踪的对象。
什么是硬链接
硬链接本质上是:让多个目录项同时指向同一个 inode。
这意味着:
- 它们地位平等
- 没有谁是“原件”,谁是“快捷方式”
- 修改其中一个,看到的内容都会变化
例如:
sh
ln a.txt b.txt这之后 a.txt 和 b.txt 指向同一个 inode。对系统来说,它们更像同一个文件内容的两个名字。
什么是软链接
软链接也叫符号链接,通常可以理解为“保存目标路径的一种特殊文件”。
例如:
sh
ln -s a.txt b.txt这时 b.txt 不是和 a.txt 共用 inode,而是自己单独存在,只不过内容更像一条“去找 a.txt”的路径指令。
所以软链接更像快捷方式,而硬链接更像同一个对象的多入口。
两者最核心的区别
| 项目 | 硬链接 | 软链接 |
|---|---|---|
| 指向对象 | inode | 路径 |
| 是否可跨文件系统 | 通常不行 | 可以 |
| 是否可链接目录 | 通常不建议或受限 | 可以 |
| 删除原名字后是否失效 | 不会立刻失效 | 可能变成悬挂链接 |
这里最关键的一行,是“指向对象”不同。很多行为差异都从这里长出来。
为什么删除原文件后结果不同
硬链接
如果删除 a.txt,但 b.txt 仍然存在,只要还有目录项指向那个 inode,文件内容就还在。
因为系统关心的是引用计数,不是谁叫“原文件”。
软链接
如果删除被指向的目标路径,软链接通常就会变成悬挂链接。它自己还在,但再访问时会发现目标不存在。
这也是为什么 ls -l 看到软链接时,经常会显示:
text
b.txt -> a.txt它强调的就是“这是一条指向路径的关系”。
为什么硬链接不能随便跨文件系统
因为 inode 是文件系统内部对象。
一个文件系统里的 inode 编号,对另一个文件系统没有意义。所以硬链接通常不能跨分区、跨挂载点创建。
软链接只保存路径文本,不要求两边共享同一个 inode 空间,因此跨文件系统更灵活。
查看链接关系
可以用这些命令辅助观察:
查看 inode 号:
sh
ls -li创建硬链接:
sh
ln source.txt hard.txt创建软链接:
sh
ln -s source.txt soft.txt如果两个文件 inode 相同,通常就是硬链接关系;软链接则会有自己独立的 inode。
实际使用时怎么选
适合用硬链接的场景
- 需要多个名字指向同一份文件内容
- 希望删除某个路径后数据仍由其他名字继续保留
适合用软链接的场景
- 想做快捷入口
- 想跨目录、跨文件系统引用目标
- 想链接目录
日常开发里,软链接更常见。因为它更直观,也更适合做配置映射、版本切换和目录别名。
常见误区
以为硬链接有主次关系
没有严格主次。多个名字通常是平等指向同一 inode。
以为软链接保存的是目标文件内容
它保存的更像是目标路径信息,而不是目标本体。
看到文件大小就误判
软链接文件本身往往很小,因为它存的是路径;大小差异不代表目标内容大小变了。
