這篇筆記簡單紀錄我在 Windows 10 環境上安裝 WSL 2 的過程,並簡短介紹如何使用 Windows 環境上的 VS Code 來開發 Linux-based 程式。
跟上一個版本相比,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 看來是個不錯的選擇。
接著說明我安裝 WSL 2 的步驟:
接著到 https://insider.windows.com/ 加入測試人員計畫(需要登入 Microsoft 帳戶)。加入計畫之後,按照網頁上的指示,開啟 Windows 的[設定 > 更新與安全性 > Windows 人員測試計畫],並使用你剛才加入測試人員計畫的帳戶來進行設定。
在設定過程中,會要你選擇 Windows 更新頻率要快還是慢。我選擇了預設的「慢速」:
加入測試人員計畫之後,執行 Windows Update。更新完成後,查看作業系統版本的變化,確認是 Windows 10 Build 18917 之後的版本,才能進行下一步。
然後重開機。
如果需要相關的操作步驟,可參考〈Windows 10 上適用於 Linux 的 Windows 子系統安裝指南〉。
第二行指令的作用是讓 WSL 2 成為預設架構,即「未來安裝的任何發行版本都要初始化為 WSL 2 的版本」。
我在執行上述指令時出現錯誤訊息,因而無法完成指定的操作。接著說明此問題的排除過程。
英文訊息是:
我最後是從 GitHub 的 issue #4103 找到、由 dmcrunch 提出的解法:把 %USERPROFILE%\AppData\Local\Packages\CanonicalGroupLimited.... 這個資料夾的壓縮選項關閉。如下圖:
按[確定]時,會詢問是否要連同子目錄一起套用新的設定,回答 Yes。然後等它全部跑完,再執行上一個步驟的指令,便順利完成了。
安裝完成後,進入 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 即可。如下圖:
開啟 Windows 命令視窗,敲入指令 wsl -l -v,這次會看到除了先前安裝的 Ubuntu,還多出兩個 Linux 發行版本(distros):
Docker 官方部落格有一篇文章解釋了這兩個 distros 的用途:
圖中 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)。
安裝好這個外掛之後,VS Code 視窗的左下角會有個「Open a remote window」按鈕,點此按鈕便會顯示 Remote-WSL 的功能選單,如下圖:
此時點一下「Remote-WS: New Window」,便可開啟一個新的 VS Code 視窗,而且該視窗是以遠端連線的方式工作,亦即連線至 Linux 環境中的 VS Code Server。如下圖:
也就是說,我們可以在 Windows 環境下,使用我們熟悉的 VS Code 操作介面來直接開發與除錯基於 Linux 環境的應用程式了。挺神奇的 👏👏👏
OK! 先寫到這裡,收工。
WSL 2 簡介
跟上一個版本相比,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 的步驟:
- 加入 Windows Insider Program(此步驟不可省略)
- 啟用 WSL 必要元件
- 安裝 Linux 發行版本
- 設定 WSL 2 支援的 Linux 發行版本
- WSL 2 問題排除:啟用壓縮功能的虛擬磁碟檔案無法轉換成 WSL 2 架構
- 安裝及啟動 Docker
- 安裝 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! 先寫到這裡,收工。
參考資料
- WSL 2 的安裝指示 (Microsoft Docs)
- Windows 10 上適用於 Linux 的 Windows 子系統安裝指南(Microsoft Docs)
- How to set up Docker within Windows System for Linux (WSL2) on Windows 10 by Scott Hanselman
- 影片:Developing on Windows with WSL2 (Subsystem for Linux), VS Code, Docker, and the Terminal by Scott Hanselman
- 最近開始改用 WSL2 跑 docker 當開發環境 by Pigo Chu