1. 引言
服务器或开发机运行久了,磁盘空间总会被各种缓存、日志、旧版本软件悄悄占满。尤其是 Docker 环境,/var/lib/docker 动辄占用几百 GB,让人头疼不已。
本文整理了一套从基础到进阶的 Ubuntu 磁盘清理方案,涵盖系统缓存、日志、Snap 旧版本、Docker 镜像与构建缓存,以及 VirtualBox 虚拟机磁盘回收,帮你一步步把空间找回来。
2. 基础清理:系统缓存与日志
在动 Docker 之前,先清理系统层面的垃圾,这些操作简单且安全。
2.1 清理 apt 缓存
sudo apt clean
sudo apt autoremove --purge -y
apt clean:删除下载的.deb安装包缓存。apt autoremove --purge:移除不再需要的依赖包,并同时删除其配置文件。
2.2 清理系统日志
# 将日志总大小限制为 20MB
sudo journalctl --vacuum-size=20M
# 只保留最近 3 天的日志
sudo journalctl --vacuum-time=3d
2.3 删除临时文件
sudo rm -rf /tmp/*
sudo rm -rf /var/tmp/*
2.4 清理应用日志(以 MySQL 为例)
# 删除 MySQL 日志文件,但保留 mysql 文件夹本身
sudo find /var/log/mysql -type f -name "*.log" -delete
2.5 查找大文件与大目录
# 查看占用空间最大的 30 个目录
sudo du -xh / 2>/dev/null | sort -h | tail -30
# 查找大于 100MB 的文件
sudo find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null
确认没用的缓存、旧内核、下载文件、回收站等,可以一并删除。
3. 清理 Snap 旧版本
Snap 会自动保留每个应用软件的多个旧版本,这是占用空间的主要原因。应该清理这些旧版本,而不是删除整个目录。
3.1 查看所有已安装的 Snap 及版本
snap list --all
3.2 手动删除特定软件的旧版本
先找到状态为 disabled 的旧版本,然后使用以下命令删除(将 <package-name> 和 <revision> 替换为实际值):
sudo snap remove <package-name> --revision=<revision>
3.3 使用脚本一键清理
运行以下脚本,它会自动找出并删除所有旧版本的 Snap:
#!/bin/bash
set -eu
snap list --all | awk '/disabled/{print $1, $3}' |
while read snapname revision; do
sudo snap remove "$snapname" --revision="$revision"
done
也可以使用 snap clean 这类社区维护的自动化脚本。
4. Docker 空间清理(保留 Docker 环境)
如果你以后还想用 Docker,只是要把堆积的镜像、缓存和临时文件删掉,请按以下步骤操作。
4.1 查看空间占用情况
docker system df
这会显示镜像、容器、卷和构建缓存分别占了多少。想看更详细的空间分布,可以用:
docker system df -v
4.2 一键深度清理
# -a:删除所有未使用的镜像;-f:强制确认;--volumes:删除未使用的卷
docker system prune -a -f --volumes
⚠️ 警告:
--volumes会删除所有未被容器使用的数据卷。如果你的数据库(如 MySQL)数据存放在 Docker 卷中且当前没有容器在使用它,数据会永久丢失。如果你不确定,先去掉--volumes,只运行docker system prune -a -f,这样只会删镜像和缓存,最安全。
4.3 手动清理构建缓存
如果上面的命令释放得不够多,单独清理构建缓存通常能放出几十 GB:
docker builder prune -a -f
4.4 查看镜像数量与大小
统计镜像总数量:
docker images -q | wc -l
查看详细列表(含大小、标签):
docker images
# 或者
docker image ls
输出示例:
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 22.04 abc123def456 2 days ago 77.8MB
nginx latest 123abc456def 1 week ago 142MB
按大小排序,找出最大的镜像:
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" | sort -k 3 -h
查看镜像总数 + 占用总空间:
docker system df
输出示例:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 15 3 2.345GB 1.8GB (77%)
Containers 5 2 100MB 50MB (50%)
Local Volumes 2 1 1.2GB 0B (0%)
Build Cache 10 0 500MB 500MB (100%)
只看悬空镜像(<none>)的数量:
docker images -f "dangling=true" -q | wc -l
4.5 结合场景的清理策略
如果 /var/lib/docker 占了 439GB,可以先跑 docker system df 确认其中 Images 占了多少、Build Cache 占了多少。
- 如果 Images 数量非常多(比如几百个),说明是旧版本堆积的问题,直接跑以下命令一键删除 7 天前的旧版本:
docker image prune -a -f --filter "until=168h"
- 执行完后,再用
docker images -q | wc -l对比清理前后的数量,就能直观看到效果。
5. Docker 深度清理:从日志到完全重置
5.1 清理容器日志(隐藏的百G杀手)
很多时候,438G 里有一大半是容器内部产生的标准输出日志,它们堆积在 /var/lib/docker/containers/ 下。这个操作不需要 Docker 命令,且几乎不会有风险。
# 一键清空所有容器的日志文件(保留文件,清空内容)
sudo find /var/lib/docker/containers -name "*-json.log" -exec truncate -s 0 {} \;
执行完这一步后,请立即运行 df -h /var/lib/docker 查看。如果空间释放了 100G 以上,说明找到了主要元凶。
5.2 精准诊断剩余占用
接下来查看 Docker 内部到底是谁在吃空间(此时磁盘已有余量,命令可以跑完):
docker system df
如果输出显示 Images(镜像)和 Build Cache(构建缓存)占了大头,继续往下执行。
5.3 分层清理(按释放力度排序)
第 1 步:清理构建缓存(最安全,常常超大)
如果你经常用 docker build,缓存很容易堆积到几十甚至上百 G:
docker builder prune -a -f
第 2 步:清理 7 天前的旧镜像(保留近期版本)
docker image prune -a -f --filter "until=168h"
(168h 即 7 天,可改为 720h 即 30 天)
第 3 步:终极清理(删除所有未使用的资源)
如果上面两步释放得不够,且你确定没有重要数据,执行:
docker system prune -a -f --volumes
⚠️ 警告:
--volumes会删除所有未被容器使用的数据卷。如果你的数据库数据放在卷里且容器已停止,数据会永久丢失。
5.4 核弹级清空(完全重置 Docker)
如果你这台机器打算彻底不再用 Docker,或者想推倒重来,直接物理删除是最快的:
sudo systemctl stop docker
sudo rm -rf /var/lib/docker
sudo systemctl start docker
执行后相当于新装 Docker,所有镜像、容器、网络全部归零。
6. VirtualBox 宿主机回收空间
这是最关键的一步!无论你在虚拟机里删了多少文件,宿主机的 .vdi 文件不会自动缩小。为了让宿主机真正腾出几百 G 空间,务必执行以下操作。
6.1 在 Ubuntu 内把空闲空间填 0
利用刚腾出来的大空位:
# 报错磁盘满后,删除它
sudo dd if=/dev/zero of=/var/lib/deleteme
sudo rm -f /var/lib/deleteme
6.2 关闭虚拟机
sudo shutdown now -h
6.3 在宿主机(Windows/macOS)命令行执行压缩
VBoxManage modifymedium disk "你的磁盘.vdi" --compact
Windows 下完整路径示例:
cd "C:\Program Files\Oracle\VirtualBox"
.\VBoxManage.exe modifymedium disk "你的Ubuntu.vdi路径" --compact
6.4 可选:TRIM 支持
如果虚拟机磁盘开启了 TRIM 支持,也可以执行:
sudo fstrim -v /dev/sdb2
7. 总结与操作顺序建议
| 步骤 | 操作 | 风险等级 | 释放空间 |
|---|---|---|---|
| 1 | 清容器日志(truncate) | 低 | 可能 100G+ |
| 2 | 清构建缓存(builder prune) | 低 | 几十 G |
| 3 | 清 7 天前镜像(image prune --filter) | 中 | 视镜像数量 |
| 4 | system prune -a 或 rm -rf | 高 | 全部 |
| 5 | VirtualBox .vdi 压缩 | 低 | 宿主机空间 |
参考:




369

被折叠的 条评论
为什么被折叠?



