linux inode耗尽时系统报“no space left on device”但df -h显示磁盘有余量,需用df -i查iuse%定位高占用分区,再用du --inodes和find分析目录,最后安全清理小文件并长期预防。

Linux inode用尽时,系统会报“No space left on device”,但df -h显示磁盘空间仍有余量——这说明不是磁盘满,而是索引节点(inode)耗光了。每个文件、目录、软链接都占用一个inode,小文件多是主因。
快速确认是否inode耗尽
运行以下命令查看各挂载点的inode使用率:
df -i
重点关注IUse%列。若某分区(如/或/var)达到95%以上甚至100%,就基本可判定是inode瓶颈。
对比执行df -h,如果两者使用率差异明显(比如磁盘只用了40%,inode却用了99%),问题定位更明确。
定位高inode占用目录
找到“产文件大户”是清理的关键。常用方法有:
- 按目录统计子项数量(适合根下一级排查):
for i in /*; do echo "$i"; find "$i" | wc -l; done - 按inode数量排序查看指定路径(推荐):
du --inodes -s /var/* 2>/dev/null | sort -n - 深入可疑目录后,查文件数量最多的子目录:
find /var/spool -maxdepth 2 -type d | while read d; do echo "$(find "$d" | wc -l) $d"; done | sort -nr | head -10
常见高inode目录包括:/tmp(session、临时文件)、/var/spool/postfix/maildrop(邮件队列堆积)、/var/spool/clientmqueue(sendmail残留)、/var/log/journal(未轮转的日志)等。
安全高效清理大量小文件
直接rm *容易因参数过长失败(Argument list too long)。应使用流式处理:
- 删除某目录下全部文件(保留子目录结构):
find /path/to/dir -maxdepth 1 -type f -delete - 删除空文件(也占inode):
find /home -type f -size 0 -delete - 配合xargs批量删除(兼容性更广):
find /tmp -name "sess_*" -print0 | xargs -0 rm -f
操作前建议先用find ... | head -20预览匹配结果,避免误删。
长期预防与扩容思路
清理只是治标。若业务持续产生小文件(如日志、缓存、邮件队列),需同步做预防:
- 配置logrotate定期压缩/删除旧日志
- 禁用或修正不工作的邮件服务(如postfix/sendmail),防止
maildrop堆积 - 对
/tmp挂载tmpfs并设大小上限,重启自动清空 - 新建文件系统时预留足够inode:格式化时用
mkfs.ext4 -T largefile(少inode)或-T small(多inode);云服务器扩容系统盘后,inode数通常同比增加
注意:直接修改已有文件系统的inode总数需重格式化,数据全失,仅适用于可离线重建的场景。










