Windows-WSL2 虚拟磁盘过大清理与压缩

pepper 2026-06-06

这篇博客记录一次 WSL2 虚拟磁盘空间暴涨后的清理过程,核心目标是先在 Linux 内部释放无用数据,再让 Windows 侧真正回收 .vhdx 文件占用的磁盘空间。

问题现象

我在 Ubuntu 里检查磁盘时,发现 D 盘下的 /mnt/d/wsl 几乎吃满了全部空间:

sudo du -sh /mnt/d/* | sort -rh | head -n 5

输出示例:

394G    /mnt/d/wsl
1.5G    /mnt/d/msys64

这通常说明 WSL2 的虚拟磁盘文件 ext4.vhdx 变得非常大。要注意的是:

  • 在 Linux 里删除文件、删除 Conda 环境,通常只能释放“文件系统内部空间”。
  • Windows 侧看到的 .vhdx 文件不会自动缩小。
  • 所以如果只是在 Ubuntu 里删文件,D 盘空间往往并不会立刻回来。

解决思路

完整流程分两步:

  1. 在 WSL/Ubuntu 内部先清理真正没用的数据。
  2. 回到 Windows,用 diskpart 压缩 WSL2 的 .vhdx 虚拟磁盘。

如果只做第 1 步,不做第 2 步,Windows 侧占用通常还是下不来。

第一步:先清理 Docker 和无用数据

如果平时在 WSL 里跑过 Docker,那么镜像、容器、构建缓存和数据卷很容易把磁盘撑爆。压缩虚拟磁盘前,最好先把这些垃圾清干净。

docker system prune -a --volumes -f

这条命令会:

  • 删除未使用的镜像
  • 删除已停止的容器
  • 删除未使用的数据卷
  • 删除构建缓存

如果你有仍然需要的镜像或数据卷,执行前先确认一下,避免误删。

第二步:在 Windows 侧压缩 WSL2 虚拟磁盘

先保存好 Ubuntu 里正在进行的工作,然后打开 Windows PowerShell,注意这里不是 WSL 终端,而是 Windows 自带的 PowerShell。

1. 彻底关闭 WSL2

wsl --shutdown

2. 用 diskpart 压缩 .vhdx

进入 PowerShell 后执行:

diskpart

接着在 DISKPART> 提示符里输入以下命令:

select vdisk file="D:\wsl\你的具体路径\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit

说明:

  • select vdisk file=...:选中你实际的 WSL2 虚拟磁盘文件。
  • attach vdisk readonly:以只读方式挂载,避免进一步写入。
  • compact vdisk:执行压缩并回收空闲空间。
  • detach vdisk:完成后卸载。

在执行前,建议先到资源管理器里确认 .vhdx 的真实路径。通常会位于 D:\wsl\...\ext4.vhdx 之类的位置。

常见报错:另一个程序正在使用此文件

如果执行下面这一步时报错:

attach vdisk readonly

看到类似提示:

DiskPart 遇到错误: 另一个程序正在使用此文件,进程无法访问。
有关详细信息,请参阅系统事件日志。

那通常说明:

  • WSL2 进程还没真正退出
  • Docker Desktop 还在后台占用磁盘文件
  • vmmemvmmemWSL 进程仍在运行

报错处理办法

请在 管理员身份运行的 Windows PowerShell 中按顺序处理。

1. 再次关闭 WSL

wsl --shutdown

2. 如果安装了 Docker Desktop,停止 Docker 服务

net stop com.docker.service

如果提示服务未启动,可以直接继续下一步。

3. 检查并结束 vmmem 相关进程

可以先打开任务管理器,查看“详细信息”里是否存在 vmmemvmmemWSL

也可以直接在 PowerShell 里强制结束:

taskkill /f /im vmmem*

4. 重新执行压缩流程

确认没有程序继续占用 .vhdx 后,再重新进入 diskpart

diskpart

然后执行:

select vdisk file="D:\wsl\你的具体路径\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit

清理完成后的说明

如果你刚才手动停止了 Docker 服务,压缩完成后重新打开 Docker Desktop 即可,它会自动把后台服务重新拉起来,WSL 的日常使用也会恢复正常。

总结

遇到 WSL2 占用空间异常大时,可以记住一句话:

Linux 里删除数据,只是腾出虚拟磁盘内部空间;Windows 上压缩 .vhdx,才是真正把磁盘容量拿回来。

最常见、也最有效的一套组合操作就是:

docker system prune -a --volumes -f
wsl --shutdown
diskpart
select vdisk file="D:\wsl\你的具体路径\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit

如果中途提示文件被占用,就优先排查 Docker Desktop 和 vmmem 进程。

⚠️ 注意: 一定要使用 detach vdisk 以及 exit , 否则无法重启wsl