WSL2磁盘“只增不减”是设计特性而非故障,ext4.vhdx会自动扩容但不自动收缩;需先确认空间真实占用来源,再通过清理Docker缓存、APT包、日志及执行fstrim和wsl--shutdown后用diskpart compact释放空间。
wsl2 磁盘空间“只增不减”是常见现象,不是故障,而是设计使然:ext4.vhdx 文件会自动扩容,但不会自动收缩。真正的问题在于——你删了文件,空间在 wsl2 内部已释放,但 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
- 查看输出中最大的几个 ext4.vhdx 文件路径和大小(单位 GB)
- 如果最大文件仅 1–2GB,但 C 盘少了十几 GB,说明问题不在 WSL2,而是 Windows 自身缓存、休眠文件(hiberfil.sys)、页面文件(pagefile.sys)、Docker Desktop 数据目录或用户临时文件等
第二步:进入 WSL2 查看真实磁盘使用情况
打开任意 WSL2 终端(如 Ubuntu),执行:
- df -h /:看根分区已用空间百分比和实际占用量(注意不是 Windows 显示的 vhdx 大小)
- sudo du -sh /* 2>/dev/null | sort -h:快速找出根目录下哪些一级目录最占空间
- sudo ncdu /(需先 sudo apt install ncdu):交互式深度扫描,精准定位大文件/缓存(比如 /home/用户名/.cache/huggingface、/var/lib/docker、/home/用户名/miniconda3)
第三步:检查是否遗漏关键清理环节
很多用户只删镜像,却忽略以下三类“隐形大户”:
- Docker 构建缓存:执行 docker builder prune(不是 system prune)才能清掉 buildkit 缓存,这部分常占数 GB
- APT 缓存与残留包:运行 sudo apt clean && sudo apt autoclean && sudo apt autoremove
- 日志膨胀:systemd 日志可能达数 GB,执行 sudo journalctl --vacuum-size=50M 限制大小;再清空旧日志:sudo find /var/log -name "*.log" -type f -exec truncate -s 0 {} \;
第四步:验证压缩前提是否满足
vhdx 能否成功压缩,取决于 WSL2 内部是否真正“腾出空洞”:
- 必须先完成上述所有清理,再执行 sudo fstrim -v /(向底层虚拟磁盘发出“丢弃”指令,标记已释放空间)
- 确保 WSL2 已完全关闭:wsl --shutdown(不是关终端,是终止整个子系统)
- 确认 Docker Desktop 已退出(右键托盘图标 → Exit),否则其 wsl\data\ext4.vhdx 会被独占锁定

















