Linux 文件链接计数(Link Count)

Link Count(链接计数,又称 nlink)是 Linux 文件系统中 inode 的一个字段,记录有多少个目录项(dentry)指向该 inode

# 查看文件的 link count
[[stat-命令详解|stat]] 文件名
# 输出中 "Links: N" 即为 link count
Link Count含义
≥ 1有文件名指向该 inode(文件”活着”)
= 0无目录项指向该 inode(文件已被删除)

创建文件

创建一个新文件 →
  文件名 → inode #100
  link count = 1
echo hello > test.txt
[[stat-命令详解|stat]] test.txt   # Links: 1

创建硬链接

硬链接实质上是创建新的目录项指向同一个 inode,link count 递增:

ln test.txt link.txt →
  test.txt → inode #100
  link.txt → inode #100    ← 同一 inode
  link count = 2
ln test.txt hardlink.txt
[[stat-命令详解|stat]] test.txt    # Links: 2  (两个文件名都返回 2)

硬链接的限制

  • 只能在同一文件系统内创建(不能跨分区)
  • 不能对目录创建硬链接(... 除外,由内核自动管理)
  • 区别于符号链接(symlink),符号链接有自己的独立 inode

删除文件本质是 unlink() 系统调用——移除目录项,link count 减 1:

rm test.txt →
  link.txt → inode #100
  link count = 1   ← 减 1,但还有 link.txt 引用,数据保留
rm test.txt
cat hardlink.txt   # 内容还在!
[[stat-命令详解|stat]] hardlink.txt  # Links: 1

只有当 link count 归零 时,内核才回收 inode 和数据块。

这是磁盘空间不泄露排查中最关键的知识点:

1. 进程打开文件 open() → 内核额外增加 inode 引用
   link count = 1(从目录项)
   引用计数 = 2(目录项 + 进程句柄)

2. rm file.log(unlink)→ 移除目录项
   link count = 0
   引用计数 = 1(只剩进程句柄)→ inode 保留,数据块不释放!

3. 进程 close() 或进程终止 → 引用计数归零
   内核回收 inode 和数据块 → 空间释放 ✓

简而言之:link count 决定文件名是否可见,引用计数决定数据是否释放

要查找这类文件,使用 lsof+L1 参数:

lsof +L1 /挂载点

+L1 的含义正是:筛选 link count < 1(即 = 0)的文件

相关概念对比

概念作用关联
Link Count指向同一 inode 的目录项数量文件被删除时归零
Inode存储文件的元信息(权限、大小、位置)link count 是 inode 的字段
Dentry文件名 → inode 的映射关系目录项,unlink 后消失
文件描述符 (fd)进程对打开文件的引用即使 link count=0,fd 仍可读写
引用计数inode 活跃引用总数(目录项 + 进程 + 内核)归零时才真释放空间

相关笔记