Linux 磁盘空间排查:从 df 到 du 的日常用法
磁盘满了,是 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/
五、几个常见的“空间大户”
日常排查中,反复出现的大户有这么几类:
- 应用日志和历史备份:/var/log、应用自带的 logs 目录、定时任务留下的备份文件。
- 容器和镜像:Docker 长期不清理会攒下大量镜像、容器和构建缓存,可以用 docker system df 查看,确认后再清理。
- 软件包缓存:apt clean、yum clean all 可以释放不少空间,清理前确认不需要离线安装包。
- /tmp 和临时文件:长期运行的服务会在 /tmp 留下临时文件,定期检查,确认无用后再清理。
清理命令本身不难,难的是“确认”。删之前多问一句:这个文件是谁的、还在用吗、有没有备份?想清楚再动手。
六、一个可复用的排查清单
以后再遇到磁盘告警,可以按这个顺序走:
- df -h 确认哪个挂载点满了,df -i 看 inode 是否耗尽。
- du -sh /* | sort -rh 定位最大的目录,逐层下钻。
- find 找超过 500M 的大文件,确认归属。
- lsof | grep deleted 检查已删未释放的文件。
- 清理日志、缓存和备份,必要时用 truncate 清空正在写的日志。
- 事后补上监控告警和 logrotate,别让同样的问题下周再来一次。
df 负责“看全局”,du 负责“找局部”,find 和 lsof 负责“确认细节”。把这几个命令串起来,多数磁盘空间问题十几分钟就能定位,不用再凭感觉删文件。
- 点赞
- 收藏
- 关注作者
评论(0)