第二版視窗子系統 Linux 二刀流無縫順暢運行 | 網管人 207 期



網管人雜誌

本文刊載於 網管人雜誌第 207 期 - 2023 年 4 月 1 日出刊NetAdmin 網管人雜誌 為一本介紹 Trend Learning 趨勢觀念、Solution Learning 解決方案、Technology Learning 技術應用的雜誌,下列筆記為本站投稿網管人雜誌獲得刊登的文章,網管人雜誌於每月份 1 日出刊您可於各大書店中看到它,或透過城邦出版人讀者服務網進行訂閱。





本文目錄






前言

過去,在 Windows 主機上要能夠運作 Linux 作業系統時,管理人員可以透過 Dualboot 機制,在同一台硬體主機中,將 Linux 作業系統安裝在另一個開機磁碟區中,達到使用同一台硬體但運作 Linux 作業系統的目的,或者在 Windows 主機上啟用 Hyper-V 虛擬化技術,建立 VM 虛擬主機然後安裝 Linux 作業系統,又或者在 Windows 主機上安裝 VMware Player 或 VirtualBox 等,客戶端虛擬化軟體,然後再建立 VM 虛擬主機並安裝 Linux 作業系統。很顯然的,這幾種方式,對於不熟悉系統運作架構的管理人員來說並不方便,並且會花費一定程度的手動管理時間。

因此,微軟著手打造並推出「Windows 子系統 Linux」(Windows Subsystem for Linucx,WSL)。簡單來說,管理人員可以在 Windows 系統中,無須進行複雜的修改和組態設定,直接透過底層的 Windows 核心提供資源和主要設定,並且在 Microsoft Build 2019 大會上展示,這就是第一代的 WSL 1(如圖 1 所示)。

圖 1、WSL 1 運作架構示意圖

新版的 WSL 2 運作架構,則是從原有的底層 Windows 核心管理和提供資源,改為整合 Hyper-V 虛擬化技術,但管理人員無須管理傳統 Hyper-V VM 虛擬主機,例如,vNetwork 虛擬網路、vSwitch 虛擬交換器……等組態設定,即可輕鬆建立和運作 Linux 執行個體(如圖 2 所示)。

圖 2、WSL 2 運作架構示意圖

值得注意的是,原有的 WSL 1 和 WSL 2 運作環境,主要支援運作在 Windows 10 和 Windows 11 客戶端作業系統中,在 2022 年 5 月時, 微軟官方正式發佈最新的 WSL 2 運作環境,正式支援運作在最新 Windows Server 2022 雲端作業系統中。





新版 WSL 2 特色功能

簡單來說,新版的 WSL 2 運作架構,除了底層由原本的 Windows 核心主導,改為整合 Hyper-V 虛擬化之外,最大的重點在於能夠於 Windows 系統中執行 ELF64 Linux 二進位檔,達到增加 Linux 檔案系統效能,以及完整的系統呼叫相容性,同時管理人員能夠組態設定,運作的 Linux 執行個體要啟動在舊有的 WSL 1 環境,或是新版的 WSL 2 運作環境,達到相同的使用者操作體驗。

傳統的 Hyper-V 虛擬化架構下,倘若未良好規劃底層網路架構和儲存資源時,建立的 VM 虛擬主機可能發生運作緩慢,並且耗用大量資源的情況,並且還需要管理人員手動管理,而使用 WSL 2 運作環境則無須擔心這些情況及管理成本。

因此,雖然 WSL 2 運作架構是使用 VM 虛擬主機,但採用的是由微軟客製化過後的輕量型 VM 虛擬主機,所以除了提供 WSL 1 運作架構的優點,例如,無縫整合 Windows 和 Linux 異質作業系統、開機時間極短、更低的資源使用量、無須管理和設定 VM 虛擬主機……等。所以,WSL 2 架構雖然使用 VM 虛擬主機,但是由系統在幕後自動進行管理及執行,讓管理人員擁有跟 WSL 1 相同的操作體驗。

在 WSL 2 運作架構中的 Linux 核心來源,是由微軟在 kernel.org 取得的最新穩定分支所建立的,然後針對 WSL 2 架構進行微調和效能最佳化,以便在 Windows 主機上提供最佳的 Linux 操作體驗。此外,這個微調和最佳化後的 Linux 核心,將會由 Windows Update 提供後續的更新服務,所以管理人員無須手動進行管理,便能自動獲得最新的安全性修正程式和 Linux 核心改良功能。

