inode耗尽是“No space left on device”的常见原因,需用df -i检查IUse%是否≥95%,尤其100%时确认问题;再逐级定位/var等高inode目录并安全清理小文件。

查 inode 占用率用 df -i
磁盘空间还有剩,但新建文件报 No space left on device,八成是 inode 耗尽了。直接运行 df -i 就能看每个挂载点的 inode 总数、已用数和使用百分比。注意不是 df -h——后者只显示空间,不反映 inode 状态。
常见错误是只查根目录:df -i /,但实际问题可能出在 /var 或 /home 这类独立挂载点上。建议先跑完整版 df -i,重点看 Use% 列超过 90% 的行。
定位哪些文件占用了大量 inode
inode 不够,说明小文件太多(比如日志碎片、邮件队列、session 文件)。用 find 配合 stat 或 ls -i 才能定位源头:
-
find /var/log -xdev -type f | head -10000 | xargs stat -c "%i %n" 2>/dev/null | sort -u | wc -l——粗略估算目录下有多少唯一 inode(-xdev防止跨挂载点) - 更准的做法是统计子目录级文件数:
find /var/log -xdev -type d | xargs -I {} sh -c 'echo "$(find {} -maxdepth 1 -type f | wc -l) {}"' | sort -nr | head -10 - 别漏掉隐藏文件:
find /tmp -xdev -name ".*" -type f | wc -l,尤其.cache或临时解压残留容易堆积
注意 /proc 和 /sys 不计入 df -i 统计
df -i 只反映真实文件系统(ext4/xfs 等)的 inode 状况。/proc、/sys、/dev 是虚拟文件系统,它们的“文件”不消耗磁盘 inode,所以即使这些目录里看起来有成千上万个条目,也不会导致 No space left on device。
误判常发生在:看到 ls /proc | wc -l 输出很大,就以为 inode 溢出。其实只要 df -i 里对应挂载点没红,就不用管 /proc 下的数量。
删除文件后 inode 仍不释放?可能是进程还开着 fd
执行 rm 后 df -i 不变,说明文件虽被 unlink,但仍有进程持有其文件描述符。这时得用 lsof +L1 查 link count 为 0 的文件——NAME 列带 (deleted) 的就是。
关键点在于:这类文件只有等对应进程退出或主动 close fd 才真正释放 inode。单纯 kill 进程不一定立即生效,有些服务(如 Java 应用)需显式触发 GC 或重启才能释放句柄。
别用 lsof | grep deleted——漏匹配且慢;必须用 lsof +L1 命令本身过滤机制。


















