Linux 磁盘写满时的快速定位顺序
服务突然报 No space left on device,但 du 加起来又对不上 df 的数字。这时候按下面的顺序查,通常几分钟就能定位。
第一步:分清空间满还是 inode 满
df -h /
df -i /
df -h 看的是块占用,df -i 看的是 inode 数量。如果空间还有余量但 inode 是 100%,说明小文件太多,常见于缓存目录、session 文件、邮件队列。
第二步:找大目录
du -xhd1 / | sort -rh | head -10
-x 很重要:不加这个参数,du 会跨进挂载点,把别的磁盘也算进来,结果没有参考价值。
第三步:查被删除但没释放的文件
这是 du 和 df 对不上的最常见原因。某个日志文件被删了,但还有进程握着它的句柄,空间就不会释放。
lsof +L1 | sort -k7 -n | tail -10
找到进程后,重启该进程即可释放;不方便重启的,可以用 : > /proc/<pid>/fd/<n> 清空。
第四步:按类型清理
常见的几个大头:
/var/log/journal:journalctl --vacuum-size=100M/var/log下的轮转日志:确认 logrotate 配置是否生效- 容器镜像和悬空卷:
docker system df - 包管理缓存:
apt clean/dnf clean all
收尾
清理完最好顺手加一个监控阈值,别等到写满了才发现。磁盘从 80% 涨到 100% 往往只要几个小时,尤其是日志没有轮转的时候。