WSL 磁盘清理实战:从缓存清理到 ext4.vhdx 压缩回收空间

4 阅读7分钟

WSL 磁盘清理实战:从缓存清理到 ext4.vhdx 压缩回收空间

在长期使用 WSL(Windows Subsystem for Linux)的过程中,很多人都会遇到一个典型问题:Linux 内部已经删掉了很多文件,但 Windows 侧的 ext4.vhdx 仍然持续膨胀,磁盘空间并没有真正回收。

这篇文章整理了一套实际可执行的 WSL 清理流程,涵盖以下几个关键环节:

  • 检查 WSL 与各发行版状态
  • 分析 Linux 文件系统占用情况
  • 清理 APT 缓存和用户缓存
  • 回收 Docker 无用镜像与构建缓存
  • 关闭 WSL 后压缩 ext4.vhdx
  • 复核清理结果与剩余大目录

如果你也在 Windows 上跑多个 Ubuntu 发行版,或者用 WSL 承载 Docker / 开发环境,这套流程基本可以直接复用。🚀


一、问题本质:为什么删了文件,Windows 磁盘还是没变小?

WSL2 的 Linux 文件系统通常保存在一个虚拟磁盘文件中,也就是 Windows 侧看到的 ext4.vhdx

需要注意两点:

  1. Linux 内部删除文件,只是释放了文件系统中的可用空间
  2. Windows 侧的 ext4.vhdx 不会自动缩小

也就是说,即使你已经在 Ubuntu 里删掉了大量缓存、镜像、日志或临时文件,Windows 磁盘占用也可能暂时看不到变化。

所以,完整回收空间通常需要两步:

  • 先在 Linux 内部清理无用数据
  • 再在 Windows 侧对 ext4.vhdx 做压缩

二、清理前先做状态检查

建议先确认当前 WSL 状态,以及机器上有哪些发行版正在运行。

wsl --status
wsl -l -v
wsl --list --running

如果需要快速看某个发行版根分区的空间使用情况:

wsl -d <DistroName> -- df -h /

同时,也建议在 Windows 侧查看各发行版对应的 ext4.vhdx 文件大小。路径通常位于:

%LOCALAPPDATA%\Packages\...\LocalState\ext4.vhdx

这样可以建立一个清理前基线,方便后续对比效果。


三、先从 Linux 内部找出“大户”

真正清理之前,最好先确认空间到底被谁占了。

1)查看根目录一级占用

wsl -d Ubuntu --user root -- sh -lc "du -xh -d 1 / 2>/dev/null | sort -h"
wsl -d Ubuntu-22.04 --user root -- sh -lc "du -xh -d 1 / 2>/dev/null | sort -h"
wsl -d Ubuntu-24.04 --user root -- sh -lc "du -xh -d 1 / 2>/dev/null | sort -h"

2)继续深挖 /var 等高风险目录

wsl -d Ubuntu --user root -- sh -lc "du -xh -d 1 /var 2>/dev/null | sort -h && du -sh /var/cache /var/cache/apt /var/lib/apt /var/lib/docker /root/.cache /home/*/.cache 2>/dev/null"

这一步通常能快速定位以下几类高占用目录:

  • /var/lib/docker
  • /var/cache/apt
  • /var/lib/apt/lists
  • /root/.cache
  • /home/<user>/.cache
  • 各类语言或工具链缓存目录(如 .npm.cargo.gradle.rustup.venv 等)

⚠️ 建议先看清楚再删。 不是所有大目录都适合直接清理,尤其是仍在使用的项目依赖、镜像或虚拟环境。


四、清理 APT 元数据和常见缓存

对于日常开发环境来说,APT 缓存和 ~/.cache 往往是最安全、最容易回收的一部分。

wsl -d Ubuntu --user root -- sh -lc "apt-get clean; rm -rf /var/lib/apt/lists/*; for d in /root/.cache /home/*/.cache; do [ -d \"$d\" ] && find \"$d\" -mindepth 1 -maxdepth 1 -exec rm -rf {} +; done"
wsl -d Ubuntu-22.04 --user root -- sh -lc "apt-get clean; rm -rf /var/lib/apt/lists/*; for d in /root/.cache /home/*/.cache; do [ -d \"$d\" ] && find \"$d\" -mindepth 1 -maxdepth 1 -exec rm -rf {} +; done"
wsl -d Ubuntu-24.04 --user root -- sh -lc "apt-get clean; rm -rf /var/lib/apt/lists/*; for d in /root/.cache /home/*/.cache; do [ -d \"$d\" ] && find \"$d\" -mindepth 1 -maxdepth 1 -exec rm -rf {} +; done"

这一步会做什么?

  • 清理 apt 下载缓存
  • 删除 apt 包索引列表
  • 清理 root 用户和普通用户的 ~/.cache 内容

风险说明

  • 大部分缓存之后都可以自动重建
  • 下次执行 apt update 时,包索引会重新下载
  • 某些开发工具第一次重新启动时可能略慢,这是正常现象

总体来说,这一步通常收益稳定、风险较低。✅


五、Docker 往往才是最大空间黑洞

如果你的 WSL 发行版中运行过 Docker,那么 /var/lib/docker 很可能就是罪魁祸首。

可以使用以下命令清理无用资源:

