磁盘空间去哪了:分析与清理
「磁盘快满了」几乎是每个 Ubuntu 用户都会遇到一次的事。麻烦的地方在于,df 只告诉你满了,不告诉你是谁占的。这篇从定位到清理,给出可复现的顺序。
第一步:确认到底多满
df -h输出里看 Use% 那一列,重点关注挂载点 /(根分区)和 /home(如果单独分区)。
图形界面的等价物是「磁盘」应用里选中分区后看到的使用条,或者文件管理器侧栏底部的容量条。
第二步:找出大目录
命令行的 du 能算,但要一层层试:
# 当前目录下每个子目录的大小,按大到小排
du -h --max-depth=1 . | sort -hr | head更直观的办法是装磁盘占用分析器(baobab),一次扫描出整棵目录树:
sudo apt install baobab
baobab /home/$USER它启动时直接开始扫描你给的路径,扫完是这样:

几个使用要点:
- 左边列表按大小排序,箭头展开下一层,比环形图更适合精确定位
- 右下角可以切「树状图」,方块面积就是占用比例,一眼看到哪块最大
- 图上这张是刚装好的虚拟机,
snap目录一家就占了 87%——这不是异常,Snap 应用每个版本都留一份
扫 ~ 只需要几秒,扫 / 要几分钟(会遍历整个系统)。日常排查先扫 ~,发现不了再扫 /。
第三步:清理几个固定的大户
Snap 的旧版本
Snap 默认保留最近几个版本用于回滚,每个版本都是完整的一份程序。上面截图里 snap 占 87% 就是这么来的。
# 只保留 2 个版本(默认是 3)
sudo snap set system refresh.retain=2
# 删掉所有已禁用的旧版本
sudo snap list --all | awk '/disabled/{print $1, $3}' | while read name rev; do
sudo snap remove "$name" --revision="$rev"
doneapt 下载的安装包
# 清空 /var/cache/apt/archives
sudo apt clean
# 顺便清掉不再需要的依赖
sudo apt autoremove --purgesystemd 日志
journalctl 的日志默认能涨到几个 G:
# 只保留最近 200 MB
sudo journalctl --vacuum-size=200M
# 或者只保留最近 7 天
sudo journalctl --vacuum-time=7d用户缓存
浏览器、缩略图、各种应用的缓存都在 ~/.cache:
du -h --max-depth=1 ~/.cache | sort -hr | head删之前想清楚——浏览器缓存删了会重新下载,但登录状态一般还在;缩略图缓存(~/.cache/thumbnails)可以随便删。
第四步:还是不够用
清完只是治标,真要更大空间得扩容或迁移:
- 虚拟机:先在虚拟机设置里扩大虚拟磁盘,再到系统里扩分区(
growpart+resize2fs) - 物理机:加一块硬盘,格式化和挂载见磁盘、挂载、fstab
- 搬家:把
~/下载、Docker 数据目录这类大目录迁到新盘,用fstab自动挂载
常见问题
df 显示满了,但 du 加起来没那么多
这是最经典的一个坑:文件被删了,但仍有进程打开着它。空间只有等进程关闭才会真正释放。
# 找出已被删除但仍被占用的文件
sudo lsof +L1 2>/dev/null | head常见元凶是还在运行的日志写入进程,重启对应服务即可(比如 sudo systemctl restart <服务名>)。
提示 No space left on device,但 df 显示还有空间
可能是 inode 用尽,尤其是小文件特别多的场景(比如大量邮件、容器层)。
# 看 inode 使用率
df -iIUse% 到 100% 就是这个问题,清理思路和清空间一样,但要删的是大量小文件,不是大文件。
想定期自动清理
systemd-tmpfiles 已经会清理 /tmp 和部分缓存,一般不用自己写。要定时清 apt 缓存,可以加一条 systemd timer 或 cron:
# 每周日清理 apt 缓存
0 3 * * 0 root /usr/bin/apt clean写进 /etc/cron.d/apt-clean 即可。
相关文章
- 磁盘、挂载、fstab — 分区、格式化与开机自动挂载
- 性能监控 — htop 与系统监视器
- 日志管理(journalctl) — 日志占用与轮转策略