WSL2 VHDX 空间回收解决方案

简单来说,WSL2 是通过一个虚拟硬盘文件(通常是 ext4.vhdx)来运行 Linux 发行版的。当你在 Linux 环境中安装软件或创建文件时,这个 .vhdx 文件会自动增长。但是,当你在 Linux 中删除文件时,虚拟硬盘文件并不会自动收缩。它只是在文件系统内部将那些空间标记为“可用”,但从 Windows 的角度看,这个虚拟硬盘文件本身的大小没有变化。

因此,Windows 设置里显示的应用大小,实际上是这个 .vhdx 文件的峰值大小,而不是当前实际使用的大小。

解决方案

要解决这个问题,你需要手动压缩优化这个虚拟硬盘文件,将其中未使用的空间还给 Windows。操作步骤如下:

第 1 步:完全关闭 WSL

这是最重要的一步,因为在 WSL 运行时无法操作其虚拟硬盘文件。

打开 PowerShellCMD(命令提示符),然后运行以下命令:

1
wsl --shutdown

这个命令会强制关闭所有正在运行的 Linux 发行版和 WSL2 虚拟机。你可以通过运行 wsl -l -v 来确认所有发行版都处于 Stopped 状态。

1
2
3
4
5
# 运行此命令检查状态
wsl -l -v

# NAME STATE VERSION
#* Ubuntu-22.04 Stopped 2

第 2 步:找到你的 VHDX 文件

WSL 发行版的虚拟硬盘文件通常存放在一个比较深的路径下。路径格式如下:

%LOCALAPPDATA%\Packages\<你的发行版包名>\LocalState\ext4.vhdx

  • %LOCALAPPDATA% 是一个环境变量,通常指向 C:\Users\<你的用户名>\AppData\Local
  • <你的发行版包名> 是一个类似 CanonicalGroupLimited.Ubuntu22.04LTS_... 的名字。

快速找到它的方法:

  1. 打开文件资源管理器。
  2. 在地址栏输入 %LOCALAPPDATA%\Packages 并回车。
  3. 在文件夹中找到和你的 Linux 发行版名字相关的文件夹(例如,包含 “Ubuntu”, “Debian” 等)。
  4. 进入该文件夹,然后进入 LocalState 子文件夹,你就能看到 ext4.vhdx 文件了。

记下这个文件的完整路径(或按住shift打开右键菜单复制文件地址),比如:

C:\Users\YourUser\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx

第 3 步:压缩 VHDX 文件

这里提供两种最常用的方法,推荐使用方法一(PowerShell),更简单。

方法一:使用 PowerShell (推荐)
  1. 管理员身份 打开 PowerShell

  2. 运行 Optimize-VHD 命令。你需要将下面命令中的路径换成你在第 2 步中找到的实际路径。

    1
    2
    # 语法:Optimize-VHD -Path <你的vhdx文件路径> -Mode Full
    Optimize-VHD -Path "C:\Users\YourUser\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx" -Mode Full
  3. 等待命令执行完成。这个过程可能需要几分钟,具体时间取决于你的硬盘速度和文件大小。

注意:
如果提示Optimize-VHD命令不存在,需要安装 Hyper-V 模块,以管理员身份在 PowerShell 中运行:

1
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
方法二:使用 diskpart 工具

如果你更习惯使用传统的命令行工具,diskpart 也可以完成这个任务。

  1. 管理员身份 打开 CMD(命令提示符)或 PowerShell

  2. 输入 diskpart 并回车,进入 diskpart 环境。

  3. 依次执行以下命令,同样需要替换文件路径:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 1. 选择虚拟磁盘文件,请替换成你的实际路径
    select vdisk file="C:\Users\YourUser\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx"

    # 2. 附加磁盘(以只读方式,更安全)
    attach vdisk readonly

    # 3. 压缩虚拟磁盘
    compact vdisk

    # 4. 分离虚拟磁盘
    detach vdisk

    # 5. 退出 diskpart
    exit

执行 compact vdisk 时,你会看到一个进度百分比。

第 4 步:验证结果

  1. 回到 ext4.vhdx 文件所在的文件夹,右键点击文件,选择“属性”,你会发现文件的大小已经显著减小了。
  2. 现在,你可以正常启动你的 WSL 发行版了(直接打开或在终端输入 wsl)。
  3. 再次查看 Windows 设置中的“应用和功能”,过一段时间(或者重启电脑后),它显示的大小应该就会更新为压缩后的大小。Windows 的缓存更新可能不及时,但磁盘空间确实已经释放了。

总结 (TL;DR)

  1. 打开 PowerShell (非管理员也可以),运行 wsl --shutdown
  2. 以管理员身份打开 PowerShell
  3. 找到你的 ext4.vhdx 文件路径 (通常在 %LOCALAPPDATA%\Packages 下)。
  4. 执行命令 Optimize-VHD -Path "你的vhdx文件路径" -Mode Full
  5. 搞定!