WSL Windows子系統 虛擬化 輕量型VM Ubuntu Linux

整合Hyper-V虛擬化 系統呼叫相容性及檔案系統效能大增

第2版視窗子系統Linux 二刀流無縫順暢運行

2023-04-11
本文將說明舊版WSL 1與新版WSL 2的功能差異,並在Windows Server 2022中安裝及運作最新整合Hyper-V虛擬化技術的WSL 1.0版本,實際運作和管理不同的Linux執行個體,並且與Windows主機進行檔案交換作業,讓管理人員與開發人員能夠輕鬆打造出研發和測試環境。

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

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

圖1  WSL 1運作架構示意圖。 (圖片來源:The new Windows subsystem for Linux architecture: a deep dive - BRK3068)

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

圖2  WSL 2運作架構示意圖。 (圖片來源:The new Windows subsystem for Linux architecture: a deep dive - BRK3068)

值得注意的是,原有的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執行個體檔案交換示意圖。 (圖片來源:The new Windows subsystem for Linux architecture: a deep dive - BRK3068)

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

圖4  WSL 1和WSL 2特色功能支援比較表。 (圖片來源:比較 WSL 版本 | Microsoft Learn)

準備實戰演練

在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發行版本的動作即可。

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

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

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

值得注意的是,這個Ubuntu Linux作業系統管理者帳號和密碼並不會影響Windows系統中原有的使用者帳號,所以也無須與Windows系統採用相同的管理帳號和密碼。此外,這個鍵入的管理者帳號,將會直接視為Linux系統管理員帳號,所以能夠執行「sudo」指令,成為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所示。

圖8  查詢WSL版本並檢查更新。

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

若希望指定個別Linux執行個體所採用的WSL版本時,執行「wsl --set-version 」指令,就能夠為個別的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 」,例如「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 」指令即可,例如本文實作環境中,將剛才安裝好的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 」指令,會發生「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運作環境中啟動三個不同的Linux執行個體,所以在Windows Terminal視窗中點選向下圖示,便能夠看到三個不同的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 」,在本文實作為「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/」下。例如,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執行個體。

<本文作者:王偉任,Microsoft MVP及VMware vExpert。早期主要研究Linux/FreeBSD各項整合應用,目前則專注於Microsoft及VMware虛擬化技術及混合雲運作架構,部落格weithenn.org。>


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!