WSL2 的 ext4.vhdx 是动态扩展虚拟磁盘,删除文件不会自动缩小,必须手动清理+压缩才能释放空间。下面给你最稳妥、最常用的完整流程。
一、先在 Ubuntu 内部清理(瘦身基础)
先在 WSL 里删掉不用的文件,让系统标记空间为“空闲”,后面才能被 Windows 压缩工具回收。
1. 清理系统垃圾(Ubuntu 终端执行)
# 清理 APT 缓存
sudo apt clean
sudo apt autoremove -y
# 清理临时文件
sudo rm -rf /tmp/*
sudo rm -rf /var/tmp/*
# 清理日志(可选,谨慎)
sudo journalctl --vacuum-size=100M
# 如果你用 Docker(非常占空间)
docker system prune -a --volumes -f
2. 关键:填零(让压缩更彻底)
这一步把空闲空间全部写 0,Windows 才能识别并彻底回收。
# 创建一个填满所有空闲空间的 0 文件(会提示空间不足,正常)
sudo dd if=/dev/zero of=/zero.fill bs=1M status=progress
# 删除这个文件,此时空闲区已被“标记为可压缩”
sudo rm -f /zero.fill
二、关闭 WSL(必须)
在 Windows 管理员 PowerShell 执行:
# 彻底关闭所有 WSL 实例
wsl --shutdown
# 确认已关闭(STATE 应为 Stopped)
wsl --list --verbose
提示:如果开了 Docker Desktop,先退出它。
三、压缩 ext4.vhdx(两种方法,任选其一)
方法 A:PowerShell Optimize-VHD(推荐,最简单)
# 替换成你的路径
$vhdxPath = "C:\Users\xxxxx\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx"
# 执行压缩(Full 模式最彻底)
Optimize-VHD -Path $vhdxPath -Mode Full
若提示
Optimize-VHD不存在,先启用 Hyper-V:Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
方法 B:diskpart(兼容性更好)
diskpart
在弹出的 diskpart 窗口依次执行:
select vdisk file="C:\Users\xxxxx\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit
四、验证效果
# 查看压缩后大小(GB)
Get-Item "C:\Users\xxxxx\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx" | Select-Object Length, @{Name="SizeGB";Expression={[math]::Round($_.Length/1GB, 2)}}
五、进阶:彻底瘦身(导出/导入)
如果上面压缩后还是很大,可以用 wsl --export 重建镜像(最彻底):
# 1. 导出备份(安全)
wsl --export Ubuntu D:\Ubuntu_backup.tar
# 2. 注销当前实例(会删除原 vhdx!先确认备份)
wsl --unregister Ubuntu
# 3. 重新导入(路径可自定义,比如 D:\WSL\Ubuntu)
wsl --import Ubuntu D:\WSL\Ubuntu D:\Ubuntu_backup.tar --version 2
# 4. 恢复默认用户(Ubuntu)
ubuntu config --default-user dzplo
六、常见问题
- 压缩后没变小:多半是 WSL 没彻底关闭,或没做“填零”步骤。
- 文件被占用:关闭所有 WSL 终端、VSCode、Docker 等,再重试
wsl --shutdown。 - 路径不对:用
wsl --list --verbose确认发行版名称,再核对路径。
需要我帮你把上面的步骤整合成一个一键执行的 PowerShell 脚本,你直接复制运行就能完成清理+压缩吗?