# \[教學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` `發行版` `發佈`