WSL2 使用的 VHDX正确压缩过程

原因: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

⚠ 常见错误原因:

  1. 报错:Optimize-VHD 命令不存在

    → 说明你没有启用 Hyper-V 模块

    执行:

    powershell 复制代码
    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
  2. 报错:磁盘被占用 / 文件锁定

    → 通常是 WSL 没有完全关掉 或 Docker 占用

    再次执行:

    powershell 复制代码
    wsl --shutdown
  3. 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 空闲块未标记
相关推荐
sz4972385991 天前
WSL2+VSCode搭建ESP-IDF 开发环境
ide·vscode·编辑器·esp32·wsl
*星星之火*1 天前
【AI工具篇】Windows 安装 WSL 全攻略:wsl --install 一键部署 + VSCode 搭配使用好处详解
windows·vscode·wsl
吴烦恼的博客6 天前
WSL迁移指南
ubuntu·wsl·系统移植
Irene199110 天前
前端开发中,WSL和本地开发的区别(本地项目,PowerShell和Bash均可执行npm命令,推荐使用 PowerShell)
wsl·本地开发
cuckooman12 天前
如何升级wsl1到wsl2
wsl·wsl2
无巧不成书021812 天前
保姆级教程:解决DISM错误0x800f0915,成功开启虚拟机平台(2026年最新版)
wsl·windows11·系统修复·dism错误·虚拟机平台
Irene199112 天前
Cursor/VSCode 连接 WSL 频繁掉线问题完整排查记录(AI总结版)
编辑器·wsl
goto199713 天前
Ubuntu调整路径--从C盘调整到D盘
ubuntu·wsl·c盘·d盘
comedate14 天前
【WSL】【OpenClaw】WSL 中配置 SearXNG 指南
wsl·searxng·openclaw·搜索引擎部署
wengad17 天前
在WSL中 ping某个站点报错Temporary failure in name resolution,要怎么解决
wsl·基础设施