df 说满了,du 说没满:磁盘上的幽灵空间【转】

删了 20G 日志,告警还在响

那年带夜班,监控一条短信把我震醒:某台机器磁盘 100%。

我揉着眼登上去,rm -f 掉应用目录里 20 多个 G 的旧日志,心想这下稳了。结果 df -h 一敲——还是 100%。

du -sh /* 扫了一遍,加起来明明不到一半。我盯着屏幕愣了三秒:这 20G 删了,人都去哪了?

后来一句 lsof 揪出真凶。这事儿,几乎每个运维都栽过。

先纠正一个"常识误区"

很多人以为 df 和 du 看的是同一个东西。不是。

  • df 看的是文件系统的账本:这个分区总共多少块、用了多少块,内核直接报。

  • du 看的是目录遍历:顺着目录一个个文件去加大小。

两者对不上,说明有空间"在账本上被占了,但目录里看不见"。这就是幽灵空间。

图片

所以核心认知:df 满、du 不满,不是磁盘坏了,是有东西在账本外占着空间,但目录已经找不到它了。 下面三招,把幽灵揪出来。

三招排查,每招带踩坑点

第一招:找"已删除但还被进程占着"的文件

这是最常见的原因。一个文件被 rm 了,但还有进程开着它的句柄(比如日志在写、没重启),文件系统就不能回收空间。文件在目录里没了,du 看不到,但 df 的账本还记着它。

排查:

# 列出所有已被删除、但仍被进程打开的文件
lsof +L1 | grep deleted

# 看具体被谁占着、占多大
lsof +L1 | awk '$5=="REG" {print $1, $2, $7, $9}'

找到了,重启那个进程(或让它重新打开日志),空间立刻回来。

踩坑点:别急着 kill -9。很多新人一看 deleted 文件就杀进程,结果把正在跑的服务干崩。正确做法是让进程重新打开日志(比如 kill -HUP 让它重读配置、或优雅重启),句柄释放空间自然回收。日志类进程大多支持 reload,先试这个。

第二招:查 inode 是不是耗尽了

你以为磁盘满都是"块"满了?错。还有一种满叫 inode 耗尽

海量小文件场景(比如会话文件、缓存碎片、docker 层叠),文件总大小不大,但文件数量巨多,把 inode 表占满了。这时候 df -h 看空间还有,但 df -i 已经 100%,新建文件直接报错 "No space left on device"。

排查:

# 看 inode 使用率
df -i

# 找哪个目录小文件最多
find /path -xdev -type f | awk -F/ '{print $2}' | sort | uniq -c | sort -rn | head

踩坑点df -h 正常但写文件报错,第一反应别怀疑权限,先 df -i。我见过一个定时任务疯狂写小缓存,三天把 inode 打满,运维查了一晚上"为什么空间还有的还报错"。另外,ext4/xfs 的 inode 数量在建文件系统时基本定死,后期不好扩,预防靠规划目录生命周期 + 清理脚本。

第三招:看是不是"挂载点盖住"或 docker 日志撑爆

还有两类隐蔽情况:

① 挂载点遮挡。如果你把一块盘 mount 到 /data,之前 /data 底下原有的文件就被"盖住"看不到了。du /data 只看到挂载后的内容,底下那批老文件在账本上仍占着空间。

# 看有没有挂载盖住目录的情况
mount | grep /data
# 想看底层真实占用,先 umount 再看,或用 bind mount 另看

② Docker 日志没轮转。overlay2 层叠 + 容器 stdout/stderr 日志不限制,能把 /var/lib/docker 撑爆,而 du 你扫的可能是别的目录,没扫到这。

# 看 docker 占了多少
du -sh /var/lib/docker

# 给容器日志加大小限制(daemon.json)
#  "log-driver": "json-file",
#  "log-opts": { "max-size": "100m", "max-file": "3" }

踩坑点:docker 日志默认不限制,跑久了几十 G 很正常。别等满了才加 max-size,上线就该配。另外 overlay2 的"已退出容器层"也会占空间,docker system prune 定期清,但清之前确认没在用。

写在最后

df 满、du 不满,这题看着邪门,拆开也就三句话:

空间没丢,是被删了但还被进程占着;不是块满了,可能是 inode 满了;不是这个目录,是挂载底下或 docker 里藏着。

新手遇到磁盘满,就是 rm -rf 一顿删,删完发现没用,再懵。资深的做法是:先 lsof +L1、再 df -i、再看挂载和 docker,三板斧下去,幽灵现形。

系统从不骗你,骗你的是你只看了一半。

慢一点,把账本和目录对上,比删十遍日志都管用。


我是胡哥,15 年 Linux 运维 / RHCA 红帽认证架构师。这篇是"Linux 诡异现象排错"系列的收官篇,讲磁盘上的幽灵空间。

如果你是从《load 飙高 CPU 闲》一路看到这——恭喜,5 篇诡异现象你都齐了。

转自

https://mp.weixin.qq.com/s/VZ4NGs_IXLs5j8gUiB0ATw

posted @ 2026-08-20 09:54  paul_hch  阅读(7)  评论(0)    收藏  举报