此外,在 WSL 2 運作架構中的 Linux 執行個體,相較於 WSL 1 具備更佳的檔案 IO 效能,舉例來說,管理人員在執行相關操作,例如,git clone、npm install、apt upgrade……等動作時,相較於舊版的 WSL 1 來說大約可以提升「2 ~ 5 倍」的效能,而在解壓縮 tarball 時執行速度更可高達「20 倍」之多(如圖 3 所示)。

圖 3、WSL 2 運作架構和 Linux 執行個體檔案交換示意圖



WSL 1 vs WSL 2

預設情況下,系統將會採用最新的 WSL 2 運作環境,來執行管理人員所需的 Linux 執行個體,主因在於 WSL 2 運作架構,執行的 Linux 執行個體將會採用「受控 VM 虛擬主機」(Managed VM)架構,支援完整的 Linux 核心,以及完整的系統呼叫相容性,所以在跨 Linux 和 Windows 作業系統時的運作效能更佳(如圖 4 所示)。

圖 4、WSL 1 和 WSL 2 特色功能支援比較表





實戰 – WSL 2 on Windows Server 2022

在 Windows 10 和 Windows 11 客戶端作業系統中,管理人員可以很輕鬆的透過 Microsoft Store 商店,直接安裝 最新版本的 WSL 1.0,並且未來也無須再擔心版本更新的問題,因為後續 Microsoft Store 應用程式,一旦發現 WSL 發佈更新版本時,便會自動安裝 WSL 更新版本。

在本實戰演練小節中,則是於最新 Windows Server 2022 雲端作業系統中,安裝最新發佈版本的 WSL。值得注意的是,在部署 WSL 運作環境之前,必須確保運作 Windows Server 2022 的主機,在伺服器硬體底層已經啟用硬體輔助虛擬化技術,並確保主機支援安裝和運作 Hyper-V 虛擬化技術,並且確認已經安裝 KB5014021 安全性更新
簡單來說,Windows Server 2022 主機,至少要安裝 2022 年 5 月或之後的整合安全性更新即可。


部署 WSL 運作環境

在本文實作環境中,已經在伺服器底層啟用硬體輔助虛擬化技術,並且為 Windows Server 2022(21H2)主機,安裝最新安全性更新後 Build number 為「20348.1487」。

確保 Windows Server 2022 雲端作業系統中,已經符合上述運作條件後,即可在 PowerShell 或命令提示字元中,鍵入「wsl --install」指令後,系統便會自動執行相關動作,例如,啟用必要的 WSL 和虛擬主機選擇性元件、下載並安裝最新的 Linux 核心、將 WSL 2 組態設定為預設值、安裝預設的 Ubuntu Linux 發行版本……等,當所有的下載和安裝啟用動作執行完畢後,系統提示必須重新啟動主機,確保套用所有變更(如圖 5 所示)。

圖 5、為 Windows Server 2022 主機安裝 WSL 運作環境

此外,管理人員倘若希望在 Windows Server 2019 主機中安裝 WSL 運作環境,則必須確認為 1709 或後續版本,並在 PowerShell 視窗中執行「Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux」 指令,並重新啟動主機後,執行下載和安裝 Linux 發行版本的動作即可。
倘若,安裝過程中發生 0x8007007e 錯誤訊息時,則表示該系統版本不支援 WSL 運作環境,請確認 Build number 為 16215 或後續版本。


組態設定 Linux 管理員帳號和密碼

重新啟動主機後,在預設情況下,登入 Windows 系統後便會自動下載和執行 Ubuntu Linux 執行個體,當系統成功啟動 WSL 運作環境,並啟動 Ubuntu Linux 執行個體後,第一個動作便是要求管理人員為這個 Ubuntu Linux 執行個體,組態設定登入的管理者帳號及密碼,鍵入管理者帳號及二次確認密碼後,便順利登入 Ubuntu Linux 作業系統(如圖 6 所示)。

圖 6、組態設定 Ubuntu Linux 作業系統管理者帳號及密碼

值得注意的是,這個 Ubuntu Linux 作業系統管理者帳號及密碼,並不會影響 Windows 系統中原有的使用者帳號,所以也無須和 Windows 系統採用相同的管理帳號及密碼。此外,這個鍵入的管理者帳號,將會直接視為 Linux 系統管理員帳號,所以能夠執行「sudo」指令,成為 Linux 作業系統中的超級使用者。
後續新增或重新安裝 Linux 發行版本時,都必須為「每個」Linux 發行版本組態設定管理帳號和密碼。