wsl -d Ubuntu --user root -- sh -lc "docker system prune -af && docker builder prune -af && docker system df"
wsl -d Ubuntu-22.04 --user root -- sh -lc "docker system prune -af && docker builder prune -af && docker system df"
wsl -d Ubuntu-24.04 --user root -- sh -lc "docker system prune -af && docker builder prune -af && docker system df"

这一步会回收什么?

  • 未使用的镜像
  • 已停止的容器
  • 未使用的网络
  • 构建缓存(build cache)

风险说明

⚠️ docker system prune -af 是有破坏性的。

它会删除当前未被容器使用的镜像和缓存。如果你依赖本地镜像做离线开发、快速构建或环境复现,请先确认是否真的可以删。

建议在执行前先看一下:

wsl -d Ubuntu --user root -- sh -lc "docker system df"

如果空间压力很大,而镜像又都可重复拉取/重建,那么这一步往往是最有效的回收手段。💡


六、关闭 WSL,为压缩虚拟磁盘做准备

在 Windows 压缩 ext4.vhdx 之前,必须确保 WSL 已完全关闭。

wsl --shutdown

这是必需步骤。否则虚拟磁盘仍处于挂载或占用状态,压缩很可能失败,或者压缩效果不明显。


七、在 Windows 侧压缩 ext4.vhdx

完成 Linux 内部清理之后,就可以从 Windows 管理员 PowerShell 执行压缩。

Optimize-VHD -Path "C:\Users\<YourUser>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx" -Mode Full
Optimize-VHD -Path "C:\Users\<YourUser>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx" -Mode Full
Optimize-VHD -Path "C:\Users\<YourUser>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu24.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx" -Mode Full

注意事项

  • 需要 管理员权限
  • 需要目标发行版已经执行过 wsl --shutdown
  • 不同机器上的包名路径可能不同,请按实际情况替换

如果你的环境尚未启用相关 Hyper-V / 虚拟磁盘管理能力,可能还需要先确认 PowerShell 与系统组件是否支持 Optimize-VHD


八、一次实际清理的回收结果

下面是一组实际清理结果,供参考。

回收的 Docker 空间

  • Ubuntu:约 689MB
  • Ubuntu-22.04:约 17.73GB
  • Ubuntu-24.04:约 74.83MB

ext4.vhdx 压缩前后变化

  • Ubuntu199.23 GB113.97 GB
  • Ubuntu-22.0450.28 GB33.43 GB
  • Ubuntu-24.0430.04 GB23.14 GB

Linux 内最终根分区使用量

  • Ubuntu97G used on /
  • Ubuntu-22.0430G used on /
  • Ubuntu-24.0421G used on /

从结果可以看到,真正显著的空间回收通常来自两部分叠加:Docker 清理 + VHDX 压缩。


九、清理后仍然占空间的常见目录

即使完成以上步骤,某些目录仍然可能长期占用大量空间。

Ubuntu 中常见的大目录

  • /home 体积较大
  • 用户目录中的资料文件夹
  • ~/.deepv
  • ~/.venv
  • ~/.rustup
  • ~/.npm
  • ~/.cline

Ubuntu-22.04 中常见的大目录

  • /var/lib/docker(清理前通常最明显)
  • ~/.npm
  • ~/.nuget
  • ~/.nvm
  • 各类项目目录

Ubuntu-24.04 中常见的大目录

  • ~/.npm
  • ~/.nvm

如果你想继续细化排查,可以执行:

wsl -d Ubuntu --user root -- sh -lc "du -xh -d 2 /home 2>/dev/null | sort -h"

这条命令对于定位用户目录下的“大户”特别有效。


十、建议优先排查的目录

如果清理后空间仍不理想,可以进一步检查以下目录:

  • ~/.npm
  • ~/.cargo
  • ~/.nuget
  • ~/.gradle
  • ~/.rustup
  • 不再使用的虚拟环境(如 ~/.venv
  • 长期堆积的大型项目目录
  • 下载目录、模型目录、缓存目录

⚠️ 这一步不建议“一刀切”删除,最好逐项确认用途后再处理。


十一、一份适合复用的 WSL 清理 Checklist

如果你只想快速执行,可以按下面顺序操作:

  1. 检查 WSL 与发行版状态
  2. 统计 Linux 文件系统占用
  3. 查看 Windows 侧 ext4.vhdx 大小
  4. 清理 APT 缓存与用户缓存
  5. 清理 Docker 无用镜像与构建缓存
  6. 执行 wsl --shutdown
  7. 使用 Optimize-VHD -Mode Full 压缩虚拟磁盘
  8. 再次检查 Linux 占用与 VHDX 大小

十二、结语

WSL 磁盘清理的关键不只是“删文件”,而是理解Linux 内部释放空间Windows 侧回收虚拟磁盘体积是两件不同的事。

如果你只是清理缓存,而没有压缩 ext4.vhdx,最终往往只能看到“Linux 内变干净了”,却看不到 Windows 磁盘真正变小。

一个相对稳妥、通用的清理策略是:

  • 先分析占用来源
  • 先清低风险缓存
  • 再清 Docker 等高收益区域
  • 最后统一关机并压缩 VHDX

这样做既更安全,也更容易获得可观的空间回收效果。✨

如果你经常在 WSL 里跑容器、构建环境或 AI/DevOps 工具链,建议把这套流程整理成自己的定期维护 SOP,会很省磁盘,也很省心。