Astarry技术日记 - 运维
type: channel
link: https://blog.astarry.cn/tag/%E8%BF%90%E7%BB%B4/
items: Linux 磁盘空间排查与清理实战:从 df 到 journald 的完整救火流程

Linux 磁盘空间排查与清理实战:从 df 到 journald 的完整救火流程
type: item
date: 2026-08-04T20:21:07+08:00
description: > 服务器报警「磁盘空间不足 90%」的那一刻,你只有三件事要做:**先看哪里满了,再找谁占的,最后安全地清理**。本文用一台真实服务器演示完整的排查与清理流程:`df` 宏观定位 → `du` 逐层下钻 → `find` 抓大文件 → journald/logrotate 管日志 → `lsof` 揪出"删了却没释放"的隐藏文件 → Docker 占用的收尾,最后给出防止磁盘再满的预防措施。## 排查总览:一张流程图记住全部套路磁盘满了先别慌,按这个顺序走,90% 的问题十分钟内定位:```bash df -h # ① 宏观:哪块分区满了(Use% 接近 100%) du -h --max-depth=1 / # ② 中观:哪个目录最大(逐层下钻) find / -xdev -type f -size +1G # ③ 微观:直接抓出大文件 journalctl --disk-usage # ④ 别忘了 systemd 日志这个"隐形大户" lsof +L1 | grep deleted # ⑤ 终极坑:删了但被进程占住,空间没释放 ```核心心法:**先查宏观再查微观,先定位再动手删**。直接 `rm -rf` 全盘乱删,轻则误删业务数据,重则删掉正在被写入的日志导致服务异常。## 宏观定位:`df -h` 看挂载点第一步永远是 `df`。它看的是**文件系统层面**的占用——每个挂载点用了多少、还剩多少:![宏观定位:df -h 查看各挂载点使用率](https://blog.astarry.cn/usr/uploads/2026/08/1690008909.png)截图里这台服务器只有一个数据盘 `/dev/vda2` 挂在根 `/` 上,40G 用了 8.9G(24%),看起来很健康。**实战中看到 Use% 到 90% 就该开始处理了**——大多数应用在磁盘 100% 满时不是报错,而是直接崩或写坏数据。几个读 `df` 输出时的要点:- 一堆 `tmpfs` 是内存文件系统,占的是内存不占磁盘,可以直接忽略。 - `Size` 是文件系统总容量,`Avail` 是对普通用户可用的空间——注意 `Used + Avail` 往往小于 `Size`,因为 ext4 会为 root 预留 5%(防止磁盘满时系统连日志都写不了),可用 `tune2fs -m 1 /dev/vda2` 把预留比例调到 1%。 - 如果提示 `df: /xxx: Permission denied`,通常只是没权限访问某些目录,不影响整体判断。## 逐层定位:du 黄金组合命令`df` 只知道哪个分区满了,接下来用 `du` 找出分区里**哪个目录最大**。黄金组合是这条:```bash du -h --max-depth=1 / 2>/dev/null | sort -hr | head -8 ```拆开看:| 部分 | 作用 | | --- | --- | | `du -h --max-depth=1` | 只统计一级子目录,`-h` 人类可读 | | `2>/dev/null` | 丢弃权限不足的报错,保持输出干净 | | `sort -hr` | 按人类可读格式(1.2G > 800M)逆序排序 | | `head -8` | 只看前 8 名 |在这台真实服务器上的输出:![逐层定位:du 黄金组合命令找出大目录](https://blog.astarry.cn/usr/uploads/2026/08/2894157208.png)``` 8.9G / 6.7G /var 2.1G /usr 114M /boot 33M /root 15M /tmp 6.1M /etc 1020K /run ```结论很明确:**`/var` 占了全盘 75%**,下一轮就该 `du -h --max-depth=1 /var | sort -hr | head` 继续下钻,直到定位到具体目录。大多数"莫名其妙满了"的案子,最后都指向 `/var/log`、`/var/lib/docker`、`/var/cache` 这三处。### 配合 find 直接抓大文件如果只想快速找到超过某个大小的大文件(不关心目录聚合),用 `find` 更直接:```bash # 找根目录下(不跨其他文件系统)所有超过 1G 的文件 find / -xdev -type f -size +1G -exec ls -lh {} \;# 按大小排序看最靠前的 10 个 find / -xdev -type f -exec du -h {} + 2>/dev/null | sort -hr | head -10 ````-xdev` 很关键:让 find 停留在根所在的文件系…