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。直接遍历全盘太慢,应聚焦可疑路径:
- 统计
/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 都会失败——这点比磁盘空间更刚性,也更容易被忽略。