
linux inode 耗尽时,即使磁盘空间还有富余,系统也会报 No space left on device,无法创建新文件或目录。根本原因是每个文件(含空文件、软链接、目录)都占用一个 inode,而 inode 总数在格式化时就固定了,不能动态扩容。
确认是否真的 inode 耗尽
运行以下命令查看各挂载点的 inode 使用率:
df -i
重点关注 IUse% 列:若某分区达到 95% 以上,尤其是 100%,就说明 inode 已濒临或完全耗尽。注意对比 df -h 的磁盘空间使用率——如果空间充足但 IUse% 满了,基本可断定是小文件堆积导致。
定位 inode 占用最多的目录
从根目录或高风险路径(如 /var/spool/postfix/maildrop、/tmp、/var/log、/home)开始逐层排查:
- 查看指定目录下各子项占用的 inode 数量:
du –inodes -sh /var/* 2>/dev/NULL | sort -hr - 快速扫描 maildrop 类典型问题目录:
find /var/spool/postfix/maildrop -type f | wc -l - 查找大量零字节文件(常见于失败的日志或邮件队列):
find /var -type f -size 0 | head -20(先预览,确认后再删)
安全清理高 inode 占用文件
清理前建议先备份关键配置,避免误删。重点处理以下几类:
- 邮件队列残留:如 /var/spool/postfix/maildrop 或 /var/spool/clientmqueue 下成千上万的小文件,可直接清空(前提是 postfix/sendmail 确实不工作且无业务依赖):
rm -f /var/spool/postfix/maildrop/* - 临时日志或缓存:检查 /tmp、/var/tmp 是否有长期未清理的 session、lock、.log.* 文件
- cron 输出堆积:检查 root 或其他用户的 crontab,禁用或重定向无意义输出(如加
> /dev/null 2>&1),防止每分钟生成一个空邮件文件 - 批量删除大量文件时,避免
rm -rf *报参数列表过长错误,改用:
find /path/to/dir -type f -print0 | xargs -0 rm -f
长期预防与优化
单靠清理治标不治本。建议落地以下措施:
- 为高频写入小文件的场景(如日志归档、邮件队列),单独挂载专用分区,并在格式化时用 -T largefile 或 -T small 参数调整 inode 密度(ext4)
- 对已有分区,可通过定时任务自动清理陈旧小文件,例如每周清空 7 天前的空文件:
find /tmp -type f -size 0 -mtime +7 -delete - 监控告警中加入 df -i 指标,IUse% ≥ 90% 就触发预警,早于 100% 介入
- 若系统盘 inode 长期紧张且无法拆分服务,可考虑重建系统盘并扩容——inode 数量随总容量线性增长(如 20G → 40G,inode 约翻倍)