df -i 是唯一能查看全局 inode 使用率的命令,直接运行可显示各挂载点的 inode 总数、已用数、空闲数及使用百分比(iuse%),当任一挂载点 iuse% 达 100% 时将无法创建新文件。

df -i 是唯一能看全局 inode 使用率的命令
直接运行 df -i,它会列出所有挂载点的 inode 总数、已用数、空闲数和使用百分比(IUse% 列)。只要某个挂载点的 IUse% 达到 100%,哪怕 df -h 显示磁盘还有几十 GB 空间,也无法创建新文件。
常见误判点:
-
df -i默认包含tmpfs、devtmpfs等内存文件系统,它们的IUse%高是正常的,不用管 - 真正要盯的是实际存业务数据的挂载点,比如
/、/var、/home、/data - 如果只关心某个路径(如
/var/log),直接运行df -i /var/log—— 它会自动定位到该路径所在的真实挂载点,不是查目录本身
find + wc 是统计目录下文件总数最稳的方式
想确认一个目录到底占了多少 inode,本质就是统计它里面有多少个文件(含子目录里的)。别用 ls -a | wc -l:文件数超 10 万就容易崩,报 ls: memory exhausted 或卡死。
正确做法:
- 统计某目录下所有普通文件:
find /path -type f | wc -l - 统计所有文件+目录(即目录项总数):
find /path -maxdepth 1 -type f -o -type d | wc -l - 超大目录(百万级)防参数溢出:
find /path -type f -print0 | xargs -0 -n 10000 echo | wc -l
注意:find 默认递归,加 -maxdepth 1 才只算当前层;-xdev 可防止跨分区遍历(比如不进 /proc 或 /sys)。
用 find -xdev -printf '%h\n' 快速定位 inode 消耗大户
当 df -i 显示 /var 的 IUse% 是 98%,但你不知道是哪个子目录在撑爆 inode,就得按目录层级统计文件数。
推荐命令(以 /var 为例):
find /var -xdev -type d -printf '%h\n' | sort | uniq -c | sort -nr | head -10
这行命令的意思是:遍历 /var 下所有目录,打印每个文件的父目录路径,再按路径分组计数、倒序排,取前 10。输出类似:
42560 /var/log 18320 /var/cache/apt/archives 9742 /var/lib/docker/overlay2
关键点:
-
-xdev必须加,否则会误入其他挂载点(比如容器卷或 NFS) -
%h是父目录路径,不是当前目录名;想看当前目录名,改用%p并配合dirname处理 - 结果里数字大的,就是 inode 消耗主力,进去再用
find . -type f | wc -l确认
stat -f 查 inode 剩余绝对值,比 df -i 更准
df -i 的 IUse% 是四舍五入后的值,有时会误导。比如显示 100%,但其实还剩几百个 inode —— 因为 ext4 默认预留 5% 给 root 用户,普通用户看不到。
这时用 stat -f / 看原始数据更可靠:
- 关注
Inodes:和Inodes Free:两行(xfs 可能写成free inodes) - 差值就是已用 inode 数,没有百分比换算,也不受预留策略干扰
- 对比
df -i /的IUsed字段,若两者差几百,基本可断定是预留导致的“假满”
注意:stat -f 不支持通配符或相对路径,必须指定挂载点根路径(如 /、/var),不能写 /var/log。
真正难的不是查,而是区分“已删未释放”的 inode —— 进程还在读写已被 rm 的文件,df -i 会把它算作已用,但 find 找不到对应路径。这种情况得靠 lsof +L1 或检查 /proc/PID/fd/,不在常规统计路径里。











