文章目录
1. 快速定位大文件和目录
首先,使用以下命令找出占用空间最大的目录(从根目录开始,但可能需要一些时间):
sudo du -sh /* 2>/dev/null | sort -hr | head -n 20
这个命令会显示根目录下前20个最大的项目。然后您可以逐级深入排查,例如如果发现 /var 很大,就继续检查 /var:
sudo du -sh /var/* 2>/dev/null | sort -hr | head -n 20
更高效的工具
如果系统有 ncdu 工具(推荐安装),可以更直观地分析:
# 安装 ncdu
sudo yum install ncdu
# 扫描根目录
sudo ncdu / --exclude /proc --exclude /sys
2. 重点检查目标(基于您的环境)
根据您安装的软件,以下目录最可能是"罪魁祸首":
A. Docker 相关
Docker 是常见的磁盘空间杀手,尤其是镜像和容器存储。
# 查看 Docker 占用空间
sudo du -sh /var/lib/docker/
# 详细查看 Docker 各组成部分大小
sudo docker system df
B. Maven 本地仓库
Maven 的本地仓库会缓存所有下载的依赖包,很容易变得非常大。
# 通常位于用户主目录下,Jenkins 用户可能是 /var/lib/jenkins
sudo du -sh ~/.m2/repository/
# 或者
sudo du -sh /var/lib/jenkins/.m2/repository/
C. Jenkins 工作空间和构建记录
Jenkins 会保留每次构建的工作空间和构建记录。
# 检查 Jenkins 工作空间
sudo du -sh /var/lib/jenkins/workspace/
# 检查 Jenkins 构建记录
sudo du -sh /var/lib/jenkins/jobs/*/builds/
D. Node.js 和 Vue 相关
Vue 项目的 node_modules 目录非常庞大,构建过程中也可能产生大量缓存。
# 查找所有 node_modules 目录
sudo find / -name "node_modules" -type d -exec du -sh {} \; 2>/dev/null | sort -hr | head -n 10
# 检查 npm 缓存
sudo du -sh ~/.npm/
E. 系统日志文件
系统和服务日志可能会占用大量空间。
# 检查日志目录大小
sudo du -sh /var/log/
# 检查最大的日志文件
sudo find /var/log -type f -name "*.log" -exec du -h {} \; 2>/dev/null | sort -hr | head -n 10
3. 清理方案
清理 Docker
第 1 步:查询空间情况
# 这个命令非常有用,它会详细列出镜像、容器、卷、缓存等的大小
sudo docker system df
第 2 步:安全清理(推荐)
这些命令会安全地删除未被使用 的资源,不会影响正在运行的容器和其依赖的镜像。
1.删除所有已停止的容器、未被使用的网络和 dangling 镜像(悬空镜像,即未打标签的镜像) :
sudo docker system prune
这是一个最基本的清理命令,非常安全。
2.删除所有未被使用的镜像(而不仅仅是 dangling 镜像) :
sudo docker image prune -a
注意 :这会删除所有没有被任何容器引用的镜像(包括停止的容器)。如果你有多个项目,有些镜像虽然当前没运行,但以后可能会用,需要谨慎。系统会交互式地让你确认。
第 3 步:治本之策(预防措施)
清理之后,需要建立习惯和机制防止空间再次被快速占满。
- 在 Docker Compose 中运行后自动清理 :
使用
docker-compose down --rmi all
或
docker-compose down -v
来在停止服务的同时删除相关镜像或卷。
- 设置 Docker 日志轮转(非常有效) :
Docker 容器日志是另一个“空间杀手”。默认情况下,日志文件会无限增长。通过修改 /etc/docker/daemon.json 文件来限制日志大小和数量:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
- 修改后需要重启 Docker 服务:
sudo systemctl restart docker
注意 :这只会影响新创建 的容器。对于已存在的容器,你需要重建它们。
- 定期清理脚本 :
可以创建一个定时任务(Cron Job),例如每周凌晨执行一次安全清理:
# 编辑 cron 任务
sudo crontab -e
# 添加一行
0 3 * * 0 /usr/bin/docker system prune -f
- 迁移 Docker 数据根目录 :
如果 / 根分区实在太小,可以考虑将 Docker 的默认存储目录 /var/lib/docker
迁移到一个更大的磁盘分区上。这是一个相对复杂的操作,需要停止 Docker 服务后移动整个目录并建立软链接。
3.清理所有内容(包括构建缓存) :
# 这个命令最彻底,会删除所有已停止的容器、所有未被任何容器引用的网络、所有 dangling 和未被引用的镜像、以及构建缓存。
sudo docker system prune -a --volumes
警告 :–volumes 会删除未被使用的命名卷 ,请确保你知道哪些卷是重要的(如数据库数据)。匿名卷通常会被自动清理。
清理 Maven 仓库
# 删除失败的下载和临时文件
find ~/.m2/repository -name "*.lastUpdated" -exec rm -f {} \;
# 清理旧的依赖包(谨慎操作,可能会破坏项目构建)
# 可以手动删除一些明确不再使用的依赖目录
清理 Jenkins
- 在 Jenkins 界面中配置"丢弃旧的构建"
- 对于不需要的 jobs,可以直接删除其 workspace
# 清理 Jenkins 工作空间(确保相关任务已停止)
sudo rm -rf /var/lib/jenkins/workspace/<job-name>/*
清理 npm 缓存
# 清理 npm 缓存
npm cache clean --force
# 或者直接删除缓存目录
rm -rf ~/.npm/_cacache
清理系统日志
# 清空日志文件(而不是删除,避免影响正在运行的服务)
sudo truncate -s 0 /var/log/some-large-log.log
# 使用 logrotate 管理日志
sudo logrotate -f /etc/logrotate.conf
# 删除旧的日志文件
sudo find /var/log -name "*.log.*" -type f -mtime +7 -delete
sudo find /var/log -name "*.gz" -type f -mtime +7 -delete
清理系统包缓存
# 清理 yum 缓存
sudo yum clean all
sudo rm -rf /var/cache/yum