当df显示磁盘已用空间远大于du统计结果时,说明存在被删除但仍在使用的文件、root预留空间、挂载覆盖或单位偏差等问题;需依次排查lsof +L1、tune2fs、findmnt及统一统计单位。

当 df 显示磁盘已用空间远大于 du 统计结果时,说明有“看不见却占着”的空间。这不是命令出错,而是文件系统底层行为导致的常见现象。核心思路是:找出 df 认为已占用、但 du 找不到的那部分空间。
查被删除但仍在使用的文件
这是最常见原因。文件被 rm 删除后,若进程仍打开它(如日志服务持续写入旧日志),其数据块不会释放。df 会继续计入,du 却遍历不到路径。
- 运行
lsof +L1 /(查根分区)或lsof | grep deleted查所有 deleted 状态句柄 - 重点关注输出中的
(deleted)标记,记录对应 PID 和 COMMAND - 重启相关服务(如
systemctl restart nginx)或发送重载信号(如kill -USR1 PID)
确认文件系统保留空间影响
ext2/3/4 默认为 root 预留 5% 空间(防止系统写死)。这部分计入 df 的 “Used”,但普通用户不可用,du 也统计不到。
- 执行
tune2fs -l /dev/sdXN | grep -E "Block count|Reserved"查看保留比例和大小 - 计算保留空间 = Reserved block count × Block size
- 注意:该部分属于正常设计,无需处理,但需纳入判断——比如 df 显示 95%,实际可用只剩约 0%
检查挂载覆盖或 bind mount 干扰
如果在已有目录上新挂载了其他设备(如 mount /dev/sdb1 /var/log),原目录下文件会被隐藏。du /var/log 只扫新设备内容,df /var/log 却显示新设备空间,两者自然对不上。
- 用
findmnt /var/log或mount | grep " /var/log "查真实挂载源 - 若发现非预期挂载,确认是否应卸载或调整路径
- 对 bind mount,用
findmnt -D查完整挂载树,避免误判统计范围
统一单位并排除统计偏差
df 默认以 1KiB(1024 字节)块为单位,du -sh 使用十进制前缀(如 1GB = 10⁹ 字节),单位不一致可能放大视觉误差。
- 统一用字节比对:
df --block-size=1 / | awk 'NR==2 {print $3}'和du -sb / | cut -f1 - du 默认跳过其他挂载点;加
-x参数可强制限制在同一文件系统内统计 - 注意隐藏文件:du -sh /* 不含 . 开头文件,要用
du -sh .[^.]* *补全











