快轉到主要內容

Looking Glass Host for Linux,Linux實體機GPU直通給Linux虛擬機玩遊戲

分類   資訊科技 虛擬機與容器技術
標籤   QEMU-KVM GPU Passthrough
🗓️ 民國112年 癸卯年
✍ 切換正體/簡體字
目錄

註解:本文為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)要做的事情
#

  1. 編譯最新版Looking Glass Client。Arch Linux可從AUR自動編譯安裝
yay -S looking-glass-client
  1. 以DKMS裝載Looking Glass的kvmfb核心模組
sudo pacman -S dkms
git clone https://github.com/gnif/LookingGlass.git
cd LookingGlass/module
sudo dkms install "."
  1. 設定kvmfr的存取權限
su
echo 'SUBSYSTEM=="kvmfr", OWNER="user", GROUP="kvm", MODE="0660"' >> /etc/udev/rules.d/99-kvmfr.rules
  1. 設定開機自動載入kvmfr核心模組
su
echo "kvmfr static_size_mb=32" >> /etc/modprobe.d/kvmfr.conf
  1. 重開機。

2. Linux虛擬機(Ubuntu)要做的事情
#

  1. 安裝編譯所需套件
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
  1. 編譯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
  1. 裝載kvmfr核心模組
sudo apt install dkms
cd LookingGlass/module
sudo dkms install "."
  1. 設定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
  1. 將虛擬機關機,編輯XML,將<domain type="kvm">修改為<domain xmlns:qemu="http://libvirt.org/schemas/domain/qemu/1.0" type="kvm">

  2. </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>
  1. 編輯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"
]
  1. 重新啟動Libvirt服務
sudo systemctl restart libvirtd

3. 以Looking Glass連線到虛擬機
#

此時電腦插著的是二個實體螢幕。

  1. 虛擬機開機,滑鼠切換到Nvidia顯示卡所接的螢幕,啟動Looking Glass Host程式。
cd ~/LookingGlass/host/build
./looking-glass-host -f /dev/kvmfr0
  1. 在啟動此程式之後,電腦第二個螢幕便可拔掉,更換為HDMI欺騙器了。

  2. 回到實體機,啟動Looking Glass Client

looking-glass-client -f /dev/kvmfr0 -k
  1. 即會看到虛擬機Nvidia顯示卡輸出的畫面,這個畫面所執行的應用程式都能吃到Nvidia的GPU加速。

若嫌滑鼠反應慢,準備二支滑鼠。開啟Virt Manager編輯硬體,將USB滑鼠直通進去。

參考資料
#

相關文章

QEMU/KVM虛擬機Nvidia雙GPU直通,Linux Host對Linux Guest
分類   資訊科技 虛擬機與容器技術
標籤   GPU Passthrough PCI Passthrough QEMU-KVM Nvidia Linux
Arch Linux如何將Nvidia GPU直通給Windows QEMU/KVM虛擬機
分類   資訊科技 虛擬機與容器技術
標籤   GPU Passthrough Arch Linux QEMU-KVM
如何在Windows虛擬機玩遊戲 ~ Linux QEMU/KVM雙GPU直通 + Looking Glass安裝過程
分類   資訊科技 虛擬機與容器技術
標籤   GPU Passthrough QEMU-KVM Linux Windows

留言板

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Giscus留言板,需要Github帳號才能留言。支援markdown語法,若要上傳圖片請貼Imgur或Postimages。您的留言會在Github Discussions向所有人公開。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。若要上傳圖片請貼Imgur或Postimages。