磁盘空间不足是 Linux 服务器最常见、最容易导致服务中断的故障之一(尤其是 /var 爆满后 journald、docker、mysql、nginx 日志等会直接卡死)。 本篇聚焦服务器真实场景中最有效的查看 → 定位 → 清理 → 预防全流程,强调实用性和安全性,避免盲目 rm -rf 造成更大灾难。
| 命令 | 核心价值 | 推荐写法 | 何时优先用 |
|---|---|---|---|
| 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` |
典型输出解读示例:
第 1 层:根目录一级子目录排序 du -sh /* 2>/dev/null | sort -hr | head -15
最常见前三名:
第 2 层:锁定嫌疑目录后继续下钻 示例:/var 占大头 du -sh /var/* 2>/dev/null | sort -hr | head -10
常见子目录:
第 3 层:锁定具体罪魁祸首
第 4 层:找出具体大文件(跨文件系统最强工具)
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 跨挂载点搜索其他磁盘,浪费时间。
| 占用来源 | 典型路径 | 安全清理方式(优先级从高到低) | 注意事项与风险点 |
|---|---|---|---|
| 系统日志 | /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 |
# Ubuntu/Debian
apt install ncdu
# Rocky/Alma/Fedora
dnf install ncdu
使用方式:
优点:可视化、直观、支持跨分区统计、误删概率低得多。
磁盘爆满排查口诀: “先 df 看全局 → du 找分区 → find 锁定文件 → 针对性清理 → 验证 + 预防”
最危险的操作永远是:不看清楚就 rm -rf /var/log/* 或 /var/lib/docker/* 养成“先统计 → 确认 → 备份或移走 → 再删”的习惯,能避免 99% 的误删灾难。
熟练掌握以上方法后,你就能在大多数情况下把磁盘从 98% 降到 60% 以内,且不影响业务连续性。