這篇筆記簡單紀錄我在 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 指令:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart | |
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart |
然後重開機。
3. 安裝 Linux 發行版本
我安裝的是 Ubuntu 18.04。在 Windows 10 環境中開啟 Microsoft Store,然後在商店中搜尋 關鍵字 "ubuntu" 即可找到這個發行版本,安裝過程也很簡單。如果需要相關的操作步驟,可參考〈Windows 10 上適用於 Linux 的 Windows 子系統安裝指南〉。
4. 設定 WSL 2 支援的 Linux 發行版本
透過命令列視窗執行以下指令:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
wsl --set-version ubuntu 2 | |
wsl --set-default-version 2 |
第二行指令的作用是讓 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 命令環境之後,敲入以下指令:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
sudo apt update | |
sudo apt upgrade | |
sudo apt install docker.io | |
sudo service docker start |
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