一般情況下,進入 Linux 發行版本環境後,倘若需要變更使用者密碼,只要鍵入「passwd」指令即可進行密碼變更作業。

然而,在 WSL 運作環境中,管理人員可能會開啟和運作多個不同的 Linux 發行版本環境,並且管理人員必須為每一個運作的 Linux 發行版本,組態設定管理員帳號和密碼,因此就有可能發生忘記密碼的情況。此時,只要在 PowerShell 視窗中,執行「wsl -u root」 指令,接著執行「passwd <使用者帳號>」,即可修改預設 Ubuntu Linux 發行版本中,使用者帳號為 Weithenn 的密碼(如圖 7 所示),倘若要修改密碼的環境並非預設 Ubuntu Linux 執行個體時,則加上「-d <發行版本名稱>」,例如,「wsl -d CentOS -u root」即可。

圖 7、重新設定預設 Ubuntu Linux 執行個體中管理員 Weithenn 帳號的密碼



管理及更新 WSL 版本

確認 WSL 環境運作正常後,管理人員可以透過幾個簡單的指令,查詢管理並更新 WSL 運作環境。首先,在 PowerShell 指令視窗中執行「wsl --version」指令,即可查詢目前運作的 WSL 和相關元件版本,在本文實作環境中採用最新的 WSL 1.0.3.0 安裝版本,執行「wsl --status」指令,查詢預設採用的 Linux 發行版本和 WSL 版本,執行「wsl --update」 指令,預設將會至 Microsoft Store 網站,確認是否有更新的 WSL 版本,管理人員也可以加上「--web-download」參數,改為從 GitHub 網站確認是否有更新的 WSL 版本(如圖 8 所示)。
請注意  !這裡的 WSL 1.0.3.0 安裝版本,請勿和 WSL 1 及 WSL 2 運作環境版本搞混。
圖 8、查詢 WSL 版本並檢查更新

從剛才的查詢結果得知,運作的 WSL 環境預設採用較新的「WSL 2」 版本,倘若管理人員希望調整預設執行的 WSL 版本,請執行「wsl --set-default-version <WSL 版本號碼>」指令,即可組態設定預設的 WSL 版本。

倘若,管理人員希望指定個別 Linux 執行個體,所採用的 WSL 版本時,請執行「wsl --set-version <Linux 發行版本名稱> <WSL 版本號碼>」指令,即可為個別的 Linux 執行個體,指定採用的 WSL 運作環境版本。



安裝和運作其它 Linux 發行版本

預設情況下,系統已經在 WSL 運作環境中,安裝和運作 Ubuntu Linux 執行個體。事實上,WSL 運作環境預設已經支援許多 Linux 發行版本,管理人員只要執行「wsl --list --online」指令,即可查詢目前內建支援哪些 Linux 發行版本,例如,Debian、SUSE Linux、Oracle Linux……等,執行「wsl --list --verbose」指令,查詢目前 WSL 運作環境中安裝和運作哪些 Linux 執行個體(如圖 9 所示)。

圖 9、查詢 WSL 環境內建支援哪些 Linux 發行版本和目前運作的 Linux 執行個體

確認 Linux 發行版本的名稱後,管理人員只要執行「wsl --install <Linux 發行版本名稱>」,例如,「wsl --install SLES-12」指令,系統便會立即執行下載安裝和啟動 SUSE Linux Enterprise Server 的動作,倘若管理人員不希望在安裝 SUSE Linux 發行版本後,自動啟動 SUSE Linux 運作環境的話,可以加上「--no-launch」參數即可。同樣的,先前提到每當安裝新的 Linux 發行版本時,也需要為這個 Linux 發行版本,組態設定管理員帳號和密碼,組態設定完成後便順利登入系統(如圖 10 所示)。

圖 10、新增並運作 SUSE Linux 發行版本至 WSL 運作環境中

目前的 WSL 運作環境中,預設執行的 Linux 執行個體為 Ubuntu,倘若管理人員希望將其它的 Linux 發行版本,組態設定為 WSL 運作環境的預設值時,只要執行「wsl --set-default <Linux 發行版本名稱>」指令即可,例如,本文實作環境中,將剛才安裝好的 SUSE Linux 發行版本,透過「wsl --set-default SLES-12」指令,組態設定為 WSL 運作環境的預設值(如圖 11 所示)。

