在 Windows 10 環境上安裝 WSL 2

這篇筆記簡單紀錄我在 Windows 10 環境上安裝 WSL 2 的過程,並簡短介紹如何使用 Windows 環境上的 VS Code 來開發 Linux-based 程式。

WSL 2 簡介

WSL 是 Windows Subsystem for Linux 的縮寫。

跟上一個版本相比,WSL 2 有了重大的改進。WSL 1 使用了一個轉譯層(translation layer)來轉換 Linux 與 Windows 底層的系統呼叫(system calls),而 WSL 2 已經不再需要這個轉譯層,因為它有了自己的 Linux 核心,而這個核心是執行於一個輕巧版本的 Hyper-V hypervisor 之上。這表示 WSL 2 無論在啟動和執行方面的速度都會比 WSL 1 快很多,而且將來我們可以直接更新 Linux,而不用等微軟的 WSL 團隊推出新版的轉譯層。

對於習慣使用 Windows、同時又需要 Linux 環境來做部署與測試的開發人員來說,WSL 2 看來是個不錯的選擇。
👉 主要是方便應用程式的開發與測試,所以不會有完整的 Linux 功能,例如桌面環境。不過,還是有高手實現了 Linux 桌面環境,有影片:XFCE 4 Linux Desktop on WSL (windows subsystem for linux) with Pulse Audio

接著說明我安裝 WSL 2 的步驟:
  1. 加入 Windows Insider Program(此步驟不可省略)
  2. 啟用 WSL 必要元件
  3. 安裝 Linux 發行版本
  4. 設定 WSL 2 支援的 Linux 發行版本
  5. WSL 2 問題排除:啟用壓縮功能的虛擬磁碟檔案無法轉換成 WSL 2 架構
  6. 安裝及啟動 Docker
  7. 安裝 Docker Desktop v2.2.1.0

1. 加入 Windows Insider Program(測試人員計畫)

先查看我的 Windows 版本,是 10.0.18363.657:


接著到 https://insider.windows.com/ 加入測試人員計畫(需要登入 Microsoft 帳戶)。加入計畫之後,按照網頁上的指示,開啟 Windows 的[設定 > 更新與安全性 > Windows 人員測試計畫],並使用你剛才加入測試人員計畫的帳戶來進行設定。

在設定過程中,會要你選擇 Windows 更新頻率要快還是慢。我選擇了預設的「慢速」:



加入測試人員計畫之後,執行 Windows Update。更新完成後,查看作業系統版本的變化,確認是 Windows 10 Build 18917 之後的版本,才能進行下一步。



2. 啟用 WSL 必要元件

執行以下 PowerShell 指令:


然後重開機。

3. 安裝 Linux 發行版本

我安裝的是 Ubuntu 18.04。在 Windows 10 環境中開啟 Microsoft Store,然後在商店中搜尋 關鍵字 "ubuntu" 即可找到這個發行版本,安裝過程也很簡單。

如果需要相關的操作步驟,可參考〈Windows 10 上適用於 Linux 的 Windows 子系統安裝指南〉。

4. 設定 WSL 2 支援的 Linux 發行版本

透過命令列視窗執行以下指令:


第二行指令的作用是讓 WSL 2 成為預設架構,即「未來安裝的任何發行版本都要初始化為 WSL 2 的版本」。
👉 注意:你需要把上列指令中的 "ubuntu" 改成你在上一個步驟所安裝的 Linux 發行版本名稱,例如 "ubuntu-18.04"(可用 wsl -l 指令得知發行版本的名稱)。

我在執行上述指令時出現錯誤訊息,因而無法完成指定的操作。接著說明此問題的排除過程。

5. 問題排除

執行上一個步驟的指令時,我看到錯誤訊息:


英文訊息是:
Virtual hard disk files must be uncompressed and unencrypted and must not be sparse.

我最後是從 GitHub 的 issue #4103 找到、由 dmcrunch 提出的解法:把 %USERPROFILE%\AppData\Local\Packages\CanonicalGroupLimited.... 這個資料夾的壓縮選項關閉。如下圖:



