必须先在wsl2内清空逻辑空闲块并填零,再用diskpart离线压缩ext4.vhdx,否则无法释放物理空间;因wsl2虚拟磁盘只增不减,删除文件后需dd填零+compact vdisk两阶段操作才有效。

Win11用户发现C盘被WSL2悄悄吃掉20GB以上空间,打开资源管理器一看,【C:\Users\用户名\AppData\Local\Packages\...\LocalState\ext4.vhdx】这个文件纹丝不动——哪怕你在Ubuntu里刚删了15GB的Docker镜像和conda环境。问题就出在这里:WSL2的虚拟磁盘只增不减,必须手动触发两阶段清理才能真正释放Windows物理磁盘空间。
先在WSL2内部清空逻辑空闲块
这一步不做,后续压缩几乎无效。WSL2不会主动把删除文件后腾出的空间“归零”,而Windows的diskpart只认全零块才能压缩。
启动你的WSL2发行版(如Ubuntu),执行以下命令:
sudo apt clean && sudo apt autoremove -y
sudo journalctl --vacuum-size=50M
sudo rm -rf ~/.cache/pip ~/.cache/apt
如果装了Docker,再运行:【docker system prune -a -f && docker builder prune -f】。这会清除所有悬空镜像、构建缓存和未使用的容器卷——它们常占数GB却容易被忽略。
最关键的一步:用dd命令把剩余空闲空间填满零。执行:【sudo dd if=/dev/zero of=/var/tmp/zeros bs=1M && sync && sudo rm -f /var/tmp/zeros】。注意:/var/tmp必须有足够剩余空间,否则dd会中途失败并残留大文件;若提示“No space left”,先df -h看真实可用容量,再调整of路径到其他挂载点(如/home)。
关闭WSL并定位ext4.vhdx文件路径
回到Windows,以管理员身份运行PowerShell(普通权限无法调用diskpart写入操作)。
执行:wsl --shutdown
执行:wsl -l -v,记下NAME列的发行版名称,例如Ubuntu-22.04或Debian。
执行:Get-ChildItem "$env:LOCALAPPDATA\Packages\" -Recurse -Filter "ext4.vhdx" -ErrorAction SilentlyContinue | Select-Object FullName, @{Name="SizeGB";Expression={[math]::Round($_.Length/1GB, 2)}}。这条命令直接列出所有WSL2发行版的ext4.vhdx位置和当前大小,避免你手动翻包名猜路径——CanonicalGroupLimited.Ubuntu22.04LTS_*这类随机后缀极易输错。
用diskpart执行离线压缩
这是唯一能真正缩小ext4.vhdx物理体积的操作,必须严格按顺序执行,中间不能跳步或漏回车。
第一步:运行 diskpart
第二步:输入 select vdisk file="C:\Users\用户名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_abc123\LocalState\ext4.vhdx"(请将引号内路径替换成上一步查到的完整路径,路径中不能有中文、空格或特殊符号,否则select失败)
第三步:输入 attach vdisk readonly
第四步:输入 compact vdisk(此过程无进度条,根据文件大小耗时几十秒到十几分钟,期间不要关窗)
第五步:输入 detach vdisk
第六步:输入 exit
完成后,回到文件资源管理器刷新,对比压缩前后的ext4.vhdx大小——通常可缩减30%~70%,取决于之前dd填零是否彻底。











