升級WSL2到市集版本與注意事項

Allen Kuo (kwyshell)
8 min readJan 5, 2023
Windows Subsystem for Linux Windows Store Version

如我們所熟系的那樣,Windows很多子系統與服務都被綁定在特定系統版本上。而這樣的設計無非就是因為系統中存在層層疊疊的關係,最終導致某個系統很難獨立於大系統外,導致升級與維護上緩慢與困難。如今,WSL2迎來與系統版本脫鉤,我們可以將WSL2直接升級到以Windows 10/11 市集為主的版本。如此一來,版本的迭代更新就變得更容易了。

如何安裝與升級

對於還沒安裝WSL的使用者來說可以採用以下幾個方式安裝:

Command to install WSL
wsl — install

如果你已經安裝了WSL,而你想切換到市集版本,請使用命令列(PS)來完成升級:

Command to update WSL
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時候,多數人安裝了這個桌面系統。

My Xfce4 Neofetch of WSL2

但是在你第一次啟用升級好的WSL後,你會發現你的桌面系統已經無法正常工作了。主要的原因在於新版的WSL內建開始支援圖形介面了。這個圖形系統則是Microsoft 開發良久的WSLg系統。

請不要緊張,這個問題很容易可以修正。

關於WSLg

WSLg Architecture

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 換成你的對象目錄即可。

參考資料:

--

--