Linux可以用QEMU/KVM安裝Windows虛擬機,並將Nvidia GPU直通給Windows虛擬機改善圖形效能。在那之後我們尚要處理一個問題,那就是如何存取Windows系統的畫面?
Virt Manager預設會插入一個虛擬顯示卡(通常是QXL),然後再透過SPICE協定通訊,我們在Virt Manager視窗所看到的畫面便是虛擬顯示卡的畫面。而直通進去的Nvidia顯示卡要輸出畫面,得再接一個實體螢幕才可以看到Nvidia輸出的畫面,此時就會產生二個螢幕。
但是這裡有二個問題:Windows應用程式即使在電源設定指定使用Nvidia算繪,QXL的畫面依然有效能低落和畫面不同步的問題。還有我不喜歡放兩個螢幕,我希望可以在單個螢幕存取Linux和Windows的畫面。
這個時候「Looking Glass」就是款有用的工具。
Looking Glass使用KVM Framebuffer技術,讓使用者能夠從Linux宿主機開一個視窗,直接存取Windows系統的畫面,畫面都是透過DXGI或Nvidia Capture傳送到Linux算繪的,所以延遲極低,玩遊戲是有可能的。
唯一要考量的是Looking Glass需要額外花費資源在宿主機解碼畫面,可能會對宿主機帶來額外負擔,導致畫面傳輸效率比不上實體螢幕。
至於如何解決實體二個螢幕的問題,我們可以利用 Virtual Display Driver或HDMI欺騙器,於Windows系統虛擬出第二個螢幕,如此一來就不需要實體螢幕佔空間了,然後告訴Looking Glass擷取該螢幕內容傳送到Linux即可。
環境#
- 虛擬機軟體:Virt Manager + QEMU/KVM
- Host OS:Ubuntu LTS
- Guest OS:Windows 11
說明:
Looking Glass僅支援Windows 10以上系統。
如果你有安裝QXL顯示卡的驅動,請解除安裝,否則Looking Glass會抓不到其他螢幕。通常只要到Windows裝置管理員 → 顯示卡,解除安裝RedHat QXL WDDM DOD顯示卡驅動就可以了。
有些顯示卡可能會不認得Virtual Display Driver所虛擬的螢幕,導致顯示卡無法發揮全速,此時還是得用HDMI欺騙器插在顯示卡上才可以。
1. 安裝Windows 11虛擬機#
再 安裝Windows 11虛擬機。虛擬機顯示卡用Virtio。
然後 設定Nvidia GPU直通。
2. 於Linux安裝Looking Glass Client#
這個是負責在Linux顯示Windows畫面的客戶端。
參考 官方指示
從套件庫安裝Looking Glass Client
sudo apt install looking-glass-client
Linux的Looking Glass客戶端設定檔位於~/.looking-glass-client.ini
3. 新增IVSHMEM裝置到虛擬機#
IVSHMEM(Inter-VM Shared Memory device)是讓宿主機與虛擬機共享記憶體的檔案。
開啟Virt Manager,編輯Windows 11的XML。
在
<devices>
區塊的加入IVSHMEM裝置。下面32M是以螢幕解析度為1920x1080下去算的。計算公式為:(螢幕寬 x 螢幕高 x 4 x 2) ÷ 1024 ÷ 1024 + 10
,四捨五入取最接近的2的平方數。
<devices>
...
<shmem name='looking-glass'>
<model type='ivshmem-plain'/>
<size unit='M'>32</size>
</shmem>
...
</devices>
- 新增設定檔,使Linux系統開機自動建立
/dev/shm/looking-glass
的暫存檔
sudo vim /etc/tmpfiles.d/10-looking-glass.conf
- 填入以下內容。
user
是您的使用者名稱。
f /dev/shm/looking-glass 0660 user kvm -
- 用以下指令立即建立tmpfs
sudo systemd-tmpfiles --create /etc/tmpfiles.d/10-looking-glass.conf
4. 於Windows安裝Looking Glass Host#
將Windows虛擬機開機
到 Fedora網站,下載stable-virtio目錄下的
virtio-win-gt-x64.msi
,點選安裝Virt-IO驅動。在虛擬機內安裝 最新Microsoft Visual C++可轉散發,檔名為
VC_redist.x64.exe
到 官網下載Looking Glass Host壓縮檔。照Linux所安裝的Looking Glass Client,安裝對應版本的Looking Glass Host。例如Looking Glass Client版本為
B6
,這裡就要下載B6
版本。解壓縮,安裝Looking Glass Host
Looking Glass Host預設會在Windows開機後自動啟動,若無請到Windows的「服務」選單手動啟動Looking Glass。(建議一併用netplwiz設定開機自動登入Windows帳號)
Looking Glass Host的設定檔位於C:/Program Files/Looking Glass (host)/looking-glass-host.ini
5. 調整Looking Glass Host要擷取的螢幕#
Windows虛擬機同時有QXL和直通Nvidia,二個顯示卡的情況下,Looking Glass Host可能會抓錯螢幕。
Looking Glass Host雖然有dxgi:output
的參數,但似乎沒辦法設定預設要抓取哪個螢幕,所以只能在Windows系統手動指定。
開啟Windows系統設定 → 顯示,現在應該會看到二個螢幕
點選第二個螢幕 → 進階顯示設定,確認這是Virtual Display Driver生成的螢幕
在Linux啟動Looking Glass Guest
再將Windows螢幕改為「只在2顯示」或者「將2作為主要顯示器」。
6. 在Linux啟動Looking Glass Guest#
輸入指令啟動,加上-F
顯示全螢幕,-k
顯示FPS,egl:vsync
防止畫面撕裂。其餘參數參考
官方文件
looking-glass-client -F -k egl:vsync
如果Windows虛擬機有連線那麼應該就會看到桌面,此時Virt Manager的畫面會黑掉。
Looking Glass Guest預設是用SPICE來輸入鍵盤與滑鼠訊號給虛擬機的。若滑鼠位置跑來跑去,請準備第二組滑鼠,在Virt Manager新增硬體的界面直通進去。
按Scroll Lock + R旋轉螢幕。
跳出全螢幕請按Scroll Lock + F。