原因:WSL2 使用的 VHDX 是 "动态扩展磁盘",只会变大,不会自动变小
你在 WSL 里删除文件,其实只是:
- ext4 文件系统内部 释放了空间
- 但 VHDX 外层虚拟磁盘文件并不会回收空间
就像你删除了里面的东西,但外面的"箱子"不会缩小。
要让 VHDX 变小,需要满足两个条件
① ext4 内部块真正被标记为空闲(rm/clean/autoremove 已做)
② WSL 彻底关闭后,用 Windows 的工具进行 VHDX 压缩(关键)
你可能遇到的问题:
你清理了内容,但 压缩没有成功 或 WSL 没有完全停止。
让我们确保你正确执行下面的操作。
正确压缩 VHDX 的步骤(必须严格按顺序)
1. 完全关闭所有 WSL 实例、后台 service 和 Docker(如果有)
PowerShell 执行:
powershell
wsl --shutdown
如果你使用 Docker Desktop,需要确保:
⚠ Docker Desktop 不要使用 WSL2 或需要关闭 Docker
否则 WSL 会被 Docker 占用,无法压缩。
2. 使用 Optimize-VHD 压缩(最关键的一步)
PowerShell(管理员模式):
powershell
Optimize-VHD -Path "C:\Users\ddooo\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu24.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx" -Mode Full
⚠ 常见错误原因:
-
报错:Optimize-VHD 命令不存在
→ 说明你没有启用 Hyper-V 模块
执行:
powershellEnable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All -
报错:磁盘被占用 / 文件锁定
→ 通常是 WSL 没有完全关掉 或 Docker 占用
再次执行:
powershellwsl --shutdown -
PowerShell 未以管理员模式运行
→ 右键"以管理员身份运行"
经过压缩后 VHDX 会真正变小
比如原来:
ext4.vhdx = 40 GB
删除大文件后,压缩后可能变为:
ext4.vhdx = 12 GB
如果 VHDX 仍未变小,可能是这几种情况:
1. ext4 上还有被占用的空间
检查:
bash
df -h
du -sh /*
特别注意:
/var/lib/docker(如果你装了 Docker)/usr/local(模型文件、toolchains)~/.conda.cache文件夹
2. 你删除的大文件在另一个挂载点 /drv/c 之类的 Windows 文件系统
WSL 删除 Windows 目录下的文件 不会影响 VHDX 大小。
3. ext4 文件系统存在"碎片"
需要在 WSL 内执行:
bash
sudo fstrim -v /
然后再:
powershell
wsl --shutdown
Optimize-VHD -Mode Full
总结:为什么删除文件后 VHDX 不变小?
| 原因 | 解释 |
|---|---|
| VHDX 是动态扩展,不会自动缩小 | 必须用 Optimize-VHD |
| WSL 未关闭 | 文件锁定无法回收 |
| Docker 或后台服务占用 WSL | VHDX 不能压缩 |
| 未启用 Hyper-V | Optimize-VHD 不能运行 |
| ext4 未执行 fstrim | 空闲块未标记 |