Linux 磁盘空间排查:du 与 df 快速定位大文件

举报
yd_244110823 发表于 2026/11/07 06:10:17 2026/11/07
【摘要】 Linux 磁盘空间排查:du 与 df 快速定位大文件在云服务器上运维,最常见的告警之一就是“磁盘空间不足”。服务突然写不进日志、数据库拒绝写入、应用部署失败,根因往往不是磁盘真的太小,而是某个目录悄悄长出了大文件。本文用 df 和 du 这两个最基础的命令,讲一套从整体到细节的排查思路,适合在华为云 ECS 等 Linux 服务器上直接套用。 一、先看整体:df 回答“哪块盘满了”df...

Linux 磁盘空间排查:du 与 df 快速定位大文件

在云服务器上运维,最常见的告警之一就是“磁盘空间不足”。服务突然写不进日志、数据库拒绝写入、应用部署失败,根因往往不是磁盘真的太小,而是某个目录悄悄长出了大文件。本文用 df 和 du 这两个最基础的命令,讲一套从整体到细节的排查思路,适合在华为云 ECS 等 Linux 服务器上直接套用。

一、先看整体:df 回答“哪块盘满了”

df 看的是文件系统的整体使用情况,先用它确认是哪块盘、哪个挂载点出了问题:

df -h
df -h /var
df -i

df -h 以人类可读的方式显示每块盘的总量、已用、可用和挂载点。重点看 Use% 接近 100% 的那一行。df -i 则看 inode 使用率:如果磁盘还有空间却写不进文件,很可能是小文件太多把 inode 耗尽了,这时删大文件是没有用的,要清理的是海量小文件。

一个常见的误区是只看根目录 /。实际上 /var/log、/var/lib/docker、/home、/tmp 可能挂在不同的盘上,df -h 能一次把挂载关系讲清楚,避免在错误的目录里白忙一场。

二、再看目录:du 回答“空间被谁占了”

确认挂载点之后,用 du 自上而下地缩小范围:

du -sh /*
du -sh /var/* | sort -rh | head -20
du -sh /var/log/* | sort -rh | head -20

du -sh 只显示一级汇总,sort -rh 按大小倒序排列,head -20 只看最大的前 20 个。排查的诀窍是“逐层下钻”:先看 / 下哪个一级目录最大,再进这个目录看它的子目录,一层一层走到真正的大目录,而不是一开始就对整棵树做全量扫描,那样既慢又容易被海量小文件干扰。

如果想限定只看一层,可以用 --max-depth:

du -h --max-depth=1 /var
du -h --max-depth=2 /var/lib | sort -rh | head -20

三、定位大文件:find 直接点名

当目录已经锁定到某一层,就可以用 find 直接列出大文件:

find /var -type f -size +500M -exec ls -lh {} \;
find / -type f -size +1G -exec du -h {} \; 2>/dev/null | sort -rh | head -20

第一条找出 /var 下大于 500MB 的文件,第二条在全盘找大于 1GB 的文件并按大小排序。2>/dev/null 用于屏蔽无权限目录的报错,让输出更干净。配合 ls -lh 可以同时看到文件的修改时间,判断它是正在增长的日志,还是早已废弃的备份。

四、常见的“幽灵占用”:删了文件空间却没回来

有一种情况特别容易让人困惑:明明已经删掉了大文件,df 显示的可用空间却一点没变。原因通常是文件还被某个进程打开着,Linux 只有等进程释放句柄后才会真正回收空间。可以用 lsof 检查:

lsof | grep deleted
lsof +L1

如果确认是某个服务的日志文件被删后仍被占用,最稳妥的做法是重启对应服务,或者用 : > 文件名 的方式清空文件而不是直接删除,让进程继续往同一个句柄里写。

另外几个高频“元凶”也值得优先检查:一是应用日志没有做轮转,单个日志文件无限增长;二是容器镜像和无用卷长期堆积,/var/lib/docker 越来越大;三是备份、快照和下载文件随手放在了系统盘;四是 /tmp 下的临时文件没人清理。这些目录都应该纳入定期巡检清单。

五、清理之前,先确认三件事

磁盘满了就急着删文件,是运维里最容易出事故的操作。动手之前请先确认:第一,这个文件属于谁,是业务数据、日志还是缓存;第二,删掉之后能不能恢复,数据库文件、证书和配置文件绝对不能凭感觉删除;第三,有没有更安全的替代办法,比如先压缩归档、迁移到对象存储,或者扩容磁盘。

相对安全的做法包括:用 logrotate 管理日志轮转,设置保留天数和压缩;把历史日志打包后移到低成本存储;清理包管理缓存,如 yum clean all 或 apt clean;清理不再使用的容器镜像和悬空卷;清理明确可再生的缓存和临时文件。每次清理后,再跑一次 df -h 验证效果,并记录下释放了多少空间。

六、一个可直接套用的排查清单

  1. df -h:确认哪块盘、哪个挂载点满了;df -i 排除 inode 耗尽。
  2. du -sh /* | sort -rh:锁定最大的顶层目录,逐层下钻。
  3. find 列出大于 500MB 的文件,结合修改时间判断来源。
  4. lsof | grep deleted:排查已删未释放的“幽灵占用”。
  5. 按日志轮转、归档迁移、清理缓存的顺序处理,删文件前先确认归属和可恢复性。
  6. 处理完成后用 df -h 复核,并把高频目录加入定期巡检。

结语

df 看全局,du 看分布,find 点名大文件,lsof 抓幽灵占用,这四个命令组合起来,绝大多数磁盘空间问题都能在十几分钟内定位。比命令本身更重要的,是养成定期巡检的习惯:日志轮转有没有生效、备份有没有越积越多、临时文件有没有人清理。磁盘空间排查的终点不是一次删出几个 GB,而是让增长可预测、清理可重复,服务器才不会在半夜因为磁盘满了把人叫醒。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。