# 如何縮減 WSL 2 與 Docker Desktop WSL 2 backend 的 VHDX 虛擬硬碟大小

我的電腦有安裝 WSL 2 與 Docker Desktop WSL 2 backend，這兩個分別各使用了一個 `ext4.vhdx` 虛擬硬碟，我在使用 WSL 2 與 Docker 一段時間之後，這兩個虛擬硬碟變的非常大，分別佔用了 39GB 與 79GB 之多，我想是時候來壓縮這兩個虛擬硬碟了。這篇文章我就來說明壓縮 vhdx 的方法。

![high-angle-hard-drive-still-life](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/879754731a5fbfef71b0-74d5155b-9ae6-4122-bc80-f00fe1a3e42a.webp)

1.  首先，先透過 [Everything search engine](https://www.voidtools.com/) 找到你的 `ext4.vhdx` 檔案路徑
    
    在我的電腦分別是以下兩個路徑：
    
    `$env:LOCALAPPDATA\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\ext4.vhdx`
    
    `$env:LOCALAPPDATA\Docker\wsl\data\ext4.vhdx`
    
2.  先將 WSL 2 完整關閉 (這個過程也會把 Docker Desktop 關閉)
    
    ```powershell
    wsl --shutdown
    ```
    
    確認所有 WSL 2 實體都已經是停止狀態，確保 VHDX 檔案沒有被鎖定
    
    ```powershell
    wsl --list --verbose
    ```
    
    ![image](https://stwillblogassets.blob.core.windows.net/files/images/external/github.com/db3c166e7c4df5c381d6-4f27b0c0-bc02-4482-a23d-a84f8259d15c.png)
    
3.  以系統管理員身分執行 PowerShell 視窗，並執行 `Optimize-VHD` 最佳化 VHDX 虛擬硬碟
    
    ```powershell
    Optimize-VHD -Path $env:LOCALAPPDATA\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx -Mode Full
    ```
    
    ```powershell
    Optimize-VHD -Path $env:LOCALAPPDATA\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\ext4.vhdx -Mode Full
    ```
    
    ```powershell
    Optimize-VHD -Path $env:LOCALAPPDATA\Docker\wsl\data\ext4.vhdx -Mode Full
    ```
    
    光是這兩個命令，我省下了將近 **50GB** 的磁碟空間喔！👍
    

### 注意事項

如果你的 Docker 有許多沒用到的 Docker Images 的話，建議可以先移除。詳見 [如何快速刪除所有已經無用的 Docker 資源 (容器,容器映像,網路)](/post/2022/11/18/docker-image-prune-notes) 文章！

### 相關連結

-   [Shrink your WSL2 Virtual Disks and Docker Images and Reclaim Disk Space - Scott Hanselman's Blog](https://www.hanselman.com/blog/shrink-your-wsl2-virtual-disks-and-docker-images-and-reclaim-disk-space)
