df与du不一致是linux存储机制的自然体现:ext4预留5%空间及元数据开销导致5–8%差异属正常;差值过大则需重点排查已删未释放文件(lsof +l1)、挂载点干扰(du加-x)、inode耗尽(df -i)等问题。

df 和 du 显示不一致不是 bug,是 Linux 存储机制的自然体现。关键在于识别差异来源,再针对性处理。
先看差异是否在合理范围
ext4 默认预留 5% 空间给 root,这部分只计入 df,不被 du 统计;加上 inode 表、日志区、位图等元数据开销,差个 5–8% 属正常。比如 df 显示用了 95G,du 统计出 88G,大概率就是预留块 + 元数据导致的,不用深挖。
- 查预留比例:tune2fs -l /dev/sdXN | grep "Reserved block count"
- 算理论预留量:用 dumpe2fs -h /dev/sdXN | grep -E "(Block count|Reserved block count)" 对比确认
重点排查已删除但进程仍占句柄的文件
这是生产环境最常见、最隐蔽的“磁盘不释放”原因。文件被 rm 后,只要还有进程打开着它(比如 tail -f、java -jar、nginx 日志写入),空间就一直被 df 计为已用,而 du 已经看不见它了。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 快速定位:lsof +L1 或 lsof | grep deleted
- 看到类似 /var/log/app.log (deleted) 的输出,说明该文件已被删但句柄未关
- 不重启服务清空空间:echo > /proc/PID/fd/FD_NUMBER(需 root 权限)
- 若允许重启,kill -HUP PID(平滑重载)或 systemctl reload service 更安全
排除挂载点干扰和跨文件系统统计
du 默认会递归进入子挂载点(如 /mnt/data、/boot),把其他设备的空间也算进当前目录;df 却按挂载点单独显示。这会导致 du 总和远大于 df 某一分区值。
- 加 -x 参数限制 du 不跨越文件系统:du -xsh / | sort -hr
- 查当前有哪些挂载点:findmnt 或 mount | grep "^/dev"
- 对可疑挂载点单独跑:df -h; du -xsh /var; du -xsh /home 对比
别忘了 inode 耗尽这个“假满”陷阱
磁盘还有几十 GB,却提示 No space left on device?极可能是 inode 用光了。大量小文件(如缓存、session、临时日志)会快速耗尽 inode,而 df -h 完全不体现这点。
- 必查命令:df -i —— 关注 IUse% 列是否接近 100%
- 找小文件密集目录:find /var -xdev -type f | cut -d/ -f1-3 | sort | uniq -c | sort -n
- 清理方向:清空 /var/spool/postfix/maildrop、/tmp、/var/lib/php/sessions 等易堆积小文件的位置










