“no space left on device”但df -h显示空间充足,大概率是inode耗尽;需用df -i检查iuse%是否达100%,再定位高inode占用目录(如/var/log、/tmp、/var/lib/docker/overlay2),排查已删未释文件(lsof +l1),最后安全清理小文件。

当系统报“No space left on device”,但 df -h 显示磁盘空间还有富余,大概率是 inode 耗尽。关键不是看空间用了多少,而是看每个挂载点的 inode 使用率是否达到 100%。
第一步:用 df -i 全面检查所有挂载点
执行命令:
df -i
重点看 IUse% 这一列:
- 只要任意挂载点(如
/var、/home、/tmp)的 IUse% 是 100%,就确认该分区 inode 已耗尽 - 不要只查
/根分区——很多问题出在独立挂载的子目录,比如/var/spool/postfix/maildrop或/var/log/journal - 注意
Capacity列是固定值,由格式化时决定;IUse%才是判断依据
第二步:定位高 inode 占用目录
在 IUse% 达到 100% 的挂载点内,快速找出“文件最多”的子目录:
du --inodes -s /var/* 2>/dev/null | sort -nr | head -5
常见重灾区包括:
-
/var/log:日志轮转失败导致大量小日志堆积 -
/var/spool/postfix/maildrop:cron 输出邮件未发送成功,持续生成小文件 -
/tmp或/var/tmp:临时文件未清理 -
/var/lib/docker/overlay2:已删容器残留层(尤其在频繁启停容器的环境)
第三步:检查“已删未释”的 inode
删除文件只是解除链接,若进程仍在使用,inode 不会被回收。运行:
lsof +L1
或
lsof | grep deleted
重点关注:
- 标记为
(deleted)的条目 - 占用 inode 数多、Node 号重复出现的进程(如
rsyslogd、nginx、java) - 可尝试
truncate -s 0 /path/to/file清空内容释放 inode,避免重启服务中断业务
第四步:安全清理大量小文件
进入目标目录后,避免直接 rm *(可能报参数列表过长错误):
find . -type f -name "*" -print0 | xargs -0 -n 1000 rm -f
更稳妥的做法是分批删除并监控:
- 先用
ls | head -20看前20个文件名确认范围 - 对 postfix maildrop 类目录,可先停服务:
systemctl stop postfix,再清理 - XFS 文件系统删除大目录后可能延迟释放 inode,需等待下次挂载或运行
xfs_repair











