磁盘满了别慌:df 和 du 两条命令,从定位到清理的排查实战

举报
yd_243433958 发表于 2026/11/10 09:49:12 2026/11/10
【摘要】 磁盘满了别慌:df 和 du 两条命令,从定位到清理的排查实战服务器上最常见的“突然罢工”原因之一,就是磁盘满了。服务写不进日志、数据库拒绝写入、上传失败,报错五花八门,根子往往是同一个:某个目录悄悄吃掉了所有空间。排查这件事不需要装任何工具,df 和 du 两条系统自带命令就够了,关键是知道按什么顺序查。 第一步:先确认是不是磁盘满了出问题先别急着删东西,第一步是确认:df -h输出里看...

磁盘满了别慌:df 和 du 两条命令,从定位到清理的排查实战

服务器上最常见的“突然罢工”原因之一,就是磁盘满了。服务写不进日志、数据库拒绝写入、上传失败,报错五花八门,根子往往是同一个:某个目录悄悄吃掉了所有空间。排查这件事不需要装任何工具,df 和 du 两条系统自带命令就够了,关键是知道按什么顺序查。

第一步:先确认是不是磁盘满了

出问题先别急着删东西,第一步是确认:

df -h

输出里看 Use% 那一列。接近 100% 的挂载点就是出事的地方。注意看挂载点是哪个:根目录 / 满了和 /data 满了,排查方向完全不同。df -h 的 -h 是让人读得懂的单位(G、M),不加的话全是 KB 数字,看着费劲。

还有一个容易被忽略的情况:df 显示还有空间,但写文件却报 No space left on device。这时看 inode:

df -i

inode 用满了也会写不进文件,常见原因是某个目录下堆了几十万个小文件(比如没清理的会话文件、缓存碎片)。磁盘空间和 inode 是两个独立的配额,都要看。

第二步:用 du 一层层往下钻

确认哪个挂载点满了之后,用 du 找“谁占了地方”:

du -sh /var/* 2>/dev/null | sort -rh | head -10

-s 只汇总每个目录的总量,-h 是可读单位,sort -rh 按大小倒序,head -10 只看前十。找到最大的目录,再对它重复同样的操作,一层层钻下去,三四层就能定位到具体的大户。2>/dev/null 是把权限不足的报错丢掉,免得满屏报错干扰阅读。

新手常犯的错误是直接 du -sh /* 然后等半天——根目录下可能有挂载的网络盘、大容量数据盘,扫描很慢。正确做法是先 df 定挂载点,再只在那个挂载点里钻。

最常见的四个空间大户

按我踩过的坑排序,磁盘满十有八九是下面这几个:

第一,日志文件。 /var/log 里某个服务的日志没做轮转,几个月涨到几十 GB。先看一眼:

ls -lh /var/log/*.log | sort -k5 -rh | head

临时处理可以直接清空正在写的大日志(不要删,删了文件但进程还握着句柄,空间不会释放):

: > /var/log/xxx.log

根治办法是配 logrotate,或者把服务的日志级别从 debug 调回 info。删日志之前先确认里面没有还需要排查的报错,清空是不可逆的。

第二,Docker 的悬空镜像和卷。 装了 Docker 的机器,docker system df 经常能吓人一跳:

docker system df
docker image prune -a
docker volume prune

docker image prune -a 会删掉所有没被容器使用的镜像,volume prune 删掉没被挂载的卷。执行前先 docker ps 确认没有正在跑的重要容器依赖这些镜像,卷里没有要留的数据。只想看看不删的话,先跑 docker system df -v。

第三,包管理器的缓存。 apt、yum 的下载缓存常年没人清:

sudo apt clean
sudo yum clean all

这一项通常只有几百 MB 到几 GB,救不了大火,但顺手清掉没坏处。

第四,被删除但还被进程占用的文件。 这是最隐蔽的一种:文件已经 rm 了,du 看不到它,但进程还开着文件句柄,df 里空间就是不释放。用 lsof 找出来:

sudo lsof | grep deleted

看到的话,重启对应服务(或找到进程让它释放)才能真正回收空间。这也是为什么上面说清空日志要用 : > 而不是 rm——对正在写的文件,截断比删除更安全。

清理前后的三条规矩

磁盘满的时候人容易慌,慌就容易删错东西,动手之前先过三条:

  1. 先备份再删。 不确定有没有用的东西,先 mv 到别处或压缩归档,观察一天没问题再删。磁盘清理不是比谁删得快。
  2. 别碰系统目录里的未知文件。 /usr、/etc、/boot 里不认识的东西不要动,删错一个库,系统可能直接起不来。只清理自己认得出的日志、缓存、旧备份。
  3. 删完复查。 清理后重新 df -h 确认空间回来,同时看一眼服务日志,确认服务恢复正常写入。空间回来了但服务还在报错,说明还有别的问题。

让磁盘不再悄悄满:两个防复发设置

排查完一次,最好的收尾是让它别再发生:

  • 日志轮转:检查 /etc/logrotate.d/ 里关键服务的配置,确认有按大小或按天轮转、保留份数合理。没有的话补一个,十分钟的工作,能省掉下一次半夜救火。
  • 磁盘告警:装一个最简单的监控,哪怕只是 cron 每天跑一次 df,超过 80% 就发通知。很多云厂商的控制台自带磁盘使用率告警,打开它,阈值设 80%,比任何排查技巧都管用。

磁盘满不是技术难题,是个习惯问题:定期看一眼 df -h,日志配好轮转,缓存定期清理。等你排查过一次,就会发现这件事的流程是固定的——确认挂载点、一层层钻、找到大户、安全清理、配好防复发。下次再遇到,十分钟就能处理完。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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