搶救 C 槽空間 - 遷移 WSL 虛擬硬碟
| | | 5 | |
我的 i5 迷你工作機當初買的是 2T SSD (記得好像六千入手,再看看現在的價格只能搖頭嘆氣),我切了 500GB 給系統碟,心想應該綽綽有餘,但用著用著,前幾天剩餘空間降到 10%,空間百分比條變紅,我開始陷入焦慮...
清 C 糟這檔事兒,我做了又做,做了還做,2026 年繼續做,自己都覺得好笑。
本次清空間依舊遵循古法,先開 WindirStat 掃描 C 槽,很快抓到一隻大肥貓 - WSL 的 vhdx (虛擬機硬碟) 44.3GB,用掉整顆 C 槽近 1/10 空間:

問 AI 找到解法,答案出奇簡單,不必下指令,Docker Desktop UI 操作介面有選項,重新選取存放位置,套用並重新啟動後,Docker Desktop 會在背後默默打包 Docker 容器,搬到新位置解開,再把舊檔刪除。過程要花點時間,而且很吃記憶體,我的 64G RAM 一度被用掉 90%,但全程不沾手,耐心等待即可。

原始目錄 AppData\Local\Docker\wsl\data 搬家後 Docker Desktop 會改名 DockerDesktopWSL\data,無法沿用 wsl\data。但有清出空間就好,看到 C 槽剩餘空間回升到 20%,危機暫時解除,呼~

空間清出來了,但留下疑問:WSL 的東西為什麼輪到 Docker Desktop 來處理,WSL 跟 Hyper-V 又有什麼關係?查了一下,故事是這樣的:
我們現在說 WSL 指的通常是 WSL2,跟 WSL1 不同,WSL2 本質上是一個「輕量化、與 Windows 深度整合的 VM」,WSL1 則是透過 Linux Syscall Translation 系統呼叫轉譯模擬,但 WSL2 有用到 Virtual Machine Platform (虛擬機平台) 技術 (Hyper-V 子集,與 Hyper-V 伺服器、VM 不同),以 VM 方式執行 Linux Kernel,提供更高的相容性;而 Docker Desktop,便是建立在 WSL2 之上。

Docker Desktop 在 WSL2 模式下會建立兩個隱藏 distro:docker-desktop、docker-desktop-data,前者是 Docker daemon/runtime,後者為 images/volumes/layers,需要儲存資料,而 C:\Users<userName>\AppData\Local\Docker\wsl\data\ext4.vhdx 便是 docker-desktop-data 的 WSL 虛擬磁碟。
而 Docker Desktop GUI 提供的 vhdx 搬家功能,背後其實就是把一連串 CLI 包起來,故我們也可以選擇不用 GUI,用這串 CLI 指令完成搬家,使用這種做法目標資料夾便可完全自訂:
# Stop Docker and WSL
wsl --shutdown
# Export Docker data distro
wsl --export docker-desktop-data D:\docker-desktop-data.tar
# Remove current registration
wsl --unregister docker-desktop-data
# Import into new location
wsl --import docker-desktop-data D:\Docker\wsl\data D:\docker-desktop-data.tar --version 2
就醬,清 C 槽還多學了一些知識,收工。
【補充】感謝讀者 Heresy、ChrisTorng 補充,新版 wsl (Windows 11 24H2+) 有提供更簡單的搬家指令:wsl --manage Ubuntu --move S:\WSL\Ubuntu 參考、wsl --import-in-place 參考。
Comments
# by Heresy
現在應該可以直接用 `wsl --manage Ubuntu --move S:\WSL\Ubuntu` 吧? https://kheresy.wordpress.com/2025/04/25/windows-11-24h2-move-wsl-vhdx/
# by ChrisTorng
我先前有紀錄一些相關資訊與您的不同。詢問 ChatGPT 後發現還有更新的指令。 https://learn.microsoft.com/zh-tw/windows/wsl/basic-commands 裡面有 wsl --import-in-place,就省下 tar 的壓縮再解壓過程 (ChatGPT 說直接搬相較壓縮後再搬再解壓一定會比較快)。 另在 WSL 裡先 sudo apt autoremove/sudo apt clean,再做 sudo fstrim -av 清除佔用空間,之後再執行 wsl --help 可看到有 wsl --manage --set-sparse true,可以先將 VHD 的內部已釋放空間真的清除,也就是讓 VHD 有效廋身。 我還沒做過,提供新知供參考。
# by cs8425
糾個錯: "WSL1 是個傳統 VM" WSL 1不是VM, 是轉換層, kernel還是windows, 只是模擬出linux system call那些東西 WSL 2是透過VM技術跑linux kernel, 兩個本質上差異很大
# by Jeffrey
to Heresy, ChrisTorng, 感謝分享,已補充於內文。
# by Jeffrey
to cs8425,感謝指正,已修正文章。