按[確定]時,會詢問是否要連同子目錄一起套用新的設定,回答 Yes。然後等它全部跑完,再執行上一個步驟的指令,便順利完成了。
註:我未曾開啟這個壓縮選項,有可能是在安裝 Ubuntu 的時候(前述步驟 2 或 3)自動啟用了?我不確定。
使用 wsl -l -v 指令,可以看到目前執行中的 Linux 發行版本的名稱以及 WSL 的版本,如下圖:


6. 安裝及啟動 Docker

在 Windows 命令視窗輸入 wsl,進入 Linux 命令環境之後,敲入以下指令:


7. 安裝 Docker Desktop v2.2.1.0

原本打算收工了,又看到 Scott Hanselman 的文章裡面寫,Docker Desktop 新版本有支援 WSL 2,於是又下載並安裝了 Docker Desktop 2.1.6.0,然後自動更新至 2.2.1.0。

安裝完成後,進入 Settings,在 General 頁面中,把 Enable the experimental WSL 2 based engine 選項打勾:



套用並重啟 Docker Desktop 之後,Windows 桌面右下角隨即彈出通知訊息,詢問是否要整合目前已經安裝於 Windows 環境上的 Linux 發行版本,如下圖:



當然是要 Enable WSL integration 囉。

接著再次開啟 Docker Desktop  的 Settings 視窗,便可在 Resource > WSL INTEGRATION 頁面中看到它顯示目前已經安裝於 Windows 環境上的 Linux 發行版本,而且是尚未啟用的狀態,只要將它啟用並重啟 Docker Desktop 即可。如下圖:



💬 裝完 Docker Desktop 並完成上述設定之後,我筆電的 C:\ 磁碟減少了 3GB 左右的空間。

開啟 Windows 命令視窗,敲入指令 wsl -l -v,這次會看到除了先前安裝的 Ubuntu,還多出兩個 Linux 發行版本(distros):



Docker 官方部落格有一篇文章解釋了這兩個 distros 的用途:
  • Docker-desktop:提供核心服務,它基本上取代了 Hyper-V。
  • Docker-desktop-data:用來儲存資料,其角色如同掛載於 VM 的 VHD 檔案。

圖中 Ubuntu 的左邊有打星號,代表它是預設的 distro。當我們在 Windows 命令視窗中敲入指令 bash 時,便會進入這個預設的 Linux 環境,如下圖:


你可以看到,Windows 的 C: 磁碟是掛載於此 Linux 環境的 /mnt/C 路徑下。

除了 bash 指令,我們也可以用 wsl -d <distro> 來指定要進入哪個 Linux 環境,參考下圖:



我也可以按 Win+R,輸入 "ubuntu" 來開啟命令視窗,看起來會像這樣:



進入 Linux 環境之後,我打開 Windows 工作管理員,查看 WSL 的 Linux 執行環境用掉多少記憶體。工作管理員顯示處理程序「Vmmem」只用了 566MB,而我的筆電有 24GB,目前的記憶體用量是 15GB(約 64%,其中包含執行中的 SQL Server 2014)。

後記:在 Linux 環境下使用 Visual Studio Code

Scott Hanselman 在他錄製的一個 Youtube 影片中示範了從 Linux 命令列輸入 "code" code" 來啟動 VS Code,挺有意思。我照著試了一下,果然可以直接開啟 Windows 環境上的 VS Code。而且開啟時,VS Code 右下角彈出一個視窗,問我要不要安裝「Remote - WSL」外掛,如下圖:



安裝好這個外掛之後,VS Code 視窗的左下角會有個「Open a remote window」按鈕,點此按鈕便會顯示 Remote-WSL 的功能選單,如下圖:


此時點一下「Remote-WS: New Window」,便可開啟一個新的 VS Code 視窗,而且該視窗是以遠端連線的方式工作,亦即連線至 Linux 環境中的 VS Code Server。如下圖:



也就是說,我們可以在 Windows 環境下,使用我們熟悉的 VS Code 操作介面來直接開發與除錯基於 Linux 環境的應用程式了。挺神奇的 👏👏👏
👉 有關 VS Code 遠端開發的工作原理,可參考官方文件〈Remote Development FAQ〉,特別是 How do the Remote Development extensions work? 一節的說明。

OK! 先寫到這裡,收工。

參考資料

技術提供:Blogger.