硬链接数在ls -l输出的第二列,是inode引用计数,反映指向同一inode的目录项数量;它随硬链接创建/删除动态变化,归零时内核才释放资源。

硬链接数就藏在 ls -l 输出的第二列里,不是文件大小,也不是权限位 —— 它是那个紧挨着权限字符串、看起来像数字的字段。
硬链接数在哪看:ls -l 第二列就是它
执行 ls -l filename,输出形如:
rw-r--r-- 3 chenkc chenkc 568 Apr 24 21:34 hello.txt
其中 3 就是硬链接数(link count),表示当前有 3 个硬链接指向这个文件的 inode。这个数字会随着你用 ln 创建或 rm 删除硬链接而动态变化。
- 新建一个硬链接后,该数字 +1;删除一个硬链接(包括原文件名),该数字 -1
- 当它降到 0 时,内核才真正释放磁盘空间和 inode
- 目录的硬链接数至少为 2(
.和上层目录里的目录项),每多一个子目录,该数字 +1(因为子目录的..也会指向它)
为什么 ls -l 第五列不是硬链接数
很多人误把第五列(比如上面的 568)当成硬链接数,其实那是文件大小(字节)。硬链接共享内容和 inode,所以所有硬链接的大小完全一致 —— 它们根本不是独立副本。
- 硬链接之间没有“主从”关系,
hello.txt和hardlink_hello.txt地位完全平等 - 删掉其中一个,只要硬链接数 > 0,内容就还在,其他链接仍可读写
- 用
ls -i可验证:所有硬链接显示相同的 inode 号,但ls -l第五列永远只反映内容长度
硬链接数为 1 却删不掉文件?可能踩了这些坑
即使 ls -l 显示硬链接数为 1,文件也可能删不掉或删了还占空间 —— 常见原因:
- 文件正被某个进程打开(如 tail -f、vim 编辑中、程序 mmap),内核会维持引用,直到进程关闭 fd
- 挂载点下有未卸载的 bind mount 或 overlayfs 层,可能隐藏额外引用
- 使用了 btrfs/zfs 等支持快照的文件系统,快照会保留对旧版本 inode 的引用,影响硬链接数归零逻辑
-
rm只是解除目录项链接,若还有 open fd,磁盘块不会立即回收 —— 用lsof +L1可查“已删除但仍有句柄打开”的文件
硬链接数本质是 inode 引用计数,它不体现路径数量,也不代表“谁创建了谁”。真正容易被忽略的是:**它和进程打开状态、文件系统特性深度耦合,单看 ls -l 第二列永远只是当前目录视角的快照,不是全局终态。**











