登录
首页 >  文章 >  linux

磁盘满但找不到大文件?Linux解决方法来了

时间:2026-05-08 23:22:48 389浏览 收藏

推广推荐
下载万磁搜索绿色版 ➜
支持 PC / 移动端,安全直达
当Linux系统显示磁盘已满(df显示100%),但du统计的文件总和却远小于此——这并非磁盘空间真的“消失”,而是被已删除却仍被进程占用的文件(unlinked but open)悄然锁住;这些残留文件虽从文件系统中移除,但因进程持续持有其文件描述符,inode和数据块无法释放,导致空间无法回收。本文深入剖析这一经典“空间失踪”现象,手把手教你用lsof精准定位deleted状态文件,区分日志服务、Web服务器、Docker容器等不同场景,并提供安全reload、定向kill、journal清理、overlay2层排查及挂载点陷阱识别等实战方案,助你快速定位真凶、精准释放空间,告别盲目重启和无效清理。

Linux解决磁盘空间已满但找不到大文件的问题

df显示磁盘已满但du统计总和很小

这是最典型的“空间失踪”现象:运行 df -h 显示根分区使用率 100%,但用 du -sh /* 2>/dev/null | sort -h 扫描各目录,加起来远小于总容量。根本原因通常是:被删除但仍被进程占用的文件(unlinked but open)——它们的 inode 没被释放,磁盘块仍被锁住。

验证方法:lsof +L1(只显示链接数为 0 的打开文件),或更常用:lsof / | awk '$5=="REG" && $9!="?" && $11~/deleted/ {print $0}'。常见肇事者是日志服务(rsyslogdjournalctl)、Web 服务器(nginxapache2)或长期运行的脚本重定向了 stdout/stderr 到已删日志文件。

检查 deleted 状态文件并释放空间

找到这类文件后,不能靠重启服务“碰运气”——有些进程不响应 HUP,有些甚至没有 reload 机制。必须精准操作:

  • 确认进程是否可安全重启:systemctl list-units --type=service --state=running | grep -E "(rsyslog|nginx|apache|docker)"
  • 若进程支持平滑 reload(如 nginx),优先执行:nginx -s reloadsystemctl reload nginx,这会关闭旧 fd 并打开新日志文件
  • 若进程不支持或需立即释放,直接 kill 对应 pid:kill -9 (谨慎!确保业务允许中断)
  • 极端情况下(如 docker 容器内应用),可能需 docker exec -it ls -l /proc//fd/ 查看具体 fd 指向,再决定是否 stop 容器

警惕 /run/log/journal 和 /var/log/journal 占用

systemd-journald 默认不限制日志大小,尤其在频繁报错或调试模式下,/var/log/journal/ 可能无声无息吃掉数十 GB。它不会出现在 du /* 中,因为 journal 文件由 journald 独占管理,且部分日志可能还在内存或未刷盘。

快速清理:journalctl --disk-usage 查用量,journalctl --vacuum-size=500M 限制总大小,或 journalctl --vacuum-time=2weeks 清理旧日志。永久生效需编辑 /etc/systemd/journald.conf,取消注释并修改:SystemMaxUse=500MMaxRetentionSec=2week,然后 systemctl restart systemd-journald

检查隐藏挂载点和 overlayfs 层(Docker/K8s 场景)

在容器化环境中,df 显示的“已满”可能来自 overlay2 下层:/var/lib/docker/overlay2 里的 merged、diff、work 目录中存在大量未清理的 dangling layer。此时 du 扫描 /var/lib/docker 可能不准,因为部分目录被 mount 隐藏。

正确做法:docker system df -v 查看镜像、容器、卷的实际磁盘占用;清理无用资源:docker system prune -a --volumes(注意加 --volumes 才清卷);若发现某容器日志爆炸,可进其 /var/lib/docker/containers//-json.log 查看大小,并通过 docker update --log-opt max-size=10m --log-opt max-file=3 限流。

别忘了检查 /proc/mountsfindmnt,确认是否有 bind mount 或 tmpfs 挂载掩盖了真实路径——比如 /tmp 被挂成 tmpfs,但某个服务误把大文件写到 /var/tmp,而该目录又恰好被 bind 到一个已满的磁盘分区上。

本篇关于《磁盘满但找不到大文件?Linux解决方法来了》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于文章的相关知识,请关注golang学习网公众号!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>