Linux 磁盘空间排查:从 df 到 du 的日常用法

举报
yd_69240880 发表于 2026/11/10 06:06:44 2026/11/10
【摘要】 磁盘满了,是 Linux 服务器上最常见、也最容易让人手忙脚乱的故障之一。本文结合日常运维经验,讲讲从 df 到 du 的排查思路:先用 df -h 看全局、df -i 看 inode,再用 du 逐层定位大目录,用 find 找大文件、lsof 检查已删未释放的文件,最后给出可复用的排查清单。

磁盘满了,是 Linux 服务器上最常见、也最容易让人手忙脚乱的故障之一。服务突然写不进日志、数据库拒绝写入、部署失败,第一反应往往是“磁盘满了”,但接下来该看什么、删什么,却需要一套固定的排查顺序。本文结合日常运维经验,讲讲从 df 到 du 的排查思路。

一、先看全局:df -h

遇到磁盘告警,先不要急着删文件,用 df 看整体情况:

df -h
df -h / /var /home

df 看的是文件系统的使用情况,重点看 Use% 和 Mounted on。哪个挂载点满了,就去哪个挂载点排查;如果根分区 / 满了,问题往往出在 /var、/tmp 或者某个应用目录里。

还有一个容易被忽略的维度:inode。用完了 inode,即使磁盘还有空间,也写不进文件:

df -i
df -ih /

如果 Use% 不高但 df -i 显示 IUse% 接近 100%,说明是小文件太多,常见于缓存、会话文件或邮件队列堆积。

二、再定位目录:du 由大到小找

确认了满的挂载点,再用 du 一层层往下找:

du -sh /*
du -sh /var/* | sort -rh | head -n 10
du -sh /home/* | sort -rh | head -n 10

du -sh 看的是目录实际占用的空间,配合 sort -rh 排序,很快就能定位到最大的几个目录。找到可疑目录后继续深入:

du -sh /var/log/*
du -h --max-depth=1 /var/log | sort -rh | head -n 10

需要排除某些目录时,可以用 --exclude,例如排查时跳过挂载的备份盘:

du -sh --exclude=/mnt/backup /data/*

一个实用习惯:排查时从根目录逐层下钻,每次只看前十名,两三步就能锁定目标,而不是在根目录直接跑一遍 du 之后再无头绪地翻。

三、找大文件:find 配合排序

如果大目录里文件很多,可以直接找大文件:

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

-xdev 的作用是只在本文件系统内查找,避免扫进其他挂载点。找到大文件后,先确认它是什么:是日志、备份、还是核心转储文件,再决定处理方式。

四、删之前先确认:别把“正在用”的文件删错

磁盘排查最容易踩的坑,是删了文件空间却没有释放。原因通常是某个进程还打开着这个文件:

lsof | grep deleted

如果看到已删除但仍被占用的文件,空间要等进程退出或重启服务后才会释放。正在被写的日志文件,不要直接 rm,更稳妥的做法是清空而不是删除:

: > /var/log/app/app.log
# 或者
truncate -s 0 /var/log/app/app.log

清空后文件句柄不变,服务不用重启,空间立刻释放。当然,清空前最好先确认日志已经不再需要,或者已经做过备份。

另外,日志类问题建议从根上解决:检查 logrotate 是否配置、日志级别是不是开得太高、journald 的保留策略是否合理:

journalctl --disk-usage
journalctl --vacuum-size=500M
du -sh /var/log/journal/

五、几个常见的“空间大户”

日常排查中,反复出现的大户有这么几类:

  1. 应用日志和历史备份:/var/log、应用自带的 logs 目录、定时任务留下的备份文件。
  2. 容器和镜像:Docker 长期不清理会攒下大量镜像、容器和构建缓存,可以用 docker system df 查看,确认后再清理。
  3. 软件包缓存:apt clean、yum clean all 可以释放不少空间,清理前确认不需要离线安装包。
  4. /tmp 和临时文件:长期运行的服务会在 /tmp 留下临时文件,定期检查,确认无用后再清理。

清理命令本身不难,难的是“确认”。删之前多问一句:这个文件是谁的、还在用吗、有没有备份?想清楚再动手。

六、一个可复用的排查清单

以后再遇到磁盘告警,可以按这个顺序走:

  1. df -h 确认哪个挂载点满了,df -i 看 inode 是否耗尽。
  2. du -sh /* | sort -rh 定位最大的目录,逐层下钻。
  3. find 找超过 500M 的大文件,确认归属。
  4. lsof | grep deleted 检查已删未释放的文件。
  5. 清理日志、缓存和备份,必要时用 truncate 清空正在写的日志。
  6. 事后补上监控告警和 logrotate,别让同样的问题下周再来一次。

df 负责“看全局”,du 负责“找局部”,find 和 lsof 负责“确认细节”。把这几个命令串起来,多数磁盘空间问题十几分钟就能定位,不用再凭感觉删文件。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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