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是在init之后啟動的第一個進程。 WSLGd啟動Weston (使用 XWayland)、 PulseAudio 并通過mstsc.exe主機上以靜默模式建立RDP連接。 RDP連接將保持活動狀態并準備好顯示正在啟動的新GUI應用程序,沒有任何連接建立延遲。 WSLGd以守護進程凡事監聽這些進程,避免他們由于錯誤退出。
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擁有的像素。
Weston 利用FreeRDP來實現其后端RDP服務器。FreeRDP用于根據RDP協議規范直線RDP 服務器到RDP客戶端(Windows 上的 mstsc)的所有通信進行編碼。 它還用于解碼從RDP客戶端到RDP服務器的所有流量。
對于音頻輸入(麥克風)和輸出(揚聲器/耳機),WSLG 運行 Pulse音頻服務器。WSLG 使用兩個RDP插件的用于接收音頻輸出和音頻輸入,插件有效地在 Pulse Server和Weston RDP服務器之間傳輸音頻樣本。音頻流由Weston RDP服務器合并到RDP傳輸上,從而有效地在所有場景(桌面/RAIL/VAIL 風格遠程處理)中啟用Weston RDP后端中的音頻輸入/輸出。
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的用戶,并且想要更新到包含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,只需從管理員模式命令提示符或powershell運行
wsl --update
需要重新啟 WSL才能使更改生效,需要重啟WSL
wsl -shutdown
如果已經安裝了Ubuntu按照這些說明進行 Linux 發行版,會找到一個Ubuntu開始菜單中的圖標,啟動它。這將啟動WSL 2 VM在該VM中啟動 Ubuntu WSL發行版,并為提供一個與之交互的終端。
對于 Linux 發行版,可以使用 wsl --list --online命令從提升的命令提示符選擇的可用的發行版。
可以通過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參與貢獻。
有些小伙伴會有系統重啟還原的需求,常見的軟件有冰點還原精靈、影子系統、還原精靈等等,實際上在 Win10 和 Win11 系統就支持了這個類似的功能「UWF」統一寫入篩選器。
據微軟官方介紹,統一寫入篩選器它通過攔截驅動器的所有寫入(應用安裝、設置更改、保存的數據)并將其重定向到虛擬覆蓋層來幫助保護驅動器。虛擬覆蓋層是在重新啟動期間或來賓用戶注銷時清除的臨時位置。
簡單理解:攔截對硬盤的一切寫入操作,把保護的數據轉移到內存上,在保護數據安全同時,也可以大幅度提高軟件的啟動運行速度。相關數據在系統重啟后被刪除,不會對系統造成任何不利影響。
UWF使用
1.需要 Win10 和 Win11 的企業版和教育版,或者 Server 服務器版。其它版本不支持這個功能,但網上有移植版,不清楚會不會不穩定。
2.你的電腦建議 8G 內存以上,能用 Win10 / 11 的電腦基本都有 8G 吧。
3.安裝 UWF 功能,快捷鍵 Win+ X 搜索 “啟用或關閉 Windows 功能”,找到統一寫入篩選器,勾選。
4.由于沒有提供圖形界面,需要運行 PowerShell(管理員)命令,輸入命令來配置 UWF 功能。
# 啟動 UWF
$ uwfmgr filter enable
# 可以看到 UWF 本次會話的狀態及下次會話的狀態
$ uwfmgr Get-Config
# 改用硬盤當作暫存區(默認是 RAM)
$ uwfmgr overlay Set-Type DISK
# 設定暫存區大小為 10240MB
$ uwfmgr overlay set-size 10240
# 設定告警閾值為 5024MB
$ uwfmgr overlay set-warningthreshold 5024
# 設定嚴重閾值為 8192MB
$ uwfmgr overlay set-criticalthreshold 8192
# 設定保護磁盤為 C 盤,可以添加其它盤
$ uwfmgr volume protect C:
# 設定可以接收 Windows 更新
$ uwfmgr servicing Update-Windows
命令操作起來還是比較麻煩,所以有大佬 @lmwuxia 制作了 UWF 圖形界面的設置軟件,你可以方便設置需要保護的磁盤,以及設置需要過濾的目錄(例如可以設置桌面文件、文檔等)、緩存設置大小、覆蓋類型模式等。
使用UWF優點
1.可以保護好系統盤不被中毒、預防不小心安裝流氓全家桶等。
2.適合一些需要系統還原點的場景
3.可以避免系統 Temp 產生的垃圾文件。
4.通過內存 RAM 模式可以大幅度提高軟件的運行啟動速度
5.減低固態硬盤的讀寫數據,提高固態硬盤壽命。
總結
如果你希望系統盤一直保持 "純凈" 的狀態,那么你可以在重新安裝好系統,并且安裝好比日常所需的軟件后,開啟 UWF 功能。這樣你的系統每次重啟都會恢復到還原點。
對于大內存用戶,劃分更多內存給 UWF 體驗會更好,不過 UWF 對內存的占用是實時調配的,寫入的數據被刪除時就即刻釋放內存。當然如果你電腦內存實在太小,那么也可以選擇硬盤模式,但是性能會比較差。
總的來說 UWF 是非常不錯的系統還原功能,不過可惜只有企業版和教育版才能支持。