报错是这么冒出来的。df 显示根分区用满,du 只统计一层加起来只有三十 G,可分区明明是一百 G,剩下七十 G 完全查不到去向,重启也没有变化。

原因不止一个,得分开看。某个目录被另一块盘挂载覆盖,原内容藏在挂载点下面。也可能是有进程持有已删除文件的句柄一直没有释放。

另外,数据写在了 mount 之前的旧目录里,之后再也看不到。

先按分区统计,不跨挂载点

du -xhd1 / | sort -h | tail

随后列出已删除仍占空间的文件

lsof +L1 | awk '{print $1,$7,$9}'

接着把根分区 bind 出来查被遮住的内容

mkdir -p /mnt/root && mount --bind / /mnt/root && du -sh /mnt/root/*

剩下的就是确认无用再清理并卸载

umount /mnt/root

同事提醒我看一下最近一次发布,时间点确实对得上。

怎么算真的好了,看的是同一批现象。df 与 du 的差值回到一 G 以内,lsof +L1 输出为空,清理后根分区使用率明显下降。

补一句。du 不加 -x 会跨分区重复计算,看着永远对不上;findmnt 指定路径就能确认它到底落在哪块盘上。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189