# \[教學2020\] 如何將 WSL Distro (發行版) 安裝至其他硬碟 ==歡迎引用本文,但請標明本網址== --- ## 前言: * **名詞解釋** * ==WSL== * Windows Subsystem for Linux 的簡稱,中譯全名為「適用於 Linux 的 Windows 子系統」,是由微軟開發的 Linux 相容的核心介面,使用的資源少於虛擬化的機器,是目前在 Windows 環境中執行 Linux 軟體的最直接方式。可以於 Windows OS 中操作 Linux,效能極佳。 * ==Distro== * Linux Distribution 的簡稱,WSL 的官方中譯為「**發佈**」,亦有譯為 Linux 的「**發行版**」。(作者認為發行版比發佈更好理解,因此下文皆採用發行版作為 Distro 的中譯) * WSL 可以相容多種發行版,並可透過兩個途徑安裝特定發行版:(1) 使用Windows10 內建的 **Windows Store** (2) 使用 **Docker** * **撰文目的:** 1. WSL 預設的發行版安裝路徑為 C 槽,為了避免套件越裝越多導致容量不足,可以選擇將發行版移動至其他硬碟。 2. 鑑於目前網路上對於如何變更 WSL 發行版安裝位置的教學文錯誤繁多,因此撰寫本文提供完整詳細的中文教學。 3. 本文提供的方法除了能**更改發行版的安裝路徑**,其實也相當於**備份發行版**,由於 Linux 儲存空間是用 Mount (掛載) 的方式,因此原本紀錄的使用者帳戶、已安裝的套件、資料檔案都會跟著搬遷,非常完善。 5. 於 PowerShell 輸入「wsl --help」可以看到軟體的官方參數說明,本文的參數名稱與官方命名稍有變化,用意是使讀者更容易理解指令。 * **限制與狀況** * 若原本的 WSL 發行版是採用 Windows Store 安裝,由於該應用程式似乎是發行版自動安裝檔兼執行檔,裡面的設定無法變更 (無法更改欲啟動的發行版,也無法更改預設的安裝位置),因此即使依照本教學改變 WSL 預設開啟的發行版,如果依舊使用該應用程式開啟 Bash (Bourne-Again SHell),該程式仍會直接啟用原本安裝於 C 槽的發行版 (或自動重新安裝一個發行版至 C 槽)。這部分目前無解,但其實**沒有太過影響 WSL 的使用**,只是捨棄直接從開始列 (Start List) 開啟 Bash,但是**間接透過 PowerShell 開啟發行版的 Bash 是完全沒有問題的,也可以直接使用 Remote VScode 整合的 Bash 進行開發。** ## 操作步驟: 1. 以右鍵「以系統管理員身分執行」開啟 Windows 10 內建的 「**Windows PowerShell**」。 2. 檢查目前 WSL 已註冊的 Linux 發行板名稱 * 輸入以下指令查詢 Distro (發行板): ``` wsl --list ``` 或 ``` wsl -l ``` 您將會看到類似於以下的訊息: > Windows 子系統 Linux 版發佈: > Ubuntu-20.04 (預設值) 意思是目前安裝於電腦的 WSL 發行版只有 「Ubuntu-20.04」這個版本。 * 註 1: 作者當初是直接透過 Windows Store 安裝 Ubuntu-20.04 * 註 2: WSL 預設的發行版安裝路徑為 > C:\Users\<MyUserName>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_xxxx\LocalState * \<MyUserName\> 是您 Windows 的使用者名稱 (User ID),預設為 user。 * CanonicalGroupLimited.Ubuntu20.04onWindows_xxxx 結尾的 xxxx 為變數。 3. 匯出 (將發行版壓縮並備份至指定位置) * 指令格式及參數說明 (共兩個參數) ``` wsl --export <DistroName> <ExportPath><ExportFileName.tar> ``` * **\<DistroName\>**: \<發行版的名稱\>,就是您欲匯出 (備份) 的子系統 (發行版),**如上個步驟查詢到的子系統名字是 Ubuntu-20.04**。若您已安裝多個發行版,請代換為欲匯出的發行版名稱。 * **\<ExportPath\>**: <匯出目的地路徑>,這可以自定義,填入你要存放的資料夾路徑即可。**若欲存放的位置尚未建立資料夾,請先手動建立。** 本範例的路徑為「c:\k_temp\」。 * **\<ExportFileName.tar\>**: <命名匯出檔名>,這也可以自行命名,但副檔名必須為「.tar」,並且這個參數請**直接接續**在\<ExportPath\>後面 (中間不加空格)。 <br> 本範例命名為「wcc-ubuntu-20-04-wsl.tar」。 * 完整的匯出範例指令 ``` wsl --export Ubuntu-20.04 c:\k_temp\wcc-ubuntu-20-04-wsl.tar ``` 輸入後 PowerShell 的 Command Line (命令行) 會持續閃爍底線符號「\_」,**請等待幾分鐘讓系統完成匯出**,當畫面重新出現類似「PS C:\WINDOWS\system32>」的訊息表示匯出完畢,並且在 c:\k_temp 資料夾中可以看到檔案 wcc-ubuntu-20-04-wsl.tar。 4. 匯入 (將發行版備份檔匯入並同時註冊於 WSL) * 指令格式及參數說明 (共三個參數) ``` wsl --import <NewDistroName> <ImportPath> <ExportFilePath> ``` * **\<NewDistroName\>**: <為新的發行版命名>,完成匯入之後,當您再次輸入指令「wsl -l」便會看到此名字。本範例命名為「Ubuntu-20.04-InDiskD」,因為要改放在 D 槽因此用此名稱區分系統。 * **\<ImportPath\>**: <匯入目的地路徑>,可自定義,此範例存放於 D 槽的 wsl 資料夾內。 * **\<ExportFilePath\>**: <匯出檔的路徑>,請填入剛才匯出檔案的檔案路徑。 * 完整的匯入範例指令 ``` wsl --import Ubuntu-20.04-InDiskD d:\wsl\ubuntu-InDiskD c:\k_temp\wcc-ubuntu-20-04-wsl.tar ``` 輸入後同樣請等待數分鐘讓系統完成匯入及檔案註冊,完成後可於 d:\wsl\ubuntu-InDiskD 資料夾找到一個發行版的檔案,本範例的檔名是「ext4.vhdx」,此名稱應與 WSL 預設路徑中存放的檔名相同。 5. 檢查 WSL Distor (發行版) 是否新增成功 再次輸入指令 ``` wsl -l ``` 應會看到此訊息 > Windows 子系統 Linux 版發佈: > Ubuntu-20.04 (預設值) > Ubuntu-20.04-InDiskD 子系統列表中增加了「Ubuntu-20.04-InDiskD」 6. 變更 wsl 的發行版預設 * 指令 ``` wsl --setdefault <DistroName> ``` * **\<DistroName\>**: 請輸入您欲設定為預設版本的發行版名稱,本範例為「Ubuntu-20.04-InDiskD」。 * 範例 ``` wsl --setdefault Ubuntu-20.04-InDiskD ``` 7. 以指定的使用者執行特定發行版本 * 指令 ``` wsl -d <DistroName> -u <wslUserName> ``` * **\<DistroName\>**: 說明同上個指令 * **\<wslUserName\>**: \<wsl的發行版名稱\>,為當初您建立發行版時設定的 Linux 使用者帳戶名稱,本作者的名稱為「kuihao」。 * -d: 指定版本 * -u: 指定使用者 * 範例 ``` wsl -d Ubuntu-20.04-InDiskD -u kuihao ``` 8. 將 C 槽的發行版檔案取消註冊 (刪除 C 槽的發行版) * 指令 ``` wsl --unregister <DistroName> ``` * \<DistroName\>: 填入您要取消註冊的版本名稱,此範例為位於 C 槽的「Ubuntu-20.04」。 * 範例 ``` wsl --unregister Ubuntu-20.04 ``` 輸入之後會看到以下訊息 > 取消註冊中... 完成之後輸入「wsl -l」會發現 Ubuntu-20.04 已刪除,並至原 wsl 預設路徑亦可發現原檔案已刪除。 登入後請記得更新 Linux 套件。 本教學文完畢,祝您開發順利。 ## Reference * "Is this the correct way to Import a WSL export, overwriting “default” installation?," StackOverflow, 2020. \[Online\]. Available: https://stackoverflow.com/questions/63252225/is-this-the-correct-way-to-import-a-wsl-export-overwriting-default-installati * "Exporting and Importing WSL Linux Distributions on Windows 10," Joe Ferguson, 2020. \[Online\]. Available: https://joeferguson.me/exporting-and-importing-wsl-linux-distributions-on-windows-10/ * "適用於 Linux 的 Windows 子系統," WikiPedia, 2020. \[Online\]. Available: https://zh.wikipedia.org/wiki/%E9%80%82%E7%94%A8%E4%BA%8E_Linux_%E7%9A%84_Windows_%E5%AD%90%E7%B3%BB%E7%BB%9F --- ###### tags:`wsl` `Windows10 上適用於 Linux 的 Windows 子系統` `Subsystem for Linux` `Linux 20.04` `Microsoft Store` `PowerShell` `export` `import` `將WSL(Windows上的Bash)根檔案系統移動到另一個硬碟?` `通过wsl命令迁移` `將 WSL Distro 移動到不同磁碟機` `WSL Distro 變更檔案路徑` `Exporting and Importing WSL Linux Distributions on Windows 10` `發行版` `發佈`