Linux 软链接/硬链接/文件删除 终极底层总结
一、核心概念(先钉死身份)
| 类型 | 本质 | 关键特征 |
|---|---|---|
| 真实文件 | inode + 数据块(block) | 文件本体,存储实际内容和元数据 |
| 硬链接 | 目录项(entry):名字 → 同一个inode | 不是独立文件,只是给文件多一个“外号”,所有硬链接地位完全平等 |
| 软链接 | 独立文件(有自己的inode + block) | block内只存路径字符串,是“指向目标文件的纸条”,和源文件无直接inode关联 |
二、删除行为的底层逻辑
1. 删除硬链接
- 执行
rm 硬链接名 - 真实操作:仅删除当前目录中该硬链接的entry,inode链接计数(nlink)-1
- 影响:文件本体(inode+数据块)完全不动,其他硬链接正常使用
- 结论:删硬链接 = 少一个名字,文件本体毫发无伤
2. 删除“源文件”(本质也是硬链接)
- 执行
rm 源文件名 - 真实操作:和删除普通硬链接完全一致(仅删entry、nlink-1)
- 关键:Linux无“源文件”概念,所有硬链接平等,删任意一个都不影响本体
3. 删除软链接本身
- 执行
rm 软链接名 - 真实操作:删除该软链接的entry,回收软链接自身的inode+block
- 影响:目标文件(源文件)完全不受影响
- 结论:删软链接 = 只删“纸条”,源文件没事
4. 删除软链接指向的源文件
- 执行
rm 源文件名 - 真实操作:源文件entry被删 → nlink-1 → 若nlink=0且无进程打开,源文件被回收
- 影响:软链接仍存在,但变成“坏链/死链”(指向不存在的路径)
- 结论:源文件消失,软链接变成“指向空气”
三、删除的终极规则(核心中的核心)
- rm 永远只删目录项(entry),不直接删文件本体
- 文件真正删除的唯一条件:inode链接数(nlink)= 0 且无进程打开该文件
- 系统回收逻辑:满足上述条件时,内核才会释放inode和数据块(类似GC垃圾回收)
四、软/硬链接关键区别
- 硬链接:不是文件,只是目录项,删哪个都不影响本体,无法跨分区/指向目录
- 软链接:独立文件,只存路径,源文件删了就失效,可跨分区/指向目录
- rm的本质:修改目录内容(删entry),而非删除文件本体