###### tags: `WSL` `Linux`
# 建立可攜式的 WSL
Windows 上的 WSL 是很棒的功能, 不過如果你從 Windows Store 安裝 WSL 的發行版, 它會安裝在系統磁碟, 如果你想安裝在別的地方, 就可以採用本文介紹的方法。
## 啟用 WSL 功能
在『**控制台/應用程式/選用功能/更多 Windows 功能**』中勾選 **Windows 子系統 Linux 版**以及**虛擬機器平台**兩項:
![](https://i.imgur.com/KUCyp48.png)
可能會需要重新起動電腦。
## 下載 WSL 發行版檔案
你可以在微軟的網站上下載你偏好的[發行版檔案](https://docs.microsoft.com/en-us/windows/wsl/install-manual#downloading-distributions), 以下我以 [Ubuntu-20.04](https://aka.ms/wslubuntu2004) 為例。
## 解開發行版檔案
下載回來的檔案是 .appx 格式, 實際上就是一個 zip 檔, 你可以更改副檔名為 .zip 後使用任何解壓縮工具解開到你期望的資料夾下。這裡以 PowerShell 的 `Expand-Archive` 為解壓縮工具:
```
❯ ren .\Ubuntu_2004.2020.424.0_x64.appx .\Ubuntu_2004.2020.424.0_x64.zip
❯ Expand-Archive .\Ubuntu_2004.2020.424.0_x64.zip ubunt
```
## 註冊發行版
只要進到解開的資料夾, 執行其中的檔案, 就可以向 WSL 註冊這個發行版:
```
D:\wsl2
❯ cd .\ubuntu\
D:\wsl2\ubuntu
❯ .\ubuntu2004.exe
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: meebox
New password:
Retype new password:
passwd: password updated successfully
Installation successful!
```
Ubuntu 會詢問你要使用的使用者名稱以及密碼, 完成後就會進入 Shell:
```
meebox@mee:~$
```
只要按 <kbd>Ctrl</kbd>+<kbd>D</kbd> 就可以離開。
## WSL 管理指令
WSL 提供有 [`wsl`](https://docs.microsoft.com/zh-tw/windows/wsl/reference) 指令管理發行版, 以下列出重要的功能。
### 列出已註冊的發行版
```
❯ wsl --list
Windows 子系統 Linux 版發佈:
Debian (預設值)
Ubuntu-20.04
Alpine
```
可以看到我的系統上已經註冊有 3 種發行版。
:::info
如果你有安裝 Windows Terminal, 已註冊的發行版也會出現在可用清單中:
![](https://i.imgur.com/StOuha2.png)
:::
:::info
[Alpine](https://wiki.alpinelinux.org/wiki/Main_Page) 是一個輕量級的 Linux 發行版, 不過如果要下載發行版檔案, 必須到[這裡](https://github.com/yuk7/AlpineWSL)下載。由於它很輕量, 很適合拿來安裝 Docker。
:::
### 執行特定的發行版
```
❯ wsl -d Alpine
root at mee in /mnt/d/wsl2/ubuntu
$
```
指定發行版名稱時請參考 `--list` 列出的名稱。
### 匯出發行版
如果你想要使用同一種發行版但建立多個不同的執行環境, 或是想把目前設定好的發行版帶到其他電腦使用, 可以將發行版匯出成為 tar 格式檔案:
```
❯ wsl --export Alpine Alpine.tar
```
### 從 tar 檔案匯入複製發行版
你也可以匯入之前匯出的 tar 檔:
```
❯ wsl --import Alpine2 ./Alpine2 Alpine.tar
```
第一個參數是你想幫匯入的發行版取的名字, 第二個參數是要將發行版匯入到哪個路徑。完成後如果列出已註冊的發行版, 就會看到匯入時指定的 Alpine2 了:
```
❯ wsl --list
Windows 子系統 Linux 版發佈:
Debian (預設值)
Ubuntu-20.04
Alpine2
Alpine
```
如果你執行 Alpine2 發行版, 就會進入跟 Alpine 一模一樣但獨立的環境。
## 刪除已經註冊的發行版
如果不再需要使用特定的發行版, 可以先取消註冊, 再移除整個資料夾即可。以下以刪除剛剛複匯入的 Alpine2 為例:
```
❯ wsl --unregister Alpine2
取消註冊中...
```
這時再列出已註冊的發行版, 就會發現 Alpine2 已經不見了:
```
❯ wsl --list
Windows 子系統 Linux 版發佈:
Debian (預設值)
Ubuntu-20.04
Alpine
```
取消註冊後, 就可以刪除它所佔用的資料夾了:
```
❯ rm -r -Force .\Alpine2\
```
這樣就可以完整刪除該發行版。
## 移難排除
Symantec Endpoint Protection 會檔 WSL 的網路, 請記得開啟『**Network and Host Exploit Mitigation Settings/Unmatched IP Traffic sections/Allow IP traffic**』選項:
![](https://hackmd.io/_uploads/BydD9cbya.png)