“no space left on device”通常不是磁盘块满,而是inode耗尽;需用df -i检查iuse%是否≥95%,尤其100%时确认问题,再逐级定位/var等高inode占用目录并安全清理小文件。

为什么 df -h 显示有空间却报“No space left on device”
这不是磁盘块(block)满了,而是 inode 资源用光了。每个文件、目录、符号链接都必须占用一个 inode,它存的是权限、所有者、时间戳、数据块指针等元信息,和文件内容大小无关。所以哪怕全是 0 字节的小文件,也能迅速把 inode 耗尽。
快速确认是不是 inode 耗尽
运行这个命令:
df -i
重点看 IUse% 列 —— 如果达到 95% 以上,尤其显示 100%,基本就是问题根源。再对比 df -h 的 Use%,如果两者差距大(比如磁盘只用了 40%,inode 却 100%),就坐实了。
一层层定位 inode 消耗大户
从根目录开始,逐级缩小范围:
- 先查一级子目录文件总数:
for i in /*; do echo $i; find "$i" -xdev -type f | wc -l; done - 发现某目录(如 /var)数值异常高,就进入它:
cd /var && for i in */; do echo $i; find "$i" -xdev -type f | wc -l; done - 继续深入,直到定位到具体子目录,例如 /var/spool/postfix/maildrop 或 /var/log/journal
注意加 -xdev 参数,避免跨文件系统统计,保证结果准确。
安全清理的常用方法
找到目标目录后,按类型选择清理方式:
- 删旧日志:
find /path/to/dir -name "*.log" -mtime +30 -delete - 清空临时文件:
find /tmp -type f -mtime +7 -delete - 批量删海量小文件(避免参数过长):
find /path -type f -print0 | xargs -0 -n 1000 rm -f - 禁用无意义邮件堆积(针对 maildrop):
编辑 crontab -e,开头加上 MAILTO="",保存后重启 crond
清理前建议先用 ls -1 | head -5 看几个文件名,确认业务无关;生产环境可先打包备份再删。











