根本原因是inode耗尽——每个文件独占一个inode,小文件过多导致台账记满;需用df -i查iuse%确认(≥95%需警惕,100%则无法新建任何文件),再结合find定位高占用目录(如/var/log/journal、/var/spool/postfix/maildrop等),最后安全清理并配置监控预防。

磁盘空间明明够,却提示“No space left on device”,根本原因不是数据块(block)满了,而是inode耗尽了——每个文件都得占一个inode,小文件一多,台账记满了,仓库再空也进不了货。
看懂 df -h 和 df -i 的区别
这两个命令查的是两套资源:
- df -h:查“仓库容量”,即数据块使用情况,反映的是文件内容实际占了多少空间
- df -i:查“台账容量”,即inode使用情况,反映的是还能创建多少个新文件或目录
只要 IUse% 达到 95% 以上,就得警惕;到 100%,就彻底无法新建任何文件(包括日志、临时文件、数据库写入),哪怕 df -h 显示还剩几十GB。
快速定位 inode 占用大户
先确认哪个挂载点有问题,再逐层缩小范围:
- 运行
df -i,找出 IUse% 最高的分区(比如/var或/) - 对高危路径执行:
find /var -xdev -type f | cut -d/ -f1-3 | sort | uniq -c | sort -nr | head -10,列出子目录中文件数最多的前10名 - 重点关注:
/var/log/journal(systemd 日志)、/var/spool/postfix/maildrop(邮件队列)、/tmp、/var/lib/docker/containers(容器日志)、/var/cache
安全清理与长期预防
清理要谨慎,优先选可恢复、低风险操作:
- 压缩或轮转旧日志:
journalctl --vacuum-size=500M或手动gzip /var/log/*.log.1 - 清理过期临时文件:
find /tmp -type f -mtime +7 -ls(先预览),确认无误再加-delete - 清空 Docker 悬空数据:
docker system prune -f(不带--volumes更安全) - 预防措施:监控系统(如 Zabbix)配置 inode 使用率告警(阈值设为 85%);对易产小文件的路径(如
/var)单独分区;格式化 ext4 时用mkfs.ext4 -N 20000000 /dev/sdb1预留足够 inode
不复杂但容易忽略











