WSLg:為WSL增光添彩
本文共1800餘字,預計閱讀時間6分鐘,本文知乎連線:WSLg:為WSL增光添彩,本文同步釋出於silaoA的部落格和微信公眾號平。 關注學習瞭解更多的Cygwin、Linux技術。
2021年微軟的build大會沒有刻意搶Google IO 2021之前,這一次微軟繼續帶來了Visual Studio、Teams、。NET、VS Code、MAUI等一系列新內容,不忘踐行“Microsoft ❤ Developer”、“Microsoft ❤ Linux”,還帶來
WSLg
。
目 錄
0x00 回顧WSL雄心
0x01 無縫的桌面體驗
0x02 WSLg怎麼做到的
0x03 後記
0x00 回顧WSL雄心
2016年
,微軟在Windows 10週年更新中,引入了新的子系統
WSL
(Windows Subsystem for Linux),剛出來的時候叫“Bash on Ubuntu on Windows”還是測試版,到Windows 10 1709版時變為正式版並更名為WSL,把基本的linux系統帶到了Windows 10中。其中的黑科技,莫如用Windows的API構建一套Linux模擬器(模擬機制),動態地將Linux程式中的system call生生翻譯成Windows API呼叫,達到二進位制相容Linux程式的目標。畢竟是核心設計的差異,這種模擬無法實現100%全部翻譯,即使100%翻譯了效能也可能打折扣。
2019年
,微軟官宣了
WSL2
,翻譯系統呼叫的坑太大填不下去了,第二代
WSL
改成了真Linux核心套虛擬機器的方式。從模擬到虛擬,一字之差,技術路線迥異,魔改起來更得心應手。微軟調教的Linux核心配上自己家HyperV,比起普通虛擬機器搭配Linux發行版的效率高不少。
WSL2
所用的Linux核心,也是開源的,專案地址:
https://
github。com/microsoft/WS
L2-Linux-Kernel
,適配
WSL2
的Linux發行版也越來越多。
2020年
build大會,微軟立下了在
WSL
中支援Linux GUI程式的目標,並做了初步的演示。前面的
WSL
和
WSL2
已經很好地解決了在Windows中執行Linux命令列程式的問題,配上漂亮大氣的
Windows Terminal
終端,大大提高Windows 10生產力,從Mac陣營多多少少爭取了些粉絲過來。但微軟有著更遠的目標,要做就做全,大廠就是這麼大氣。
2021年
4月,微軟放出了在
WSL2
中支援Linux GUI程式技術的預覽版產品,叫做
WSLg
,並且開源,專案地址:
https://
github。com/microsoft/ws
lg
,此次build 2021大會只是再次介紹了下。
WSLg
是Windows Subsystem for Linux GUI的縮寫,意圖在WSL中支援直接執行Linux GUI程式,介面和Windows桌面環境無縫整合。
WSLg
在預覽版之後不久就釋出了正式版。
0x01 無縫的桌面體驗
在
WSLg
之前,只能透過終端(比如微軟自家的
Windows Terminal
)執行WSL髮型版中的命令列程式,常見的如執行vim/emacs寫程式碼,然後編譯、除錯、部署一把梭過去,同時Windows上可能開著QQ、微信、Excel。。。,也不用虛擬機器來回切換了,就在一臺Windows 10機器上搞定。
一把梭就是幹
有了
WSLg
後,可以再大膽點在終端敲
gedit
或者其他Linux GUI程式名,用來跑Linux系統中專有的GUI程式,讓幹活更加順手。微軟宣傳的“無縫體驗”,“無縫”在哪兒呢?先看下面兩個動圖。第1個是執行
gvim
和
gedit
,第2個執行的是一個機器人模擬軟體,利用了GPU進行3D加速,跑大型軟體也毫無壓力。
執行gedit和gvim(圖源:devblogs。microsoft。com
利用GPU 3D加速跑機器人模擬軟體(圖源:devblogs。microsoft。com)
從上可見,Linux GUI程式的視窗就像是Windows中的普通程式一樣顯示、疊加,在底下的工作列也有圖示,基本上與Windows桌面環境融為一體,如果不是Linux GUI程式風格與Windows差異過於明顯,壓根看不出來這是Linux GUI程式。這,是怎麼做到的?
0x02 WSLg怎麼做到的
瞭解Linux GUI程式機制就勢必繞不開
X Window System
,可以參考Cygwin系列(十二):瞭解X。要讓圖形視窗顯示出來,光有X客戶端程式是不夠的,還得要一個X Server來負責顯示。按照一般想法,有下面兩個技術路線:
1。 在Windows上部署一個的Win32版X Server,比如開源的
Xming
、
vcXsrv
或者
Cygwin/X
、商業的
xshell
、
mobaxterm
等,已有他山之石在前,只是X Server本身還要佔個視窗,以及X視窗管理器與Windows的視窗管理之間平衡等等問題,達到“無縫”的體驗得微軟獨家調教、繼續魔改;
2。 在
WSL
裡塞一個X Server補齊Linux桌面環境,這樣會造成WSL發行版不夠輕量,也許和普通虛擬機器搭完整Linux發行版就差不多了,達到“無縫”體驗嘛同樣得魔改。
WSLg架構(圖源:devblogs。microsoft。com)
畢竟微軟不一般,
微軟另闢了第三條路線
。微軟做了個和WSL使用者發行版(User Distro,如Ubuntu、Debian、openSUSE、CentOS等)平級的“WSLg System Distro”,這個Linux發行版原本是微軟內部在Azure雲上的Linux系統,叫做“CBL-Mariner”,現在經過精心剪裁一番魔改之後,專門幹一件事——跑X Server。好了現在X Server有了,但圖形介面是顯示在
WSLg System Distro
裡,怎麼進到這個系統裡看呢?微軟在
WSLg System Distro
里加了遠端桌面服務套件——
FreeRDP
,一個支援Windows遠端桌面協議(RDP)的服務端,如果是在Windows裡裝Linux虛擬機器的話,可以用Windows自帶的遠端桌面客戶端和虛擬Linux系統中的
FreeRDP
通訊。就這樣,透過Windows -> RDP -> X Server一層套一層,把圖形視窗“無縫”地整合到了Windows桌面環境中,整個形成了上圖的架構。
上面提到
WSLg
裡的X Server其實說法不準確,應該叫Wayland Compositor。Wayland作為後起之秀,大有趕超X取而代之之勢,很多Linux發行版都在把桌面環境預設顯示服務從X換成Wayland。
WSLg
用到的其實是一個Wayland Compositor,就是Wayland官方給出的參考實現
Weston
。
Weston
可以對接Wayand客戶端程式,但傳統的X11客戶端程式也不可忽視,可以透過XWayland進行協議轉換,最後都交到
Weston
來顯示圖形視窗,這樣同時支援Wayland和X11客戶端程式。
整個
WSLg System Distro
、Windows遠端桌面客戶端(mstsc。exe)的視窗都是對使用者隱藏的,猜測是使用者開啟WSL或者敲完Linux GUI程式名的時候,這些隱藏的元件就已經在後臺運行了。具體來說就是上圖的
WSLGd
,微軟解釋說一個類似守護程序的程式,負責啟動
Weston
、建立RDP通訊等工作,如果它們掛了的話還要負責重啟它們。
這樣完整看下來,把整個
WSLg System Distro
稱作
WSLg
才是恰如其分的,支援Linux GUI程式的核心都在於此。那麼問題來了,繞一大圈專門做
WSLg
,並不比上面提的路線2先進,反有捨近求遠的意思,為啥不直接走路線2呢?其實也好理解,個人認為是職責分工造成的:
1。 走路線2的話需要各User Distro的廠商去魔改、適配WSL和Windows,他們沒有這個義務配合微軟(商業利益分成另說),要麼就只能反過來微軟一個個去適配他們;
2。 即使各User Distro的廠商有這個意向,需要深入Windows API的時候,不如微軟自家的工程師團隊熟悉,何況Windows中有大量不對外公開的API,只有自家人最瞭解Windows,而且也是微軟最有動力(利益導向)去做Linux GUI程式支援,理應出力最多;
3。 將
WSLg
獨立出來,有利於微軟對
WSLg
的把控,保持在不同User Distro有一致性體驗,專注
WSLg
的開發和快速迭代升級,回到第1條的話易造成碎片化,而且基於微軟自家現有的CBL-Mariner,
WSLg
不必另起爐灶,減少成本。
最後需要注意的是,至少目前來看
WSLg
主要是作為顯示伺服器,並沒有把全部的桌面環境要素放進來,WSL中也沒有,因此
不能像在完整Linux發行版中那樣點桌面圖示來啟動程式
,Linux GUI程式(客戶端)仍要在終端敲命令啟動。
0x03 後記
WSLg
獲得了虛擬GPU(vGPU)支援了,還有了硬體加速的
OpenGL
圖形庫支援,機器配置相容WDDM v3。0(Windows Display Driver Model)的GPU的話,跑3D程式將更為流暢。要體驗
WSLg
,可參照專案地址
https://
github。com/microsoft/ws
lg
安裝或升級。
參考
https://
devblogs。microsoft。com/
commandline/the-initial-preview-of-gui-app-support-is-now-available-for-the-windows-subsystem-for-linux-2/
https://
devblogs。microsoft。com/
commandline/wslg-architecture/
https://x。cygwin。com
https://
sourceforge。net/project
s/xming
https://
sourceforge。net/project
s/vcxsrv
https://mobaxterm。mobatek。net
http://www。xshellcn。com
更多閱讀
微軟WSL——Linux桌面版未來之光
Cygwin系列(十二):瞭解X
偽碼人專欄目錄導航
silaoA的部落格。https://silaoa。github。io
如本文對你有幫助,或內容引起極度舒適,歡迎分享轉發與留言交流
►本文為原創文章,如需轉載請私信知乎賬號silaoA或聯絡公眾號偽碼人(We_Coder)。
都看這裡了,不妨點個贊再走唄