Skip to Content
文档运维系统管理磁盘空间分析与清理

磁盘空间去哪了:分析与清理

「磁盘快满了」几乎是每个 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.26%、119.9 MB,.cache 占 12.08%、16.6 MB,右侧是环形图,中间显示总计 137.4 MB,底部有环形图和树状图两个切换按钮
磁盘占用分析器:左边是带百分比的目录列表,右边是环形图,点任意扇区可以继续往下钻

几个使用要点:

  • 左边列表按大小排序,箭头展开下一层,比环形图更适合精确定位
  • 右下角可以切「树状图」,方块面积就是占用比例,一眼看到哪块最大
  • 图上这张是刚装好的虚拟机,snap 目录一家就占了 87%——这不是异常,Snap 应用每个版本都留一份
Tip

扫 ~ 只需要几秒,扫 / 要几分钟(会遍历整个系统)。日常排查先扫 ~,发现不了再扫 /。

第三步:清理几个固定的大户

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" done

apt 下载的安装包

# 清空 /var/cache/apt/archives sudo apt clean # 顺便清掉不再需要的依赖 sudo apt autoremove --purge

systemd 日志

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 -i

IUse% 到 100% 就是这个问题,清理思路和清空间一样,但要删的是大量小文件,不是大文件。

想定期自动清理

systemd-tmpfiles 已经会清理 /tmp 和部分缓存,一般不用自己写。要定时清 apt 缓存,可以加一条 systemd timer 或 cron:

# 每周日清理 apt 缓存 0 3 * * 0 root /usr/bin/apt clean

写进 /etc/cron.d/apt-clean 即可。

相关文章

Last updated on