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。
需要注意两点:
- Linux 内部删除文件,只是释放了文件系统中的可用空间
- 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:约689MBUbuntu-22.04:约17.73GBUbuntu-24.04:约74.83MB
ext4.vhdx 压缩前后变化
Ubuntu:199.23 GB→113.97 GBUbuntu-22.04:50.28 GB→33.43 GBUbuntu-24.04:30.04 GB→23.14 GB
Linux 内最终根分区使用量
Ubuntu:97Gused on/Ubuntu-22.04:30Gused on/Ubuntu-24.04:21Gused 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
如果你只想快速执行,可以按下面顺序操作:
- 检查 WSL 与发行版状态
- 统计 Linux 文件系统占用
- 查看 Windows 侧
ext4.vhdx大小 - 清理 APT 缓存与用户缓存
- 清理 Docker 无用镜像与构建缓存
- 执行
wsl --shutdown - 使用
Optimize-VHD -Mode Full压缩虚拟磁盘 - 再次检查 Linux 占用与 VHDX 大小
十二、结语
WSL 磁盘清理的关键不只是“删文件”,而是理解Linux 内部释放空间和Windows 侧回收虚拟磁盘体积是两件不同的事。
如果你只是清理缓存,而没有压缩 ext4.vhdx,最终往往只能看到“Linux 内变干净了”,却看不到 Windows 磁盘真正变小。
一个相对稳妥、通用的清理策略是:
- 先分析占用来源
- 先清低风险缓存
- 再清 Docker 等高收益区域
- 最后统一关机并压缩 VHDX
这样做既更安全,也更容易获得可观的空间回收效果。✨
如果你经常在 WSL 里跑容器、构建环境或 AI/DevOps 工具链,建议把这套流程整理成自己的定期维护 SOP,会很省磁盘,也很省心。