升級WSL2到市集版本與注意事項
如我們所熟系的那樣,Windows很多子系統與服務都被綁定在特定系統版本上。而這樣的設計無非就是因為系統中存在層層疊疊的關係,最終導致某個系統很難獨立於大系統外,導致升級與維護上緩慢與困難。如今,WSL2迎來與系統版本脫鉤,我們可以將WSL2直接升級到以Windows 10/11 市集為主的版本。如此一來,版本的迭代更新就變得更容易了。
如何安裝與升級
對於還沒安裝WSL的使用者來說可以採用以下幾個方式安裝:
- 透過市集來 WSL (https://aka.ms/wslstorepage) 安裝
- 使用命令列(PS)來安裝:
wsl — install
如果你已經安裝了WSL,而你想切換到市集版本,請使用命令列(PS)來完成升級:
wsl — update
檢查版本狀況
在你完成升級安裝後,你可以嘗試開啟WSL來檢察系統前後版本的差異。
Linux 5.10.102.1-microsoft-standard-WSL2 #1 SMP Wed Mar 2 00:30:59 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
Linux 5.15.74.2-microsoft-standard-WSL2 #1 SMP Wed Nov 2 19:50:29 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
關於圖形介面
圖形介面的使用這是每個升級WSL2會遇上最多的問題。在WSL最初的版本中,並不包含了圖形介面的支持。所幸,Linux的原初設計就可以讓使用者藉由安裝 XServer 或是 Wayland Server 來呈現GUI。於是乎,很多人為了體驗完整的Linux系統,而自行安裝 XServer/Wayland 等等 Backends。並且使用這些 Backends 安裝了桌面系統諸如:Xfce、GNOME、 KDE 等等。個人是偏好在WSL上使用XFCE。原因無他,似乎在我接觸WSL時候,多數人安裝了這個桌面系統。
但是在你第一次啟用升級好的WSL後,你會發現你的桌面系統已經無法正常工作了。主要的原因在於新版的WSL內建開始支援圖形介面了。這個圖形系統則是Microsoft 開發良久的WSLg系統。
請不要緊張,這個問題很容易可以修正。
關於WSLg
WSL演進過程中,開始加入了GPU運算的支援。為了讓更多的AI、ML與OpenCV這類GCPU計算可以在WSL中運行,主要的GPU開發商與微軟合作推出了可以支持WSL系統的相關驅動與軟體。這些基於GPU的支援,微軟稱為vGPU架構。利用Windows HOST來支持WSL中各種系統需求,並透過DirectX的 D3D12 Gallium Driver來抽象 GUP (基於Mesa) 命令呼叫。總之,WSLg系統中,不只是開始支援 Wayland,更加入了GPU的各種支援。甚至於,PulseAudio 的音樂Server也被加入。這些美意無非是要讓WSL用起來更像真正的Linux。但是,對於已經動手改造過WSL的使用者,勢必也造成一定的衝突。
完全關閉WSLg
你可能注意到WSLg的圖形呈現方式是一種沒有桌面系統的方式。App被以個別的方式呈現。通常我們稱為無接縫模式或是App模式。相對此模式,則是以桌面為主的浮動(Float)模式。我自己偏好使用桌面系統。或許你可以嘗試放棄微軟的美意。保留自己客製化的熟悉感與自己的桌面系統。
修改,%USERPROFILE%\.wslconfig 並添加:
[wsl2]
guiApplications=false
此後,重新啟動WSL。WSLg的相關功能就會被停用,一切又回到熟悉的狀態。
不關閉WSLg,用回自己原本的XServer
我們已經明白為何升級到新版本的WSL後,會產生桌面系統的衝突了。但如果我們想在不關閉WSLg功能下,繼續使用諸如PulseAudio Server的音效功能,那麼我們就必須明確告知GUI系統,我的 Backend 是甚麼。比方說我們能強制使用XServer而非WSLg的XWayland。
修改,shell的RC設定檔。比方,~/.bashrc 或是 ~/.zshrc
export GDK_BACKEND=x11
並請調整適當的 DISPLAY 參數:
export DISPLAY=”$(ip route|awk ‘/^default/{print $3}’):1.0"
注意 DISPLAY=SERVER_IP:X.0 的調整。X必須根據你 Display Number來調整。當然預設為 DISPLAY=SERVER_IP:0.0
如果你有用到 QT 等 GUI,也能透過調整環境參數來選擇你要的 Backend 。
export QT_QPA_PLATFORM=wayland
總結
這一切看起來似乎有點麻煩。不過Linux的高度客製化與可修改性就是它吸引人的地方。但是也同時產生了各種版本的破碎與不統一。這點連兄弟黨Android系統也是如此。與作業系統脫勾後WSL,可以更快速的升級核心,提供更快更新的Linux Kernel。這種Windows 與 Linux 的混和設計對開發者來說無疑是個超方便的選擇。
後記
WSL系統擺脫了過去採用VM架設Linux的狀況,慢又沒有效率,資源共享與系統整合又很差。並且 WSL 的加入,讓Docker在Windows得到更好的發揮。不過我還是必須點出一些大缺點:
WSL 的 DrvFS 對 微軟自家的 NTFS 支援好差。慢到不像話啊!怎麼那麼久都沒改善啊!我想多數人都想把檔案放在可以Windows系統共享的NTFS磁碟上吧。這樣一來可以更方便的實現Windows編程,Linux編譯的理想工作模式。偏偏這點超慢的。(內建的ext4是基於ext4.vhdx獨立系統,速度沒甚麼太大問題)
另一個大問題就是對於Symbolic Link的支援。在WSL中使用沒甚麼問題,但是在NTFS就產生了極大困擾。Windows NTFS也能支援Symbolic Link,但是支援的狀況有時存在無法互通的狀況。NTFS有 Symbolic Link 與 Junction 兩種連結。兩者支持與權限又不盡然相同。透過WSL在NTFS磁碟上建立的連結到了Windows上會產生諸多使用上的問題。
這邊我設計了一個轉換工具。可以一定程度的修復Symbolic Link 問題,請把 targets 換成你的對象目錄即可。
參考資料:
- The Windows Subsystem for Linux in the Microsoft Store is now generally available on Windows 10 and 11 — Windows Command Line
- GitHub — microsoft/wslg: Enabling the Windows Subsystem for Linux to include support for Wayland and X server related scenarios
- GitHub — microsoft/FreeRDP-mirror: FreeRDP is a free remote desktop protocol library and clients
- Install WSL | Microsoft Learn
- WSLg Architecture — Windows Command Line (microsoft.com)
- In the works: OpenCL™ and OpenGL® mapping layers to DirectX — DirectX Developer Blog (microsoft.com)
- Wayland v/s Xorg : How Are They Similar & How Are They Different (secjuice.com)
- Get started mounting a Linux disk in WSL 2 | Microsoft Learn