Linux 磁盘空间排查:du 与 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 验证效果,并记录下释放了多少空间。
六、一个可直接套用的排查清单
df -h:确认哪块盘、哪个挂载点满了;df -i排除 inode 耗尽。du -sh /* | sort -rh:锁定最大的顶层目录,逐层下钻。find列出大于 500MB 的文件,结合修改时间判断来源。lsof | grep deleted:排查已删未释放的“幽灵占用”。- 按日志轮转、归档迁移、清理缓存的顺序处理,删文件前先确认归属和可恢复性。
- 处理完成后用
df -h复核,并把高频目录加入定期巡检。
结语
df 看全局,du 看分布,find 点名大文件,lsof 抓幽灵占用,这四个命令组合起来,绝大多数磁盘空间问题都能在十几分钟内定位。比命令本身更重要的,是养成定期巡检的习惯:日志轮转有没有生效、备份有没有越积越多、临时文件有没有人清理。磁盘空间排查的终点不是一次删出几个 GB,而是让增长可预测、清理可重复,服务器才不会在半夜因为磁盘满了把人叫醒。
- 点赞
- 收藏
- 关注作者
评论(0)