WSL 回收未使用的磁盘空间

WSL 是 Windows 上非常方便的 Linux 虚拟机工具,虚拟机使用的虚拟磁盘是 C 盘上的一个虚拟磁盘文件(VHDX)。虚拟磁盘文件的大小会随着 Linux 虚拟机对虚拟磁盘的用量增加而逐渐增大。然而,这个文件的大小不会根据 Linux 虚拟机对磁盘用量的减少而变小。也就是说,随着你使用 Linux 虚拟机,这个虚拟磁盘文件会变得越来越大,且永远不会变小。最后可能导致 C 盘的空间都被虚拟磁盘文件占满。

image

Microsoft 并没有提供缩小虚拟磁盘文件的方法,不过我们可以通过 DiskPart 工具手动调整。

  1. 首先找到 Linux 虚拟机的虚拟磁盘文件的位置。进入 UWP 应用数据目录,找到你的 WSL 实例的包目录:

    Set-Location -Path "$env:LOCALAPPDATA\Packages"
    

    WSL 实例的包目录以 发布者名称.应用名称_包标识符 的方式命名。我们使用下面的命令查找名称含有 Ubuntu 的目录:

    Get-ChildItem -Directory | Where-Object { $_.Name -like "*Ubuntu*" }
    
        Directory: C:\Users\USERNAME\AppData\Local\Packages
    
    Mode                 LastWriteTime         Length Name
    ----                 -------------         ------ ----
    d----          2024/10/18    10:23                CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc
    
    

    这里我们的 Ubuntu 包目录为 CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc,其子目录 LocalState 下存放着虚拟磁盘文件 ext4.vhdx。复制虚拟磁盘文件的路径,我这里是:

    C:\Users\USERNAME\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx
    
  2. 使用 DiskPart 磁盘工具压缩磁盘大小。首先打开 DiskPark 交互模式:

    diskpart
    

    接下来选中我们的虚拟磁盘文件:

    DISKPART> select vdisk file="C:\Users\USERNAME\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx"
    

    接下来缩小磁盘文件到实际使用大小:

    DISKPART> compact vdisk
    

等待命令运行完成后刷新磁盘大小,此时就可以发现之前被 WSL 虚拟机占用的空间都回来了。

image

参考:How to Shrink a WSL2 Virtual Disk | Stephen Rees-Carter

posted @ 2024-11-07 19:24  Undefined443  阅读(48)  评论(0编辑  收藏  举报