记录一下那天晚上的排查过程。运维在 /data 下执行 du -sh *,统计出四十七 T,可 df 里 /data 只用了十二 T,怀疑有文件被重复算或者目录被挂载盖住,逐个目录看都对不上。

刚开始盯着「硬链接被重复计数,备份目录里存着同一份文件的多个入口」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。/data 下面挂了 NFS 和另一块云盘,du 不跨文件系统也照样递归进去算。少数情况下是加了 -x 但只写在第一个目录上,后续参数各自按默认处理。

少数情况下是稀疏文件按表观大小统计,和实际占用的块数差出一大截。

限定在同一文件系统内统计

du -xsh /data/* 2>/dev/null | sort -h | tail

接着列出 /data 下的挂载点,单独统计

findmnt -R /data

然后按实际占用块数统计,避开稀疏文件

du -sx --block-size=1 /data/* | sort -n | tail

和 df 的总用量对一次账

df -h /data && du -xsh /data

怎么算真的好了,看的是同一批现象。du -xsh /data 的结果与 df 的已用空间相差不到百分之五,各子目录加总也能对上,NFS 挂载点被单独列出。

补一句。du 默认会跨文件系统,统计容量对账一律加 -x;稀疏文件要用 --apparent-size 之外的默认算法,否则会虚高。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189