inode 耗尽导致“no space left on device”,需用 df -i 确认,再通过 find 统计并清理 /var/spool/postfix/maildrop 等高 inode 目录,用 find -delete 或 rsync 清空,最后检查 lsof +l1 和 dpkg -l | grep '^rc' 释放残留 inode。

遇到“No space left on device”但df -h显示磁盘还有空间,大概率是 inode 耗尽了。小文件(如日志碎片、邮件队列、缓存、空文件)不占多少磁盘块,却每个都吃掉一个 inode。清理关键不是删大文件,而是精准扫除海量小文件,并避开命令报错陷阱。
第一步:确认确实是 inode 耗尽
运行:df -i
重点看 IUse% 列——如果根分区(/)或 /var、/tmp 等挂载点达到 95% 以上,尤其是 100%,就坐实了 inode 问题。
第二步:快速定位高 inode 占用目录
别用 ls,文件太多会卡死或报 memory exhausted。改用无排序、低开销的方式:
- 查一级子目录文件总数(跳过权限错误):
for d in /*; do echo "$d $(find \"$d\" -xdev -type f 2>/dev/null | wc -l)"; done | sort -n -k2 - 重点盯这几个路径:
/var/spool/postfix/maildrop(cron 邮件失败堆积)/var/log/journal(systemd 日志未轮转)/tmp和/var/tmp(临时文件残留)/var/lib/docker/overlay2(已停止容器的层元数据)
第三步:安全高效删除大量小文件
直接 rm -rf * 会因参数超长报 Argument list too long。推荐两种稳定方案:
-
用 find -delete(最简洁):
sudo find /var/spool/postfix/maildrop -type f -delete -
用 rsync 清空(适合超百万级):
sudo mkdir -p /tmp/empty && sudo rsync -a --delete-before /tmp/empty/ /var/log/journal/
(注意末尾斜杠含义:同步“内容”,不是目录本身) - 批量删旧日志时加时间过滤,避免误删:
sudo find /tmp -name "*.log" -mtime +30 -type f -delete
第四步:别漏掉“看不见”的 inode 占用者
有些文件已被删,但进程还开着句柄,df -i 仍会计数。查它们:
-
sudo lsof +L1—— 列出已删除但仍被占用的文件 - 找到对应 PID 后,重启服务或
sudo kill -HUP PID释放 - 检查 dpkg “卸载但留配置”的孤儿包(每个都带一堆 .conf/.list 小文件):
dpkg -l | grep '^rc' | awk '{print $2}' | xargs -r sudo dpkg -P











