註解:本文為Linux Host對Linux Guest,Linux Host對Windows Guest的請看 此篇
Looking Glass這款程式可以搭配Windows虛擬機低延遲的玩遊戲,其畫面傳輸效率要比QXL高很多,那Linux虛擬機可不可以也用這款來提供給實體機存取畫面呢?答案是可以。
這樣的話,就能在Linux系統的Linux虛擬機玩3D遊戲了。
儘管支援Linux虛擬機不是Looking Glass開發者的優先選項,開發者還是做了一個基本能在Linux虛擬機跑Looking Glass Host的程式,透過核心模組的方式,讓虛擬機與實體機存取共享記憶體(IVSHMEM)。
實際操作影片,在虛擬機玩《SuperTuxKart》,中等畫質下大多數時候都有60FPS。
如果單純只是要跑CUDA,在虛擬機直通GPU後指令就認得到Nvidia顯示卡了,為何還要使用Looking Glass?老實說我也沒什麼太好的理由。我可以想到的好處,大概就是將GPU直通給Ubuntu虛擬機的話,裡面再跑個 Waydroid,用Looking Glass存取,遊戲效能總比 virglrednerer要好,可跟Scrcpy一較高下。這樣還能繞過Waydroid不支援Nvidia的問題,畢竟他是跑在虛擬機裡面嘛(不過這樣就得改直通Intel/AMD顯示卡了,Nvidia跟Waydroid有仇)。直接裝Android-x86虛擬機不可行是因為Looking Glass需要looking-glass-host執行在系統來輸出畫面。
1. 環境#
- Host OS:Arch Linux 6.4.7
- Libvirt版本:9.5.0
- QEMU版本:8.0.4
- GPU1:Intel HD630
- GPU2:Nvidia GTX1050Ti (要直通的)
- Guest OS:Ubuntu 22.04 LTS
Looking Glass的Client和Host皆需採用最新版編譯,否則會拒絕連線。
2.前置作業#
參考 Linux Geust GPU直通,建立Ubuntu虛擬機,並將Nvidia顯示卡直通給虛擬機。
本電腦有二個GPU,各接一個螢幕(先不要拿HDMI欺騙器出來),在獨顯直通之後使用內顯顯示畫面。
1. Linux實體機(Arch)要做的事情#
- 編譯最新版Looking Glass Client。Arch Linux可從AUR自動編譯安裝
yay -S looking-glass-client
- 以DKMS裝載Looking Glass的kvmfb核心模組
sudo pacman -S dkms
git clone https://github.com/gnif/LookingGlass.git
cd LookingGlass/module
sudo dkms install "."
- 設定kvmfr的存取權限
su
echo 'SUBSYSTEM=="kvmfr", OWNER="user", GROUP="kvm", MODE="0660"' >> /etc/udev/rules.d/99-kvmfr.rules
- 設定開機自動載入kvmfr核心模組
su
echo "kvmfr static_size_mb=32" >> /etc/modprobe.d/kvmfr.conf
- 重開機。
2. Linux虛擬機(Ubuntu)要做的事情#
- 安裝編譯所需套件
sudo apt-get install binutils-dev cmake fonts-dejavu-core libfontconfig-dev \
gcc g++ pkg-config libegl-dev libgl-dev libgles-dev libspice-protocol-dev \
nettle-dev libx11-dev libxcursor-dev libxi-dev libxinerama-dev \
libxpresent-dev libxss-dev libxkbcommon-dev libwayland-dev wayland-protocols \
libpipewire-0.3-dev libpulse-dev libsamplerate0-dev libxcb-xfixes0-dev
- 編譯Looking Glass Host。編譯後的執行檔位於
host/build/looking-glass-host
cd ~
git clone https://github.com/gnif/LookingGlass.git
cd LookingGlass
mkdir host/build
cd host/build
cmake ..
make
- 裝載kvmfr核心模組
sudo apt install dkms
cd LookingGlass/module
sudo dkms install "."
- 設定kvmfr權限,設定虛擬機開機自動載入kvmfr
su
echo 'SUBSYSTEM=="kvmfr", OWNER="user", GROUP="kvm", MODE="0660"' >> /etc/udev/rules.d/99-kvmfr.rules
echo "kvmfr static_size_mb=32" >> /etc/modprobe.d/kvmfr.conf
將虛擬機關機,編輯XML,將
<domain type="kvm">
修改為<domain xmlns:qemu="http://libvirt.org/schemas/domain/qemu/1.0" type="kvm">
在
</domain>
上方加入QEMU的指令
<qemu:commandline>
<qemu:arg value='-device'/>
<qemu:arg value='{"driver":"ivshmem-plain","id":"shmem0","memdev":"looking-glass"}'/>
<qemu:arg value='-object'/>
<qemu:arg value='{"qom-type":"memory-backend-file","id":"looking-glass","mem-path":"/dev/kvmfr0","size":33554432,"share":true}'/>
</qemu:commandline>
- 編輯Libvirt的QEMU設定檔
/etc/libvirt/qemu.conf
,取消註解cgroup_device_acl
,將kvmfr加入至cgroups:
cgroup_device_acl = [
"/dev/null", "/dev/full", "/dev/zero",
"/dev/random", "/dev/urandom",
"/dev/ptmx", "/dev/kvm",
"/dev/kvmfr0"
]
- 重新啟動Libvirt服務
sudo systemctl restart libvirtd
3. 以Looking Glass連線到虛擬機#
此時電腦插著的是二個實體螢幕。
- 虛擬機開機,滑鼠切換到Nvidia顯示卡所接的螢幕,啟動Looking Glass Host程式。
cd ~/LookingGlass/host/build
./looking-glass-host -f /dev/kvmfr0
在啟動此程式之後,電腦第二個螢幕便可拔掉,更換為HDMI欺騙器了。
回到實體機,啟動Looking Glass Client
looking-glass-client -f /dev/kvmfr0 -k
- 即會看到虛擬機Nvidia顯示卡輸出的畫面,這個畫面所執行的應用程式都能吃到Nvidia的GPU加速。
若嫌滑鼠反應慢,準備二支滑鼠。開啟Virt Manager編輯硬體,將USB滑鼠直通進去。