腾讯云 4 核 16G 的机器上 df 显示 /data 用了 3.2T,du -xsh /data/* 加起来只有 3T,差的二百多 G 反复核对都对不上,怀疑有隐藏文件。

一开始怀疑是「稀疏文件实际占用小于表观大小,du 按块统计与 df 的块计数口径不同」,查了一圈,方向不对。

排查方向其实有限,先把可能性排一排。被删除但仍被进程打开的文件,du 会跳过而 df 仍计算在内。也可能是目录被另一个分区挂载覆盖,du 走到挂载点会跳到新盘,原内容没被统计。

少数情况下是文件系统预留块和元数据本身占用一部分,不在任何目录里。

动手时先确认有没有删不掉却占着空间的文件

lsof +L1 2>/dev/null | awk '$7>1024{print $1,$2,$7,$9}'

然后列出所有挂载点,排查覆盖关系

findmnt -R /data -o TARGET,SOURCE,FSTYPE

接着把 du 限制在单文件系统内统计

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

等前面都确认过,再按 inode 统计与 df 对比差值

df -h /data && df -i /data

别只看报错消失,验证要多做一步。lsof +L1 无输出,du 汇总与 df 已用值相差在百分之五以内,且 findmnt 里 /data 下没有其他分区挂着。

补一句。差值长期不变多半是元数据或预留块,不必追;差值每天都在长才要去查句柄,别把两种情形混在一起。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189