圖 11、組態設定 SUSE Linux 發行版本為 WSL 運作環境的預設值



透過 Windows Terminal 同時操作

在目前的情況下,可以透過個別的 Linux 發行版本 Shell 指令視窗,進行組態設定和操作管理。然而,這樣的操作方式缺點在於,一旦有多個Linux 發行版本需要同時操作時,管理人員便需要不停切換不同的 Linux 發行版本 Shell 指令視窗,那麼 Windows 有沒有內建的工具可以方便的處理此問題 ?

管理人員可以採用,微軟官方建議的 Windows Terminal 工具,來使用和管理 WSL 運作環境。首先,在 Windows Server 2022 主機中,採用內建的 Edge 瀏覽器,連結至 GitHub - Microsoft/Terminal 頁面,選擇下載最後穩定版本,本文實作環境為「Windows Termianl v1.16.1026」版本,或執行 PowerShell 的「Invoke-WebRequest –Uri <下載網址>」指令進行下載。

下載 MSIX 安裝套件完成後,在 PowerShell 指令視窗中,執行「Add-AppxPackage –Path <MSIX 安裝套件路徑>」指令後,會發生「0x80073CF3」錯誤訊息,系統提示必須要安裝 C++ Runtime Framework for Desktop Bridge(Microsoft.VCLibs.140.00.UWPDesktop)套件才行,下載完成後先安裝 C++ Runtime Framework 套件,即可順利安裝 Windows Terminal,安裝完成後無須重新啟動主機,即可在開始選單中發現新增的 Windows Terminal(如圖 12 所示)。

圖 12、為 Windows Server 2022 主機安裝 Windows Terminal

預設情況下,當系統順利啟用 WSL 運作環境後,便會自動在 Windows Terminal 中產生關聯,在本文實作環境中,已經在 WSL 運作環境中啟動 3 個不同的 Linux 執行個體,所以在 Windows Terminal 視窗中,點選向下圖示時,便能夠看到 3 個不同的 Linux 執行個體可供開啟,或是使用組合鍵快速開啟(如圖 13 所示)。

圖 13、透過 Windows Terminal 同時開啟 WSL 環境中多個 Linux 執行個體

除了可以在同一個視窗中,開啟多個 Linux 發行版本頁籤之外,Windows Terminal 也支援在同一個畫面中分割窗格操作,舉例來說,管理人員可以先開啟 Windows Terminal 的 PowerShell 視窗,然後再開啟 WSL 環境的 Ubuntu Linux 發行版本時,按住「Alt」鍵進行開啟,系統便會自動在原有視窗中分割窗格,並且登入至 WSL 環境的 Ubuntu 作業系統中,同樣的操作再開啟 SUSE Linux 和 Oracle Linux 後,便在同一個視窗中可以快速在不同的分割窗格中,操作不同的 Linux 作業系統環境(如圖 14 所示)。

圖 14、同一個視窗中不同的分割窗格操作不同的 Linux 作業系統環境



匯入其它 Linux 發行版本

雖然,預設的 WSL 運作環境,已經內建支援多套 Linux 發行版本,但是管理人員習慣的 Linux 發行版本可能未包含在內。此時,便可以透過取得 Linux 發行版本的二進位 tar 檔案,執行匯入 WSL 運作環境的動作,後續便可以在 WSL 運作環境中,啟動剛才匯入的 Linux 發行版本。

首先,當 Linux 發行版本有提供二進位 tar 檔案時,只要下載後執行匯入 WSL 運作環境的動作即可,舉例來說,在 Alpine Linux 發行版本 官網當中,管理人員可以直接下載「Mini Root Filesystem」 中的檔案即可使用,在本文實作環境中,下載 Mini Root Filesystem 類別下的「x86_64」 項目的 tar.gz 檔案。

將 tar.gz 檔案解壓縮後,得到「alpine-minirootfs-3.17.1-x86_64.tar」 檔案,開啟 PowerShell 指令視窗,鍵入「wsl –import <Linux 發行版本名稱 > <Linux 作業系統磁碟存放路徑> <Tar 檔路徑>」,在本文實作環境中為「wsl --import Alpine C:\tmp\Alpine\ .\alpine-minirootfs-3.17.1-x86_64.tar」,指定將屆時的 Alpine Linux 發行版本磁碟,存放於「C:\tmp\Alpine」 資料夾內。

