磁盘df显示满而du统计小,最常见原因是已删除但被进程占用的文件;可用lsof +L1或find /proc/*/fd -ls | grep deleted定位,再通过SIGHUP或kill释放,同时排除挂载覆盖、预留空间、快照等干扰。

当 df 显示磁盘已满,但 du -sh * 统计的文件总和却远小于此,说明有“看不见”的空间被占用——最常见原因是已删除但仍被进程打开的文件(unlinked but held open)。
确认是否存在被删除但未释放的文件
这类文件仍被某个进程以文件描述符方式持有,因此内核不会真正回收磁盘块,df 会统计,但 du 找不到对应路径(因为目录项已消失)。
- 运行
lsof +L1(需 root 权限),列出所有链接数为 0 的打开文件 - 若无
lsof,可用find /proc/*/fd -ls 2>/dev/null | grep deleted手动查找 - 重点关注输出中含
deleted字样的行,例如:3456789 0 lrwx------ 1 root root 64 Jan 1 10:00 /proc/1234/fd/5 -> /var/log/app.log (deleted)
定位并释放被占用的空间
找到对应进程后,有两种处理方式:
-
优雅释放:向进程发送
SIGHUP或USR1(取决于服务是否支持日志重载),例如kill -HUP 1234,让其关闭并重新打开日志文件 -
强制释放:若进程无响应或不可重启,可直接终止该进程
kill -9 1234;注意评估业务影响 - 验证释放效果:执行
df查看对应分区是否释放空间;也可清空对应 fd(不推荐生产环境):echo > /proc/1234/fd/5
排查其他常见干扰因素
除已删除文件外,还需排除以下情况:
-
挂载覆盖:检查是否有新挂载点覆盖了原目录(如
/mnt/data挂载后,原/mnt/data下文件被隐藏),用mount | grep "on /path"确认 -
ext4/xfs 的预留空间:root 用户默认保留 5% 空间(
tune2fs -l /dev/sdXN | grep "Reserved block count"),普通用户du不计入,但df统计在内 -
快照或 CoW 文件系统特性:如使用 LVM 快照、Btrfs/ZFS 子卷,空间可能被快照引用而无法被
du统计到
日常预防建议
避免问题反复发生,可采取以下措施:
- 定期轮转大日志文件,并配置
copytruncate(logrotate)或确保应用支持SIGHUP重载 - 监控
df和du差值突增(例如差值 > 1GB 且持续增长),触发告警 - 对关键服务,限制单个日志文件大小并启用自动压缩归档
- 避免直接
rm正在写入的日志,优先用truncate -s 0 file或服务自身清理机制


















