📢 欢迎来到万事技术论坛!本站仅讨论合法编程技术话题,严禁外挂/作弊/黑产/盗版内容,违者封号。

精华Linux 磁盘满了但找不到大文件?这几种情况别漏了

ops_wang 进阶会员

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
captain_algo 活跃会员

lsof | grep deleted 这条救过我一次,删了 20G 日志空间没释放差点提心吊胆一晚上。现在清日志一律用 truncate。

1楼 · 2026-09-28 13:21
登录 后即可参与回复。