磁盘空间不足是 Linux 服务器最常见、最容易导致服务中断的故障之一(尤其是 /var 爆满后 journald、docker、mysql、nginx 日志等会直接卡死)。 本篇聚焦服务器真实场景中最有效的查看 → 定位 → 清理 → 预防全流程,强调实用性和安全性,避免盲目 rm -rf 造成更大灾难。
1. 先快速判断整体磁盘使用情况(3 个最常用命令)
| 命令 | 核心价值 | 推荐写法 | 何时优先用 |
|---|---|---|---|
| df -h | 整体分区使用率、人性化大小、一目了然 | df -hT(显示文件系统类型) | 第一眼判断哪个分区快满了 |
| df -h --output | 更精确的字段控制 | df -h --output=source,fstype,size,used,avail,pcent,target | 需要复制到表格或监控脚本时 |
| du -sh /* | 根目录下每个一级目录占用多少 | `du -sh /* 2>/dev/null | sort -hr` |
典型输出解读示例:
- /var 占 78% → 继续深挖 /var
- / 根分区 92% → 必须立即处理,否则系统随时只读挂起
2. 定位具体占用大户(层层递进的 4 层定位法)
第 1 层:根目录一级子目录排序 du -sh /* 2>/dev/null | sort -hr | head -15
最常见前三名:
- /var
- /home(用户下载、代码、虚拟机镜像)
- /usr(软件安装过多)
第 2 层:锁定嫌疑目录后继续下钻 示例:/var 占大头 du -sh /var/* 2>/dev/null | sort -hr | head -10
常见子目录:
- /var/log
- /var/lib/docker
- /var/cache
- /var/lib/mysql / mariadb / postgresql
- /var/tmp
第 3 层:锁定具体罪魁祸首
- 日志:du -sh /var/log/* | sort -hr
- Docker:du -sh /var/lib/docker/* | sort -hr
- 缓存:du -sh /var/cache/* | sort -hr
第 4 层:找出具体大文件(跨文件系统最强工具)
text
find / -type f -size +500M -exec ls -lh {} \; 2>/dev/null | sort -hr
# 或更安全只搜特定分区
find /var -xdev -type f -size +100M -printf '%s %p\n' | sort -nr | head -20
-xdev 参数非常重要:防止 find 跨挂载点搜索其他磁盘,浪费时间。
3. 服务器最常见的 8 类空间占用与安全清理方法
| 占用来源 | 典型路径 | 安全清理方式(优先级从高到低) | 注意事项与风险点 |
|---|---|---|---|
| 系统日志 | /var/log/*.log / journal | journalctl --vacuum-time=2weeks logrotate 强制执行 | 不要直接 rm 日志文件,容易导致服务卡住 |
| Docker 镜像/容器/卷 | /var/lib/docker | docker system prune -a --volumes docker image prune -a | 先确认没有重要镜像,-a 会删全部未使用镜像 |
| 包管理器缓存 | /var/cache/apt / /var/cache/dnf | apt clean / apt autoclean dnf clean all | 可随时清理,几乎零风险 |
| 临时文件 | /tmp /var/tmp | rm -rf /tmp/* (重启后自动清理的更安全) | 确认没有程序正在使用 |
| 旧内核 | /boot | apt autoremove 或 package-cleanup --oldkernels | 至少保留当前 + 上一个内核 |
| 用户下载/缓存 | /home/*/Downloads / .cache | 手工删除或 ncdu 交互式清理 | 用户数据,谨慎操作 |
| 数据库 binlog / wal | /var/lib/mysql / postgresql | 调整 retention 或 手工 purge binary logs | 误删会导致数据不可恢复 |
| 大型应用日志 | /var/log/nginx / /opt/app/logs | logrotate 配置 + 手工 > file.log 清空不删文件 | 清空前确认服务支持 reopen |
4. 推荐的清理安全顺序(降低误删风险)
- 先 df -h 确认哪个分区最紧急
- du -sh /* → 锁定前 3 名目录
- 进入嫌疑目录后 du -sh * | sort -hr 继续下钻
- 发现日志 → journalctl --vacuum-size=500M 或 --vacuum-time=1month
- 发现 docker → docker system df → docker system prune --all --force --volumes(谨慎)
- 发现缓存 → apt/dnf/yum clean
- 最后用 find 找全局大文件(>1GB)手工确认删除
- 清理完成后立即 df -h 验证效果
5. 交互式神器:ncdu(强烈推荐安装)
text
# Ubuntu/Debian
apt install ncdu
# Rocky/Alma/Fedora
dnf install ncdu
使用方式:
- ncdu /
- 上下箭头浏览目录
- d 删除(会二次确认)
- ? 查看帮助
优点:可视化、直观、支持跨分区统计、误删概率低得多。
6. 预防再次爆盘的 6 条生产建议
- 分区规划合理 /var 单独大分区(或 LVM 逻辑卷可扩容)
- 日志自动清理 journald.conf:SystemMaxUse=2G / MaxRetentionSec=90day logrotate 配置 daily + size 100M + rotate 7
- Docker 定期清理 crontab 每周跑 docker system prune -f
- 监控告警 df 使用率 >85% 发告警(Zabbix/Prometheus node_exporter + alertmanager)
- tmpfs 化 /tmp fstab 加入 tmpfs 挂载,限制大小
- 大文件扫描定时任务 每周 find / -xdev -type f -size +1G -ls > /root/bigfiles-$(date +%F).txt
总结思维模型
磁盘爆满排查口诀: “先 df 看全局 → du 找分区 → find 锁定文件 → 针对性清理 → 验证 + 预防”
最危险的操作永远是:不看清楚就 rm -rf /var/log/* 或 /var/lib/docker/* 养成“先统计 → 确认 → 备份或移走 → 再删”的习惯,能避免 99% 的误删灾难。
熟练掌握以上方法后,你就能在大多数情况下把磁盘从 98% 降到 60% 以内,且不影响业务连续性。