Linux 服务器磁盘分析与清理实战指南
适用于 CentOS / Ubuntu / Rocky 等常见发行版。本文总结自多次真实磁盘爆满排查经验,命令均可直接复制使用。
先说结论
指南可直接复制到 CSDN,命令均经实战验证。核心思路:df 看分区 → du 逐层下钻 → 定位元凶 → 迁移/清理 → 配自动任务防复发。
目录标题
- [Linux 服务器磁盘分析与清理实战指南](#Linux 服务器磁盘分析与清理实战指南)
-
- 先说结论
- 一、快速定位:磁盘到底满在哪?
-
- [1. 查看各分区使用率](#1. 查看各分区使用率)
- [2. 找出最占空间的目录(根因定位)](#2. 找出最占空间的目录(根因定位))
- [3. 查找大文件(>1G)](#3. 查找大文件(>1G))
- 二、高频"爆盘"元凶清单
- [三、MySQL 备份清理(最常见场景)](#三、MySQL 备份清理(最常见场景))
-
- 现象
- [保留策略 + 清理命令](#保留策略 + 清理命令)
- 迁移到空闲分区(推荐)
- [四、Docker 清理](#四、Docker 清理)
-
- [Docker 存储迁移到大数据盘](#Docker 存储迁移到大数据盘)
- [五、/root 目录异常巨大](#五、/root 目录异常巨大)
- [六、Conda / Python 环境清理](#六、Conda / Python 环境清理)
- 七、日志清理
- [八、LVM 分区扩容(空间分配不均时)](#八、LVM 分区扩容(空间分配不均时))
- 九、自动化定期清理(防复发)
-
- [每月清理脚本示例(CentOS/Ubuntu 通用)](#每月清理脚本示例(CentOS/Ubuntu 通用))
- [加入 crontab(每月 1 号 02:00)](#加入 crontab(每月 1 号 02:00))
- 十、排查检查清单(Checklist)
- [附:Windows 侧常见爆盘(参考)](#附:Windows 侧常见爆盘(参考))
📋 请先执行
bash
1. 查看 /root 下到底是什么
du -sh /root/* 2>/dev/null | sort -rh | head -20
# 2. 查看 MySQL 备份内容
du -sh /data/back/mysql/* 2>/dev/null | sort -rh | head -20

一、快速定位:磁盘到底满在哪?
1. 查看各分区使用率
bash
df -Th
重点关注 Use% 接近 90% 的分区。
2. 找出最占空间的目录(根因定位)
bash
# 查看根目录下各文件夹大小
du -sh /* 2>/dev/null | sort -rh | head -20
# 逐层下钻,例如定位 /data
du -sh /data/* 2>/dev/null | sort -rh | head -20
# 继续下钻
du -sh /data/back/mysql/* 2>/dev/null | sort -rh | head -20
3. 查找大文件(>1G)
bash
find / -type f -size +1G -exec ls -lh {} \; 2>/dev/null | head -20
二、高频"爆盘"元凶清单
根据实战统计,90% 的 Linux 磁盘爆满来自以下几类:
| 元凶 | 典型路径 | 特征 | 处理 |
|---|---|---|---|
| MySQL 每日备份 | /data/back/mysql/data/2026xxxx |
按日期每天一个文件夹,每个数 GB | 迁移 + 保留策略 |
| /root 误存数据 | /root/data、/root/logs |
/root 本应只有几 GB,却达数百 G | 移走或清理 |
| Docker 镜像/容器 | /var/lib/docker/overlay2 |
overlay 挂载点大量占用 | docker system prune |
| Conda/Python 环境 | /usr/local/soft/py、miniconda |
数百 GB 的 AI/ML 库 | conda clean |
| 日志文件 | /var/log、应用 logs |
持续增长不轮转 | logrotate + 手动清 |
| 应用缓存 | 缓存目录 |
累积型 | 定期清理 |
三、MySQL 备份清理(最常见场景)
现象
/data/back/mysql/data/ 下每天生成一个 3~4 GB 的日期文件夹,一年可占 1TB+。
保留策略 + 清理命令
bash
# 只保留最近 90 天(3个月)的备份
find /data/back/mysql/data -maxdepth 1 -type d -name "202*" -mtime +90 -exec rm -rf {} +
# 查看当前共有多少天备份
ls -d /data/back/mysql/data/202* | wc -l
迁移到空闲分区(推荐)
当 /data 空间不足、而 / 有 1.4T 空闲时:
bash
# 1. 在空闲分区创建新目录
mkdir -p /mysql_backup/data
# 2. 迁移历史备份(数据量大,建议后台执行)
mv /data/back/mysql/data/* /mysql_backup/data/
# 3. 修改备份脚本中的路径(关键!)
# 将脚本里 /data/back/mysql/data 改为 /mysql_backup/data
# 4. 在新位置设置 90 天自动清理
find /mysql_backup/data -maxdepth 1 -type d -name "202*" -mtime +90 -exec rm -rf {} +
⚠️ 务必先修改备份脚本路径再移动,否则备份任务会写失败。
四、Docker 清理
bash
# 查看 Docker 各类型占用
docker system df
# 删除所有未使用镜像/容器/网络(不删挂载卷)
docker system prune -a
# 连挂载卷一起删(谨慎!会丢数据)
docker system prune -a --volumes
# 清理构建缓存
docker builder prune
Docker 存储迁移到大数据盘
bash
systemctl stop docker
mkdir -p /data/docker
rsync -aP /var/lib/docker/ /data/docker/
mv /var/lib/docker /var/lib/docker.bak
ln -s /data/docker /var/lib/docker
systemctl start docker
docker info | grep "Docker Root Dir"
五、/root 目录异常巨大
现象
du -sh /root 返回数百 GB,明显异常。
排查
bash
du -sh /root/* 2>/dev/null | sort -rh | head -20
处理
/root/data多为误放的应用数据 → 移动到/data或大数据盘/root/logs多为日志 → 清理或配置logrotate
bash
# 移动误存数据
mv /root/data /data/old_root_data
# 清理日志(确认无用后)
rm -rf /root/logs/*.log
六、Conda / Python 环境清理
bash
# 清理 conda 缓存、未使用包
conda clean -a
# 清理 pip 缓存
pip cache purge
# 删除不需要的虚拟环境
conda env remove -n 环境名
若
/usr/local/soft/py占用 800GB,多为 AI 框架(PyTorch/TensorFlow),确认无用的环境直接删除。
七、日志清理
bash
# 系统日志
journalctl --vacuum-size=100M # 限制 journal 日志大小
# 手动清理指定日志
rm -f /var/log/*.log.*
rm -f /var/log/messages-*
# 配置自动轮转(编辑后生效)
vim /etc/logrotate.conf
八、LVM 分区扩容(空间分配不均时)
当根分区满、但 /home 很空(常见于 CentOS 默认分区):
bash
# 查看卷组剩余空间
vgs
# 从 home 减 20G 给 root(示例)
lvreduce -L -20G /dev/centos/home
lvextend -L +20G /dev/centos/root
xfs_growfs / # xfs 文件系统在线扩容
⚠️ 缩容有风险,操作前务必备份数据。
九、自动化定期清理(防复发)
每月清理脚本示例(CentOS/Ubuntu 通用)
bash
cat > /opt/cleanup_disks.sh << 'EOF'
#!/bin/bash
# 保留 MySQL 备份 90 天
find /mysql_backup/data -maxdepth 1 -type d -name "202*" -mtime +90 -exec rm -rf {} +
# 清理 Docker
docker system prune -a -f
# 清理journal日志
journalctl --vacuum-size=200M
echo "$(date) cleanup done" >> /var/log/cleanup.log
EOF
chmod +x /opt/cleanup_disks.sh
加入 crontab(每月 1 号 02:00)
bash
crontab -e
# 添加:
0 2 1 * * /opt/cleanup_disks.sh
十、排查检查清单(Checklist)
-
df -Th找出高占用分区 -
du -sh /*逐层定位大目录 - 检查 MySQL 备份是否过量
- 检查
/root、/home是否误存数据 - 检查 Docker 占用并清理
- 检查日志是否轮转
- 修改备份脚本路径(迁移后)
- 配置自动清理 cron 任务
- 确认重要数据已备份再删除
附:Windows 侧常见爆盘(参考)
| 位置 | 典型占用 | 处理 |
|---|---|---|
C:\Users\...\AppData\Local\LiteSandbox\logs |
单文件可达 156GB | 停止占用进程后删除 |
D:\Program Files\Notepad++\...\notepad-back |
SQL 备份数 GB~10GB+ | 确认后删除 |
休眠文件 hiberfil.sys |
数 GB | powercfg -h off |
💡 核心思路 :
df看分区 →du逐层下钻 → 定位元凶 → 迁移或清理 → 配自动任务防复发。