根分区隐藏存储占用异常:无法定位占用文件
根分区隐藏存储占用异常:无法定位占用文件
这种情况真的挺闹心的——明明手动排查下来根分区没存多少东西,但df就是显示快满了,我之前处理过类似的问题,给你补充几个可能没覆盖到的排查方向:
1. 检查被挂载点覆盖的隐藏文件
你已经排查了挂载点,但有可能原本根分区下的挂载目录(比如/var、/home)在挂载独立分区之前就有文件,挂载后这些文件被隐藏了,但df依然会统计它们的占用。可以用bind挂载的方式绕过挂载点查看真实内容:
- 创建临时目录:
mkdir /tmp/root_real - 把根分区绑定挂载到临时目录:
mount --bind / /tmp/root_real - 现在去
/tmp/root_real下查看各个挂载点目录(比如/tmp/root_real/var),里面的文件就是被挂载覆盖的内容,用du -hs /tmp/root_real/var就能看到它们的大小 - 排查完成后卸载临时挂载:
umount /tmp/root_real
2. 检查ext4的默认保留空间
ext4文件系统默认会给root用户保留5%的磁盘空间,用来防止磁盘满时root无法进行应急操作。如果你的根分区很大(比如100GB以上),5%的空间就有5GB甚至更多,这部分空间du是统计不到的,但df会算进去:
- 查看当前保留空间设置:
tune2fs -l /dev/your-root-partition | grep "Reserved block count"(把/dev/your-root-partition换成你的根分区设备,比如/dev/sda1) - 如果觉得保留空间过多,可以调整比例,比如改成1%:
tune2fs -m 1 /dev/your-root-partition
3. 排查进程持有的未被正确识别的大文件
你已经用lsof查了已删除但被进程占用的文件,但可以再细化一下排查:
- 列出所有已删除且被进程持有的文件,重点看大小列:
lsof +L1 | awk '{print $1, $2, $7, $9}' | sort -k3 -nr - 如果看到某个进程持有几个GB的大文件,可以重启对应的进程释放空间;如果是系统进程,可能需要重启服务器(你已经重启过,但可以确认下是不是重启后还是存在)
4. 检查文件系统是否存在错误
有时候文件系统损坏会导致df的统计数据异常,这种情况需要离线检查修复:
- 可以用Debian安装盘进入Live模式,或者进入单用户模式(确保根分区未被挂载为读写)
- 执行文件系统检查:
e2fsck -f /dev/your-root-partition(-f表示强制检查,即使系统认为文件系统正常)
5. 统计根目录顶级目录的真实占用
用du直接统计根目录下所有顶级目录的总大小,和df的已用空间对比,看差值在哪里:
- 执行命令:
du -sch /* | sort -h - 如果
du统计的总大小远小于df显示的已用空间,那差值部分基本就是上面提到的挂载覆盖文件、保留空间或者文件系统异常导致的
备注:内容来源于stack exchange,提问作者nifu
相关产品推荐
相关产品推荐

