---
tags: 環境設置
---
# **Windows Subsystem for Linux (WSL2) 環境設定**
## 0. 目錄
第一篇:[WSL 原理介紹](https://hackmd.io/s/Bkh8oAmGX)
第二篇:本篇
第三篇:[WSL 補充內容](https://hackmd.io/s/SyL3pzzQm)
第四篇:[WSL 搭配 VSC](https://hackmd.io/s/S1LFy-BzQ)
:::info
附上近期[投影片教學 (wsl 2版)](https://drive.google.com/file/d/1peY5H2DLpj0KCqFDyyvmEkBRU15s4s9J/view?usp=sharing),未來會在 notion 上重寫
:::
## 1. 安裝 Linux
### 1.1. 事前須知
首先,請檢查一下手邊的機器有無達到以下條件:
WSL2
* 處理器
* x64 架構的處理器
* ARM64 架構的處理器
* 具有以上任一種且具備第二層位址轉譯 (SLAT) 的 64 位元處理器
* 作業系統
* Windows 10 家用版,版本 1903 或更高版本,含 組建 18362 或更高組建。 (x64 的處理器)
* Windows 10,版本 2004 或更高版本,含 組建 19041 或更高組建。 (ARM64 的處理器)
:::info
Windows 10 S版不支援
:::
* 記憶體
* 至少有 4 GB 的記憶體空間。越多記憶體越好。
* 在 BIOS 或 UEFI 中開啟虛擬化支援:
* 硬體協助虛擬化。具有 Intel 虛擬化技術的處理器 (Intel VT) 或 AMD Virtualization (AMD) 技術。
* 啟用硬體強制的資料執行防止 (DEP)。對於 Intel 系統而言,這是 (執行停用位) 的 XD 位。 對於 AMD 系統而言,這是 NX 位 (沒有任何執行位) 。
最後,您本人有無達到以下條件
* 了解基本的 Linux 命令列語法
* 勇於嘗試並尋找方法
**本教學適用 Ubuntu 20.04 LTS 以及 Ubuntu 21.10 版**
歡迎搭配以下兩篇一起服用~
[Windows Subsystem for Linux 環境配置 ( 1709 版)](https://medium.com/hungys-blog/windows-subsystem-for-linux-configuration-caf2f47d0dfb)
[Windows 10 上適用於 Linux 的 Windows 子系統安裝指南](https://docs.microsoft.com/zh-tw/windows/wsl/install-win10)
WSL 更新資訊:
* [WSL 官方 github](https://github.com/Microsoft/WSL)
* [Release Notes](https://docs.microsoft.com/zh-tw/windows/wsl/release-notes?f=255&MSPPError=-2147217396)
* [2004 版及以後的版本](https://devblogs.microsoft.com/commandline/install-wsl-with-a-single-command-now-available-in-windows-10-version-2004-and-higher/)
### 1.2. 啟用 Windows 設定
#### 方法 1:
使用**系統管理員**權限開啟 **PowerShell**,輸入下述指令:
```powershell
DISM /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
DISM /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```
<img src="https://i.imgur.com/tPuntRd.png" width=100%>
重新啟動電腦以完成安裝。
#### 方法 2:
到「控制台 > 程式集 > 程式與功能」,點擊「**開啟或關閉 Windows 功能**」。
<img src="https://i.imgur.com/gdkAqch.png" width=100%>
從開啟的小視窗中點選啟用「**適用於 Linux 的 Windows 子系統**」和「**虛擬機器平台**」,確定後重新啟動電腦。
<img src="https://i.imgur.com/nSbzAw6.png" width=60%>
### 1.3. 設定 Focal Fossa
Ubuntu 20.04 LTS 可以從 [Windows 商店](https://www.microsoft.com/store/apps/9n6svws3rx71) 取得,沒有標註的預設會安裝**穩定版 LTS** (目前是 20.04),**App 更新不影響版本**,筆者這裡使用最新 20.04 版來說明。
<img src="https://i.imgur.com/EtJaKoj.png" width=100%>
> Ubuntu 提供 18.04 與 20.04 特定 LTS 選擇,不同 App 視為不同的 distro。
安裝好後請打開 App,第一次開啟會需要等他安裝組建,完成後需要新增帳號密碼來建立使用者,密碼主要用於 `sudo`。
<img src="https://i.imgur.com/zCI5NyG.png" width=100%>
### 1.4 (選用)安裝 Windows 終端機
**Windows 終端機(Windows Terminal)** 是 Microsoft 公司在 2019 年的 Microsoft Build 大會上宣佈推出一款全新的 Windows 終端機,能夠取代 PowerShell 的命令提示字元。
Windows 終端機可啟用多個索引標籤 (在多個 Linux 命令列、Windows 命令提示字元、PowerShell、Azure CLI 等之間快速切換)、建立自訂按鍵繫結 (開啟或關閉索引標籤、複製+貼上等的快速鍵)、使用搜尋功能及自訂佈景主題 (色彩配置、字型樣式和大小、背景影像/柔邊/透明度)。[官方的介紹短片](https://www.youtube.com/watch?v=8gw0rXPMMPE)
<img src="https://i.imgur.com/eihGctQ.png" width=100%>
Windows 終端機可以從 [Windows 商店](https://aka.ms/terminal) 取得
<img src="https://i.imgur.com/4R1x7Ok.png" width=100%>
如果在傳統應用程式介面覺得字型大小不好看的話,可以右鍵開啟 App 內容,在裡面調整顯示設定,關於 TrueType 字型在 zsh 會有詳細說明。
<img src="https://i.imgur.com/dJdKDjQ.png" width=80%>
> 1803 版之前 App 的內容配置,每次重開似乎都會自動變回新細明體。
設定成功後就會進到此畫面,前面是你的帳號,@後面是你的電腦名稱。
<img src="https://i.imgur.com/XqnT0xM.png" width=90%>
除了透過 App,我們還可以透過**命令提示字元 (cmd) **或是**執行** (`Win`+`R`) 並輸入以下任一種來啟動 WSL:
* `bash`:進入 **預設** Linux distro 的 **bash shell**
* `wsl`:進入 **預設** Linux distro 的 **default shell**
* `ubuntu` 或 `ubuntu2004`:執行特定 **App .exe**
前兩項會根據目前 WSL 預設的 distro 執行,因為目前只安裝 Ubuntu,所以都可以視為相同。
`/mnt/c` 也就是 mount C,是用來支援原生 Windows 檔案系統,詳情可以查看上一篇。
需要注意**使用者名稱**和**根目錄**並非同一個位置,前者存取的是 Windows 下的 Users,後者為專屬 WSL 的檔案系統。
<img src="https://i.imgur.com/MA5lFEC.png" width=80%>
> 1703 版前舊版 WSL 的路徑有些不同。
由於 WSL 支援多種 Linux distro,所以我們可以在 cmd 透過 `wslconfig` 來管理,下圖可以看到目前的預設的 distro (App 名稱)。
<img src="https://i.imgur.com/zjoNi9Z.png" width=80%>
> 1703 版前舊版 WSL 要透過 `lxrun` 管理。
上面都沒問題的話就更新一下 Ubuntu 的資料庫,最好定期執行。
由於 WSL 內建的 apt 伺服器使用的是位於歐洲(英國)的 http://archive.ubuntu.com/ubuntu ,下載軟體的時間會因各 ISP 的因素導致下載速度緩慢,因此建議修改成離自己地區最近的鏡像站,可以從 [這裡](https://launchpad.net/ubuntu/+archivemirrors) 查詢各地區的鏡像站。
以下使用台灣的 國家高速網路與計算中心(NCHC) 進行修改,提供的頻寬有 20 Gbps 不怕你下載跑不滿。
使用 sed 的指令將 /etc/apt/sources.list 裡面的 archive.ubuntu.com 和 security.ubuntu.com 替換成 free.nchc.org.tw
```shell
sudo sed -i 's/archive.ubuntu.com/free.nchc.org.tw/g' /etc/apt/sources.list
sudo sed -i 's/security.ubuntu.com/free.nchc.org.tw/g' /etc/apt/sources.list
```
Ubuntu 24.04 LTS 的軟體來源從 `/etc/apt/sources.list` 改到 `/etc/apt/sources.list.d/ubuntu.sources`
```shell
sudo sed -i 's/archive.ubuntu.com/free.nchc.org.tw/g' /etc/apt/sources.list.d/ubuntu.sources
sudo sed -i 's/security.ubuntu.com/free.nchc.org.tw/g' /etc/apt/sources.list.d/ubuntu.sources
```
之後執行以下動作
```shell
sudo apt clean all # 清除伺服器先前已取得的檔案清單
sudo apt update # 更新伺服器的檔案清單
sudo apt upgrade # 更新套件
```
> 有安裝後續 zsh 的 debian 就可以直接用 `ad` 和 `adg`。
> ~~目前 18.04 版在更新套件時會看到 ebtables 的 error,不過這可以先忽略。~~
#### 如要更新 Focal Fossa:
* 在 Ubuntu 執行 `do-release-upgrade` (目前測試是沒有辦法找到新 release)
* 重新安裝 App
#### 如要刪除 Focal Fossa:
* 直接解除安裝 App
* 透過 `wsl --unregister` 取消註冊
參考資料:[Manage and configure WSL](https://docs.microsoft.com/en-us/windows/wsl/wsl-config)
## 2. 設定 Z shell (zsh)
### 2.1. 特色
一言以蔽之就是實用,像是命令列補全、可載入模組等等,主要都會選擇搭配下面提到的 [oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh?source=c) 一起使用。
參考資料:[zsh wiki](http://zshwiki.org/home/)
### 2.2. 安裝 zsh
1. 下載 zsh。
```shell
sudo apt-get install zsh -y
```
2. 檢查一下 zsh 版本。
```shell
$ zsh --version
zsh 5.8 (x86_64-ubuntu-linux-gnu)
```
3. 查看已安裝的 shell。
```
$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/bin/rbash
/bin/dash
/usr/bin/tmux
/usr/bin/screen
/bin/zsh
/usr/bin/zsh
```
4. 將 zsh 設為預設 shell。
```shell
chsh -s $(which zsh)
```
5. 先關掉 App 再重開。
6. 第一次設定完後會看到下面畫面,請**直接按 0** 建立空白含註解的 `.zshrc`,只要沒有此檔案都會一直回到這個畫面。
<img src="https://i.imgur.com/TLowA79.png" width=90%>
7. 檢查 zsh 是否變為預設,以及版本是否一致。
```shell
echo $SHELL
/usr/bin/zsh
$SHELL --version
zsh 5.4.2 (x86_64-ubuntu-linux-gnu)
```
8. 安裝 [oh-my-zsh](https://ohmyz.sh/),強大的 zsh 框架,下面擇一種方式安裝即可。
```shell
sh -c "$(wget https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"
```
```shell
sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
```
### 2.3. 安裝 Powerline 字型
由於部分主題像是 [agnoster](https://github.com/agnoster/agnoster-zsh-theme) 系列,都會用到特殊符號,這種時候就要安裝[ Powerline ](https://github.com/powerline/fonts)字型來解決,一部分原因也是因為 Windows 內建字型較少等寬 (monospace)。
無論是 App 或 VSC 來執行 WSL,字型都是從 Windows 安裝的來選擇,**安裝在 WSL 並沒有意義**。
這邊介紹一款好用的字體:[更紗黑體](https://github.com/be5invis/Sarasa-Gothic)
<img src="https://i.imgur.com/40aYOM1.jpeg" width=100%>
由於這個字體更新的頻率比其他字體還要高,您也可以從 [Microsoft 商店](https://www.microsoft.com/store/productId/9MW0M424NCZ7)下載
在 Windows 終端機上面套用的方式也很簡單
1. 打開 Windows 終端機,在新分頁右邊的「下拉式按鈕」,選擇「設定」
<img src="https://i.imgur.com/5KIHNyN.png" width=100%>
2. 在右邊的設定檔選擇 Ubuntu-20.04,標籤切換到外觀,在字體的地方選擇「等距更紗黑體」


3. 字體選擇完畢以後,文字上方可以即時顯示套用的字體
4. 在終端機設定做任何變更請記得在右下角按「儲存」
### 2.4. 設定主題
先輸入以下指令開啟設定檔,由於我們初始設定選擇 0,所以會看到滿滿註解的 `.zshrc`,同時也可以看到 oh-my-zsh 的安裝路徑。
```shell
vim ~/.zshrc
```
<img src="https://i.imgur.com/A8iVUIp.png" width=90%>
> 使用 App 在 `.zshrc` 暫時沒有高亮,筆者是在 VSCode 下使用。
內建的 [Themes](https://github.com/robbyrussell/oh-my-zsh/wiki/Themes) 會位於 `~/.oh-my-zsh/themes` ,可以直接在上圖 `.zshrc` 中的 `ZSH_THEME` 替換想要的主題,並套用變更。
<img src="https://i.imgur.com/J6ycRQ1.png" width=100%>
其他需要下載的主題可以從[ awesome-zsh-plugins ](https://github.com/unixorn/awesome-zsh-plugins#themes)查看,目前筆者使用的是 [bullet-train](https://github.com/caiogondim/bullet-train.zsh),以下教學都可以類推適用。
先切換目錄到 `$ZSH_CUSTOM/themes` 底下,再使用 `wget` 下載**該主題的 raw 檔**。
```shell
cd $ZSH_CUSTOM/themes
wget https://raw.githubusercontent.com/caiogondim/bullet-train-oh-my-zsh-theme/master/bullet-train.zsh-theme
```
確認下載至對應路徑後,回到 `~/.zshrc` 更改主題並套用,結果如下,雖然有受到 VSC 佈景影響,但整體效果仍相當不錯。
<img src="https://i.imgur.com/wcdeXZN.png" width=90%>
需要注意的是主題和套件都會影響 zsh 的**啟動速度**,請自行衡量。
啟用終端機的 256 色模式。
```shell
echo 'export TERM="xterm-256color"' >> ~/.zshrc
```
如果是在 VSC 裡執行 WSL,內部顏色會**被 VSC 的佈景顏色影響**,App 則不會有太大影響,以下是 [ 24 bits color ](https://github.com/gnachman/iTerm2/blob/master/tests/24-bit-color.sh)測試結果:
<img src="https://i.imgur.com/MgluEAy.png" width=100%>
<img src="https://i.imgur.com/xGXTCEw.png" width=100%>
> 如果是像 [powerlevel9k](https://github.com/bhilburn/powerlevel9k) 這類 agnnoster 主題,尾端或是游標的顯示在 App 或 VSC 有可能跑掉,這必須自己測試主題了。
> 目前 VSC 的終端機顏色只能透過佈景主題去調整,詳見 [Color theme for VS Code](https://stackoverflow.com/questions/42307949/color-theme-for-vs-code-integrated-terminal)。
### 2.5. 安裝套件
各種支援套件都可以在此找到:[plugins 列表](https://github.com/robbyrussell/oh-my-zsh/wiki/Plugins)、[plugins 分類](https://github.com/robbyrussell/oh-my-zsh/wiki/Plugins-Overview),內建套件會位於 `~/.oh-my-zsh/plugins`。
如同上面提到,[awesome-zsh-plugins](https://github.com/unixorn/awesome-zsh-plugins) 詳列許多 zsh 框架,以及各式套件與主題,想簡化安裝步驟的可以使用[ Antigen ](https://github.com/zsh-users/antigen)等套件管理工具。
#### 需要另外下載的套件:
安裝於 `$ZSH_CUSTOM/plugins` 底下。
* [zsh-autosuggestions](https://github.com/zsh-users/zsh-autosuggestions)
```shell
git clone https://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions
```
* [zsh-completions](https://github.com/zsh-users/zsh-completions)
```shell
git clone https://github.com/zsh-users/zsh-completions $ZSH_CUSTOM/plugins/zsh-completions
```
* [zsh-syntax-highlighting](https://github.com/zsh-users/zsh-syntax-highlighting)
```shell
git clone https://github.com/zsh-users/zsh-syntax-highlighting $ZSH_CUSTOM/plugins/zsh-syntax-highlighting
```
* [fast-syntax-highlighting](https://github.com/zdharma-continuum/fast-syntax-highlighting):優化上面套件
```shell
git clone https://github.com/zdharma-continuum/fast-syntax-highlighting $ZSH_CUSTOM/plugins/fast-syntax-highlighting
```
* [autoupdate-zsh-plugin](https://github.com/TamCore/autoupdate-oh-my-zsh-plugins):自動更新位於 `$ZSH_CUSTOM` 的 git repos
```shell
git clone https://github.com/TamCore/autoupdate-oh-my-zsh-plugins $ZSH_CUSTOM/plugins/autoupdate
```
* [zsh-navigation-tools](https://github.com/psprint/zsh-navigation-tools):提供 UI 來篩選歷史紀錄、資料夾、刪除工作等等,以下指令會自動設定至 `.zshrc`,所以不用特別啟用,但務必確保設定在檔案最底端。
```shell
sh -c "$(curl -fsSL https://gist.githubusercontent.com/jsdryan/1af3a7fab6b7497ae5a99640c501363f/raw/1628761c581fe90cc3d616985ddcdefbd5bce8c4/install.sh)"
```
| 指令 | 說明 |
| --- | --- |
| n-aliases | browses aliases, relegates editing to vared |
| n-cd | browses dirstack and bookmarked directories, allows to enter selected directory |
| n-functions | browses functions, relegates editing to zed or vared |
| n-history | browses history, allows to edit and run commands from it |
| n-kill | browses processes list, allows to send signal to selected process |
| n-env | browses environment, relegates editing to vared |
| n-options | browses options, allows to toggle their state |
| n-panelize | loads output of given command into the list for browsing |
> 可以不用加 `-`,`Ctrl`+`R` 可以快速使用 `nhistory`。
#### 內建好但需要關聯的:
* [extract](https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/extract):`x` 等同 `extract`,只要加上要解壓縮的檔名,剩下就會自動處理,需要先安裝 unzip
```shell
sudo apt-get install unzip
```
* [fasd](https://github.com/clvv/fasd):提供一些快捷去搜尋和切換最近使用的檔案或目錄,提供互動式的選擇,指令也能互相搭配使用,需要先安裝 fasd
**目前 18.04 無法使用 ppa**
```shell
cd ~
git clone https://github.com/clvv/fasd.git
cd fasd
sudo make install # 可能會需要安裝 make
echo 'eval "$(fasd --init auto)"' >> ~/.zshrc
```
除了直接呼叫 `fasd` 加上參數, 一般會使用內建的縮寫:
| 指令 | 說明 |
| --- | --- |
| a | any |
| s | show / search / select |
| d | directory |
| f | file |
| sd | interactive directory selection |
| sf | interactive file selection |
| z | cd, same functionality as j in autojump |
| zz | cd with interactive selection |
* [debian](https://github.com/robbyrussell/oh-my-zsh/wiki/Plugins#debian):提供一些管理 package 的快捷,需要先安裝 aptitude
```shell
sudo apt-get install aptitude
```
| 指令 | 說明 |
| --- | --- |
| as [search term] | Search for packages |
| ad | Update packages |
| adg | Updgrade packages |
| ai [packages to install] | Install package(s) |
| ar [package to remove] | Remove package |
| app | Apt policy |
| acs [search term] | Search packages in cache |
| ac | Clean apt cache |
| age [parameters] | apt-get [parameters] |
| api [parameters] | aptitude [parameters] |
| aps [search term] | Search with aptitude |
| afs [search term] | Search files in packages |
| asrc [parameters] | apt-get source [parameters] |
| aac | Autoclean |
| abd | Build dependencies |
| adu | Update & (safe)upgrade |
| afu | Update & full-upgrade |
| ag | Upgrade (safe) |
| ail [list of packages] | Install all packages in list |
| ap | Purge |
| ads | Dselect upgrade |
| dia | Install all ./*.deb |
| di [glob] | Install all glob |
| kclean | Remove unused kernel images |
| allpkgs | Print all installed packages |
| mydeb | Create .deb package |
| apt-list-packages | List packages by size |
| kerndeb | Kernel-package building shortcut |
| apt-copy | Creates script to install all current packages on other machine |
| apt-history | Prints apt history |
#### 可以直接啟用的:
* [last-working-dir](https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/last-working-dir):每次開啟終端機會自動回到上次路徑
* [colored-man-pages](https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/colored-man-pages):改善 manual 的可讀性
* [command-not-found](https://github.com/robbyrussell/oh-my-zsh/wiki/Plugins#command-not-found):找不到 command 時會提供相關建議
* [common-aliases](https://github.com/robbyrussell/oh-my-zsh/wiki/Plugins#common-aliases):提供一些常用指令的快捷,主要有各式 `ls` 的搭配
* [sudo](https://github.com/robbyrussell/oh-my-zsh/wiki/Plugins#sudo):按 `Esc` 兩次,可以直接在 command 前加上 `sudo`
#### 最後步驟:
在 `~/.zshrc` 這地方依序打上需要啟用的套件 (資料夾名稱) 並套用變更。
```
plugins=(
git
zsh-autosuggestions
zsh-completions
zsh-syntax-highlighting
fast-syntax-highlighting
autoupdate
extract
fasd
debian
last-working-dir
colored-man-pages
command-not-found
common-aliases
sudo
)
```
> 可以發現 plugins 後面才 `source oh-my-zsh.sh`。
```shell
source ~/.zshrc
```
### 2.6. 注意事項
* 在 1703 版後,用戶的 Windows 環境變數會自動加到 WSL 裡,所以可以很容易地透過 WSL 開啟 Winodws 的程式,所以在 WSL 執行 `code` 會直接開啟 VSC。
<img src="https://i.imgur.com/aB8MH4X.png" width=100%>
* 1805 新版的 oh-my-zsh,啟用 completion 相關的套件可能顯示如下警告,詳見 [Folder permission issue](https://github.com/robbyrussell/oh-my-zsh/issues/6835#issuecomment-390216875)。
<img src="https://i.imgur.com/WIEqv5o.png" width=100%>
請直接在 `~/.zshrc` 前面加上下面指令,務必要**在載入 oh-my-zsh 之前**。
```
ZSH_DISABLE_COMPFIX=true
```
* 更新 oh-my-zsh:
```
$ upgrade_oh_my_zsh
```
* 刪除 oh-my-zsh:
```
$ uninstall_oh_my_zsh
```
* `~/.profile` 和 `~/.bashrc` 由於我們已更改預設 shell,所以不會被 zsh 載入,一般前者為 **login** 載入,後者為 **non-login** 載入。
* `zsh` 有專屬的 `~/.zprofile` 和 `~/.zshrc`,一般只會修改後者。
## 3. 加碼說明
### 1. 非正規備份還原
在預設的情況下,WSL2 的虛擬磁碟檔案(ext4.vhdx)會放在 C 槽的位置。但有時候我們可能有一些原因(例如:C 槽容量不足、系統常常重灌、想隨身攜帶)會想要放到其他地方而官方預設又不讓你轉移存放,這邊找到一個變通的辦法可以讓您暢行無阻
#### 1-1. 備份
1. 找到原本 WSL2 放在 C 槽的地方
預設位置:
```
C:\Users\[使用者名稱]\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState)
```
2. 將 ext4.vhdx 複製出來放到你自己知道的地方
#### 1-2. 還原
關於還原的部分,由於同一個名稱只認一個安裝位置, 假如你新的電腦已經安裝了 WSL2 的 Ubuntu-20.04 你就必須要先將其解除安裝或是重新命名,否則接下來的還原會發生失敗,接下來就以新的電腦有安裝過 Ubuntu-20.04 做示範
1. 開啟終端機,先解除系統已註冊的 Ubuntu-20.04
```powershell
wsl --unregister Ubuntu-20.04
```
2. [手動下載 Ubuntu-20.04](https://aka.ms/wslubuntu2004),其他的平台 [您也可以從微軟提供的網站下載](https://docs.microsoft.com/zh-tw/windows/wsl/install-manual)
3. 將下載回來的 Appx 檔案使用壓縮軟體進行解壓縮
4. 執行 Ubuntu-20.04.exe,等安裝完成出現要您輸入使用者名稱之後將視窗關閉
(這麼做的目的是為了讓系統記住您 Ubuntu-20.04 的安裝位置)
:::warning
在 Ubuntu-20.04 尚未註冊到系統之前,不要提前將您自己的 ext4.vhdx 丟到解壓縮的資料夾內
否則會還原會失敗
:::
5. 執行 WSL 強制關閉
(不這麼做在稍後的還原會因為系統依然佔用著檔案而發生失敗)
```powershell
wsl --shutdown
```
6. 將您的 ext4.vhdx 放到 Ubuntu-20.04.exe 同一個資料夾裡面,覆蓋原本產生的 ext4.vhdx
7. 重新執行 Ubuntu-20.04.exe,就會發現開起來就是您原本備份的資料了
8. Enjoy~
###### 備註:
如果有遇到還原之後預設登入帳號為 root ,而非使用者帳號時,可參考以下解決辦法
root 帳號下執行此指令
```shell
id -u <username>
```
(理論上應該回傳 1000)
修改登錄檔
```regedit
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\{MY-UUID}
```
修改 `DefaultUid` 登錄檔的十進制為 1000
PowerShell:
```
wsl —shutdown
wsl
```
這時登入帳號應該就會是 username 了!
[解決辦法原文](https://github.com/microsoft/WSL/issues/4276)
### 2. 將 WSL 的介面變成中文顯示
原本早期的版本 Ubuntu 的指令介面還是具備中文顯示的,但後期到現在的版本全部改成英文
這邊提供各位還原的辦法
1. 安裝繁體中文套件包
```shell
sudo apt install language-pack-zh-hant
```
2. 重新套件設定語言
```shell
sudo dpkg-reconfigure locales
```
3. 用鍵盤 Page Down 的方式按到最下面,按空白鍵選擇 `zh-TW.UTF-8`,然後按 `Tab` 鍵切換到 OK,然後按 `Enter` 下一步
4. 語言選擇 `zh-TW.UTF-8`,然後按 `Enter` 下一步
5. 關閉 WSL 的視窗,然後重新開啟 WSL
6. 用 `locale` 進行確認,語系會全部變成 `zh-TW.UTF-8`
> ~~在新版的 zsh 上,如果需要顯示 git branch 於 Prompt,需將 language 改回 en_US.UTF-8,並且需要重新建立 .zshrc (source ~/.zshrc 沒有用)~~
> Update: [ohmyzsh/git async prompt does not appear](https://github.com/ohmyzsh/ohmyzsh/issues/12328)
### 3. 將 WSL Ubuntu 20.04 LTS 升級至 Ubuntu 21.10
Microsoft 提供的 WSL Ubuntu 發行版為 LTS 的分支。
為因應部分特殊需求,Microsoft 仍然保留修改發行版更新通道的設定檔。
這邊提供升級的方法:
1. 完成更新目前所有尚未更新的套件
```shell
sudo apt update && sudo apt-get full-upgrade -y
```
2. 修改更新通道
```shell
sudo vim /etc/update-manager/release-upgrades
```
將 `Prompt=lts` 更改成 `Prompt=normal`
<img src="https://i.imgur.com/cVqyUb8.png" width=100%>
3. 更新至 21.04 >> 21.10
```shell
sudo do-release-upgrade
```
<img src="https://i.imgur.com/iFH0ZMN.png" width=100%>
#### 3-1. 從 WSL Ubuntu 22.04 LTS 升級至 Ubuntu 24.04 LTS
Ubuntu 24.04 尚未提供 `Prompt=lts` 直接升級
需要使用 `-d` 參數
```shell
sudo do-release-upgrade -d
```

### 4. 安裝多個 WSL 同版本個體
基本上,你一次只能從 Microsoft Store 或是手動安裝一種 WSL Distro 版本,如果想準備多個不同的開發環境,但都使用同一個 WSL Distro 怎麼辦呢?
其實很簡單,你先找到一個執行個體,並且把基本設定都搞定,當成 WSL Distro 範本,接著先匯出,再匯入多個版本即可!
底下這個例子(PowerShell),就是將現有的執行個體先匯出,然後匯入成兩個不同的 WSL Distro 名稱 (指定使用 WSL 2 版本):
```powershell
cd $env:USERPROFILE
wsl --export Ubuntu-21.10 Ubuntu-2110_backup.tar
wsl --import Ubuntu-21.10 K:\WSL2\Ubuntu21.10 Ubuntu-2110_backup.tar --version 2
wsl --import Ubuntu-21.10-Dev K:\WSL2\Ubuntu21.10-Dev Ubuntu-2110_backup.tar --version 2
```
如果要指定啟動特定 WSL Distro 的話,只要加上 -d <Distro> 參數即可:
```powershell
wsl -d Ubuntu-21.10-Dev
```
如果要指定關閉特定 WSL Distro 的話,只要加上 -t <Distro> 參數即可:
```powershell
wsl -t Ubuntu-21.10-Dev
```
處理辦法原文:[使用 WSL 2 打造優質的多重 Linux 開發環境](https://blog.miniasp.com/post/2020/07/26/Multiple-Linux-Dev-Environment-build-on-WSL-2)
參考資料:
[鳥哥](http://linux.vbird.org/linux_basic/0320bash.php#settings_bashrc)
[Zsh not hitting ~/.profile](https://superuser.com/questions/187639/zsh-not-hitting-profile)
[Ubuntu 如何快速替換軟體來源的鏡像站(Mirror)?](https://magiclen.org/ubuntu-exchange-source/)