这篇博客记录一次 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 盘空间往往并不会立刻回来。
解决思路
完整流程分两步:
- 在 WSL/Ubuntu 内部先清理真正没用的数据。
- 回到 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 还在后台占用磁盘文件
vmmem或vmmemWSL进程仍在运行
报错处理办法
请在 管理员身份运行的 Windows PowerShell 中按顺序处理。
1. 再次关闭 WSL
wsl --shutdown
2. 如果安装了 Docker Desktop,停止 Docker 服务
net stop com.docker.service
如果提示服务未启动,可以直接继续下一步。
3. 检查并结束 vmmem 相关进程
可以先打开任务管理器,查看“详细信息”里是否存在 vmmem 或 vmmemWSL。
也可以直接在 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