WSL2虚拟磁盘“只增不减”是设计特性,需先确认ext4.vhdx是否真占空间(PowerShell查大小),再进WSL执行df -h和du定位占用、清理APT/Docker/日志,然后sudo fstrim -v /标记空洞,最后wsl --shutdown并用diskpart compact压缩。

Windows上WSL2虚拟磁盘文件(ext4.vhdx或docker_data.vhdx)持续膨胀却无法自动收缩,导致C盘空间被 silently 占满,即使已在Linux内部删除大量文件,Windows资源管理器中该.vhdx文件体积仍岿然不动。
确认是不是WSL2真在吃空间
别急着压缩,先验证问题源头:打开PowerShell(无需管理员权限),运行以下命令:
Get-ChildItem "$env:LOCALAPPDATA\Packages" -Recurse -Filter ext4.vhdx | Select FullName, @{Name="SizeGB";Expression={[math]::Round($_.Length/1GB,2)}} | Sort SizeGB -Descending
如果输出为空,或最大文件仅1–2GB,但C盘已缺十几GB,说明问题不在WSL2本身,可能是休眠文件、Docker Desktop独立数据盘、系统更新缓存或用户临时文件在作祟。
若看到某个ext4.vhdx超过5GB且你并未存大量数据,继续下一步。
进入WSL2查清真实占用情况
这一步决定后续操作方向:空间是“假满”还是“真满”。启动你的发行版(如Ubuntu),执行:
df -h /
重点看Use%列。若低于60%,说明Linux内部其实很空,只是未向底层释放空洞——必须走fstrim+compact流程;若高于90%,说明内部确实塞满了,得先清理再压缩。
快速定位大户:sudo du -sh /* 2>/dev/null | sort -h,重点关注/var/lib/docker、/home/用户名/.cache、/var/log这三个目录。
清理WSL2内部垃圾(非Docker用户适用)
方法一:基础系统清理
sudo apt clean && sudo apt autoclean && sudo apt autoremove
这三连会清掉APT下载缓存、旧版本包和无用依赖。不执行的话,后续compact可能只缩回几百MB。
方法二:日志瘦身
sudo journalctl --vacuum-size=50M && sudo find /var/log -name "*.log" -type f -exec truncate -s 0 {} \;
systemd日志常悄悄涨到2–3GB,第二条命令把所有.log内容清空但保留文件结构,避免服务报错。
方法三:强制释放文件系统空洞
让 Windows 桌面程序在开机时静默自启并隐藏到系统托盘。特别适用于 Flutter、Electron 等无视 VBS/ProcessStartInfo 窗口样式、难以隐藏的顽固应用。提供「VBS 启动器 + Python ctypes/Win32 API」的隐藏窗口方案,可稳定把窗口收进托盘且不闪控制台。
sudo fstrim -v /
【这是压缩生效的前提,漏掉这步,diskpart compact将完全无效】 它告诉WSL2内核:“这些块已不用,请通知Hyper-V底层标记为可回收”。
清理Docker相关占用(Docker Desktop用户必做)
第一步:退出Docker Desktop,右键任务栏图标→Exit。
第二步:在WSL2终端中执行两组命令:
① 清构建缓存(常占3–8GB,system prune不包含它):docker builder prune
② 清镜像、容器、网络、卷(谨慎!确认无重要数据):docker system prune -a
注意:-a参数会删掉所有未运行容器关联的镜像,包括你手动pull但没run过的。如果只想保镜像,去掉-a,只用docker system prune。
第三步:再次执行sudo fstrim -v /,确保Docker释放的空间也被标记。
关闭WSL并压缩虚拟磁盘
第一步:彻底终止WSL2子系统
wsl --shutdown
不是关终端窗口,也不是wsl -t,只有这个命令能真正卸载所有发行版并释放.vhdx句柄。
第二步:用diskpart执行压缩
在PowerShell中依次运行:
diskpart → select vdisk file="C:\Users\你的用户名\AppData\Local\Packages\发行版包名\LocalState\ext4.vhdx" → compact vdisk → detach vdisk
【路径中的“发行版包名”务必准确,例如Ubuntu是CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc,拼错会导致select失败】
compact vdisk执行时无进度提示,根据.vhdx大小可能耗时几十秒到数分钟,不要中断。

















