WSLG微軟開源的Windows子系統GUI增強
WSL是個非常棒的系統,可以在Windows內核上直接運行Linux鏡像,避免了通過虛擬機方式運行Linux。從而高效搞交互解決windows下運行Linux的問題。但是WSL圖形交互功能不是很好,這對Windows用戶來說這個顯得略顯生疏。為了解決這個問題,微軟今年開源了WSLG系統 (Windows Subsystem for Linux GUI) 的,其目的是Windows上以完全集成的桌面體驗運行Linux 桌面應用程序。 本文請和蟲蟲一起來學習一下WSLG系統。

概述
WSLG支持在Windows環境下需要運行在 Linux自己桌面工具或應用程序的開發人員、科學家或愛好者提供友好的交互和高效體驗。
WSLG 致力于讓Linux GUI應用程序在Windows上使用起來感覺原生和自然。可以任務欄中、剪切/粘貼,WSLG支持Windows和 Linux桌面應用程序的無縫體驗的工作流程。
系統架構
WSLG基于WSL虛擬機,Linux桌面個原生APP通過Xwayland,Pulse音頻服務器,繼承到Weston系統,再通過FreeRDP,WSLDVC Windows插件(mstsc.exe)和Windows交互,其架構圖如下:

用戶發行版
用戶發行版都在同一個 WSL 虛擬機中針對Linux內核的單個實例運行。PC上的不同用戶擁有自己的VM和WSL實例。其Linux 環境是用戶級的是無法與其他 Windows用戶共享。
系統發行版
WSLG系統發行版整個架構的核心和交互中心,其實質是一個容器化的Linux環境,系統發行版基于 Microsoft CBL-Mariner Linux,一個最小的Linux環境,用于以運行WSLG的各個部分。容器中運行WSLG XServer、Wayland 服務器和Pulse音頻服務器。他們之間以及和用戶發行版通過Soket進行通訊交互。用戶發行版中預設了環境變量 DISPLAY、WAYLAND_DISPLAY 和 PULSE_SERVER用于應用這些組件服務,實現WSLG 開箱即用。
用戶可以通過在c:\users\MyUser\.wslconfig中添加以下方法來關閉系統發行版:
- [wsl2]
- guiApplications=false
每個WSL 2用戶發行版都與其系統發行版實例配對。系統發行版與其配對的用戶發行版部分隔離,在NS/PID/UTS命名空間中運行,但共享其他命名空間,例如 IPC允許跨邊界共享內存優化。
系統發行版的每個實例都從其支持的VHD中以只讀方式加載。當WSL重新啟動時,對系統發行版的內存實例所做的任何修改(例如安裝新包或創建新文件)都會被丟棄。
WSLGd
WSLGd是在init之后啟動的第一個進程。 WSLGd啟動Weston (使用 XWayland)、 PulseAudio 并通過mstsc.exe主機上以靜默模式建立RDP連接。 RDP連接將保持活動狀態并準備好顯示正在啟動的新GUI應用程序,沒有任何連接建立延遲。 WSLGd以守護進程凡事監聽這些進程,避免他們由于錯誤退出。
Weston
Weston 是Wayland項目的參考合成器,WSL的核心。在WSLG中對其擴展libweston 現有RDP后端,實現遠程應用程序。WSLG還在其新增加了多顯示器支持、剪切/粘貼、音頻輸入/輸出等功能。
應用程序集成是通過名為RAIL(本地遠程應用程序集成)和VAIL(本地集成虛擬化應用程序)的RDP技術實現的。RAIL和VAIL之間的主要區別在于像素如何從RDP服務器傳輸到 RDP 客戶端。在RAIL中,假設服務器和客戶端運行在通過網絡通信的不同物理系統上,因此需要通過 RDP 傳輸復制像素。在VAIL中,Server 和Client位于同一個物理系統上,可以跨 Guest/Host VM邊界共享內存。
RAIL-Shell
WSLG中還引入了RAIL Shell用于幫助將單個窗口從Linux映射到 Windows,該 shell 非常簡單,不涉及任何實際的小部件或shell擁有的像素。
FreeRDP
Weston 利用FreeRDP來實現其后端RDP服務器。FreeRDP用于根據RDP協議規范直線RDP 服務器到RDP客戶端(Windows 上的 mstsc)的所有通信進行編碼。 它還用于解碼從RDP客戶端到RDP服務器的所有流量。
Pulse音頻插件
對于音頻輸入(麥克風)和輸出(揚聲器/耳機),WSLG 運行 Pulse音頻服務器。WSLG 使用兩個RDP插件的用于接收音頻輸出和音頻輸入,插件有效地在 Pulse Server和Weston RDP服務器之間傳輸音頻樣本。音頻流由Weston RDP服務器合并到RDP傳輸上,從而有效地在所有場景(桌面/RAIL/VAIL 風格遠程處理)中啟用Weston RDP后端中的音頻輸入/輸出。
WSLDVCPlugin
WSLG在Weston RDP 服務器和Windows主機上運行的mstsc RDP客戶端之間使用自定義虛擬通道。Weston 使用該通道枚舉所有Linux GUI應用程序(即具有Gui 類型的桌面文件條目的應用程序)及其啟動命令行和圖標。 WSLDVCPlugin 處理通過此通道發送的Linux GUI應用程序列表,并在Windows開始菜單中為其創建鏈接。
安裝
先決條件
Windows 10 Insider Preview內部版本 21362+
WSLG 將與即將發布的Windows一起普遍可用。要訪問 WSLG 的預覽版,需要加入預覽體驗并從測試版或開發頻道運行Windows 10預覽版本。
建議在為WSL啟用虛擬 GPU (vGPU) 的系統上運行 WSLG,以便可以從硬件加速OpenGL渲染。可以在下面找到合作伙伴提供的支持 WSL的預覽驅動程序。
從具有管理員權限的命令提示符運行命令
- wsl --install -d Ubuntu
然后在出現提示時重新啟動。
已有WSL安裝
對于已經安了WSL的用戶,并且想要更新到包含WSLG的最新版本的WSL,可以運行命令
- wsl –update
注意,WSLG僅與WSL 2兼容,并且不適用WSL 1模式下的發行版。可以從通過命令提示符查詢當前使用發行版和WSL版本。
- wsl --list -v
如果為WSL 1模式,需要切換到WSL 2:
- wsl --set-version _distro_name_ 2
通過管理員模式命令提示符運行此命令來重新啟動WSL,確保首先保存所有掛起的工作:
- wsl -shutdown
更新WSL + WSLG
要更新到為預覽發布的最新版本的WSL和WSLG,只需從管理員模式命令提示符或powershell運行
- wsl --update
需要重新啟 WSL才能使更改生效,需要重啟WSL
- wsl -shutdown
運行桌面應用
如果已經安裝了Ubuntu按照這些說明進行 Linux 發行版,會找到一個Ubuntu開始菜單中的圖標,啟動它。這將啟動WSL 2 VM在該VM中啟動 Ubuntu WSL發行版,并為提供一個與之交互的終端。
對于 Linux 發行版,可以使用 wsl --list --online命令從提升的命令提示符選擇的可用的發行版。
安裝和運行 GUI 應用程序
可以通過Linux終端運行以下命令來下載和安裝一些流行的應用程序(Ubuntu為例)。
更新可用包列表
- ## Update list of available packages
- sudo apt update
- ## Gedit
- sudo apt install gedit -y
- ## GIMP
- sudo apt install gimp -y
- ## Nautilus
- sudo apt install nautilus -y
- ## VLC
- sudo apt install vlc -y
- ## X11 apps
- sudo apt install x11-apps -y
- ## Google Chrome
- cd /tmp
- sudo wget google/linux/direct/google-chrome-stable_current_amd64.deb
- sudo dpkg -i google-chrome-stable_current_amd64.deb
- sudo apt install --fix-broken -y
- sudo dpkg -i google-chrome-stable_current_amd64.deb
- ## Microsoft Teams
- cd /tmp
- sudo curl -L -o "./teams.deb" " teams.microsoft.com/downloads/desktopurl?env=production&plat=linux&arch=x64&download=true&linuxArchiveType=deb"
- sudo apt install ./teams.deb -y
- ## Microsoft Edge Browser
- sudo curl packages.microsoft.com/repos/edge/pool/main/m/microsoft-edge-dev/microsoft-edge-dev_93.0.946.1-1_amd64.deb -o /tmp/edge.deb
- sudo apt install /tmp/edge.deb –y
安裝這些應用程序后,就可以在開始菜單中的發行版名稱下找到它們。例如 Ubuntu -> Microsoft Edge。
終端中啟動
也可以使用命令從終端窗口啟動這些:
- xcalc, xclock, xeyes
- gimp
- gedit ~/.bashrc
- nautilus
- vlc
- google-chrome
- teams
- microsoft-edge
總結
WSLG作為對微軟子系統的圖形增強工具,可以實現高效搞交互的Linux桌面應用使用,對不熟悉Linux Shell用戶提供友好的橄欖枝,讓其可以以更加熟悉的方式進行Linux使用和學習。該項目開源不到半年,其Github倉庫(github/microsoft/wslg)就已經收獲5.8k的星星,其受歡迎程度可見一斑,希望大家嘗試,也可以對其提交PR參與貢獻。