匯入動作執行完成後,切換到剛才指定存放 Alpine Linux 磁碟的資料夾中,可以發現系統已經自動建立名為「ext4.vhdx」 檔案,這就是在 WSL 運作環境中,Alpine Linux 作業系統 vDisk 虛擬磁碟,採用 .vhdx 副檔名的檔案,表示這是 Hyper-V 虛擬化平台的 vDisk 虛擬磁碟檔案類型。

鍵入「wsl --list --verbose」指令,即可發現已經順利將 Alpine Linux 發行版本,匯入至 WSL 運作環境中,但是目前為「Stopped」未啟動狀態,只要執行「wsl --distribution Alpine」指令,便立即啟動 Alpine Linux 作業系統並登入其中,再次鍵入「wsl --list --verbose」指令,可以發現 Alpine Linux 發行版本為「Running」運作中的狀態(如圖 15 所示)。

圖 15、匯入 Alpine Linux 發行版本至 WSL 運作環境並啟動它



存取 Windows 主機資源

在預設情況下,WSL 運作環境已經自動將 Windows 主機的磁碟機,自動掛載至啟動 Linux 發行版本中的「/mnt/<drive>」下,舉例來說,Windows 主機的 C : 槽,便會自動掛載至 Linux 發行版本中的「/mnt/c」路徑。

因此,當 WSL 運作環境中的 Linux 發行版本,需要和 Windows 主機進行資料交換時,透過 WSL 內建跟檔案系統的運作機制,便能輕鬆達成資料交換的目的。

舉例來說,管理人員可以在 Windows 主機中,建立「C:\testmount」資料夾,裡面存放剛才實作匯入的 Tar 檔案,以及一個名稱為 test.txt 的文字檔案,接著切換到 Ubuntu Linux 作業系統環境中,查看「/mnt/testmount」路徑,即可看到在 Windows 主機建立和複製的檔案,同樣的在 Ubuntu Linux 作業系統中,建立一個名稱為 test02.txt 的文字檔案,切回 Windows 主機的 PowerShell 視窗中,同樣能夠看到 test02.txt 文字檔案的內容(如圖 16 所示)。

圖 16、測試 WSL 運作環境跨 Windows 和 Linux 檔案系統功能



停止並取消註冊 Linux 發行版本

預設情況下,一旦啟動 Linux 發行版本後,便會持續運作直到管理人員執行停止運作指令。舉例來說,剛才匯入並運作的 Alpine Linux 發行版本,當管理人員測試完畢希望清理它時,先執行「wsl --terminate Apline」指令,再執行「wsl --list --verbose」指令,可以發現 Alpine Linux 由原本的「Running」 運作中狀態,改變為「Stopped」停止運作狀態。

接著,鍵入「wsl --unregister Alpine」指令後,再次執行「wsl --list --verbose」指令,可以發現已經將 Alpine Linux 發行版本,從原本 WSL 運作環境清單中刪除(如圖 17 所示)。值得注意的是,這個取消註冊 Linux 發行版本的動作,將會把所有相關聯的資料、組態設定、軟體……等都移除,所以管理人員執行這個指令之前,務必確認清楚再執行。

圖 17、在 WSL 運作環境中停止並取消註冊 Alpine Linux 發行版本



一次停止所有 Linux 執行個體

在剛才小節中,管理人員可以透過「wsl --terminate」指令,針對「單一」運作中的 Linux 發行版本,執行停止運作的動作。倘若,在 WSL 運作環境中,同時運作多個 Linux 發行版本時,要逐一停止運作便顯得麻煩。

此時,管理人員可以透過「wsl --shutdown」指令,一次將 WSL 運作環境中「所有」的 Linux 執行個體全部停止(如圖 18 所示)。

圖 18、一次停止 WSL 運作環境中所有 Linux 執行個體





結語

透過本文的深入剖析和實作演練後,管理人員除了理解舊版的 WSL 1,和新版 WSL 2 的功能差異之外,在實戰演練小節中,直接在 Windows Server 2022 雲端作業系統中,安裝和運作最新整合 Hyper-V 虛擬化技術的 WSL 1.0 版本,實際運作和管理不同的 Linux 執行個體,並且和 Windows 主機進行檔案交換作業,讓企業和組織中的管理人員和開發人員,能夠透過最小成本的情況下,輕鬆打造出研發和測試環境。