inode耗尽会直接触发“No space left on device”错误,即使磁盘可用空间依然充足;可通过df -i查看各磁盘分区的inode使用率,重点排查/var/log、/tmp等小文件密集目录,并结合find命令进一步定位inode占用过高的子目录。

明明磁盘空间还有几十 GB,却提示 No space left on device?这种情况大多数并不是磁盘容量不足,而是 inode 已经被耗尽。
df -i 查看 inode 使用率
每个文件(即使是空文件)都会占用一个 inode,因此当系统中存在大量小文件时,inode 往往会早于磁盘空间先被用完。执行 df -i 后,就可以查看所有挂载点的 inode 总量、已使用数量、剩余数量以及使用百分比。
Use%列 ≥95% 的分区应尽快处理,避免出现无法创建文件的问题- 重点检查
/var/log、/tmp、/var/lib/docker/overlay2等容易产生海量小文件的目录 df -i /可单独查看根分区的 inode 剩余情况,排除其他挂载点干扰
定位高 inode 占用目录
确认是哪个分区的 inode 已满后,还需要继续定位具体是哪个子目录消耗了大量 inode。直接扫描整个磁盘通常效率较低,建议优先聚焦可疑路径进行排查:
- 统计
/var/log下所有普通文件数量:find /var/log -xdev -type f | wc -l - 按路径前四级分组并排序,找出嵌套层级中最集中的高频目录:
find /var/log -xdev -type f | cut -d "/" -f 1-4 | sort | uniq -c | sort -nr | head -5 - 跳过符号链接(避免跨分区造成误统计):
find /var/log -xdev -type f -not -path "*/.*" | wc -l
注意 ext4 默认保留 5% 空间,但不保留 inode
ext4 文件系统通常会为 root 预留 5% 的数据块(这部分在 df -h 的 A vail 中已被扣除),但 inode 并不会额外预留。这意味着,只要 df -i 显示 Use% = 100%,无论是普通用户还是 root 用户,都无法继续新建文件;同时也不能依靠 tune2fs 来调整 inode 预留量,因为 inode 总数在文件系统格式化时就已经固定。
- 增加 inode 的唯一方法:先备份数据 → 重新执行
mkfs.ext4 -N [更大值]格式化 → 再恢复数据 - 临时缓解方案:清理无用小文件、轮转或压缩日志(如
logrotate)、清空/tmp下过期 session 文件 - 在容器环境中尤其要注意:
docker system prune -a可能释放大量 orphaned inode
inode 耗尽不像磁盘空间那样还有“剩余容量”可缓冲,df -i 中的 A vailable 一旦为 0,就是真正的 0,连 touch 创建文件都会直接失败——这也是 Linux 磁盘分区 inode 问题比空间不足更刚性、更容易被忽视的原因。
