df 显示 100%,du 加起来却对不上——八成是下面几种。
情况一:文件已删除但句柄还被占着
最常见。删了大文件(日志),但写它的进程还开着句柄,空间不会释放:
lsof | grep deleted
# 或者
lsof +L1
看到类似 nginx 1234 ... /var/log/access.log (deleted),说明空间还被占着。解决:
# 正确做法:清空而不是删除
: > /var/log/access.log
# 或者重启持有句柄的进程
systemctl restart nginx
经验:清理日志一律用 : > file 或 truncate,别 rm。
情况二:inode 耗尽
磁盘有空间但 inode 用完,表现为「No space left on device」但 df -h 还有余量:
df -i
小文件特别多时(比如 session 文件、碎图片、node_modules)容易中招。找出文件数最多的目录:
for d in /*; do echo "$(find $d -xdev -type f | wc -l) $d"; done | sort -rn | head
情况三:挂载点被掩盖
在挂载之前目录里已经有文件,挂载后那些文件就「消失」了,但空间还占着。
# 把根目录单独挂到 /mnt 再看真实占用
mkdir -p /mnt/root && mount --bind / /mnt/root
du -sh /mnt/root/var/* | sort -rh | head
情况四:du 和 df 对不上(正常差异)
- 稀疏文件:
du算逻辑大小,df算实际块占用 - 文件系统预留:ext4 默认留 5% 给 root,
tune2fs -l能看到
快速定位大文件
du -xhd1 / | sort -rh | head -20
-x 不跨文件系统,-h 人类可读,-d1 只下钻一层——先定位到具体目录再逐层下钻,比全盘 find 快得多。
建议把
df -h和df -i都加进监控,只看容量会漏掉 inode 问题。
楼主 · 2026-09-28 13:21 · 浏览 3

