您當前的位置:首頁 > 攝影

WSLg:為WSL增光添彩

作者:由 silaoA 發表于 攝影時間:2021-06-18

本文共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:為WSL增光添彩

一把梭就是幹

有了

WSLg

後,可以再大膽點在終端敲

gedit

或者其他Linux GUI程式名,用來跑Linux系統中專有的GUI程式,讓幹活更加順手。微軟宣傳的“無縫體驗”,“無縫”在哪兒呢?先看下面兩個動圖。第1個是執行

gvim

gedit

,第2個執行的是一個機器人模擬軟體,利用了GPU進行3D加速,跑大型軟體也毫無壓力。

WSLg:為WSL增光添彩

執行gedit和gvim(圖源:devblogs。microsoft。com

WSLg:為WSL增光添彩

利用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:為WSL增光添彩

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

如本文對你有幫助,或內容引起極度舒適,歡迎分享轉發與留言交流

WSLg:為WSL增光添彩

WSLg:為WSL增光添彩

►本文為原創文章,如需轉載請私信知乎賬號silaoA或聯絡公眾號偽碼人(We_Coder)。

都看這裡了,不妨點個贊再走唄

標簽: Linux  Windows  WSLg  微軟  wsl