快轉到主要內容

QEMU/KVM虛擬機Nvidia雙GPU直通,Linux Host對Linux Guest

Linux系統 虛擬機與容器技術 GPU Passthrough QEMU Nvidia Linux
🗓️ 民國112年 癸卯年
✍ 切換正體/簡體字
目錄

將Linux實體機的GPU直通給Linux虛擬機(VM),使其可以使用GPU硬體加速、跑機器學習計算等工作。

為什麼要這麼幹?我使用Arch Linux,有時候Nvidia驅動+CUDA版本跟特定Pytorch程式對不上,AUR也無法解決的情況下,就是找個官方推薦的環境跑CUDA囉,例如Ubuntu LTS版。

其實虛擬機要GPU硬體加速也可以用Virtio顯示卡搭配Virglrenderer。不過該技術僅適用Intel/AMD GPU,且Ubuntu的Virglrenderer效能不若 Android-x86那樣好,所以我還是用GPU直通。

Linux實體機將Nvidia GTX1050Ti直通給虛擬機後,即改用Intel CPU的內顯輸出螢幕訊號,而虛擬機不外接實體螢幕也能調用GPU執行應用程式。

1. 環境
#

  • Host OS:Arch Linux 6.4.7
  • GPU1 Intel HD630
  • GPU2 Nvidia GTX1050Ti (要直通的)
  • Guest OS:Ubuntu 22.04 LTS

虛擬機軟體為Libvirt 9.5.0 + QEMU/KVM 8.0.4

結構如圖,本電腦有二個GPU,才能在獨顯直通之後使用內顯顯示畫面。

2. 直通GPU
#

參考 Arch Linux如何將GPU直通給Windows QEMU/KVM虛擬機

那篇雖是給Windows的,但是大方向一樣:建立一個Ubuntu虛擬機。禁止實體機開機載入Nvidia核心模組,將其綁給vfio-pci,並將PCI裝置掛載至Ubuntu虛擬機。

  1. 安裝 QEMU/KVM與Virt Manager

  2. 下載Ubuntu 22.04 ISO。開啟Virt Manager,新增Ubuntu虛擬機,自訂硬體配置,機器選Q35,韌體選擇UEFI (OVMF_CODE_secboot)。安裝系統完成後關機。

  3. 在GRUB啟用IOMMU

sudo vim /etc/default/grub

# 修改這行:GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on iommu=pt"

sudo grub-mkconfig -o /boot/grub/grub.cfg
  1. 重開機,用lscpci --nnk查找Nvidia顯示卡硬體ID。再編輯GRUB,將Nvidia顯示卡綁給vfio-pci
GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on iommu=pt video=efifb:off vfio-pci.ids=10de:1c82,10de:0fb9"
  1. 編輯/etc/mkinitcpio.conf,設定開機載入vfio核心模組
MODULES=(vfio_pci vfio vfio_iommu_type1)
  1. 編輯/etc/modprobe.d/blacklist.conf,設定開機禁止載入Nvidia核心模組
blacklist nvidia
blacklist nouveau
  1. 重新生成initramfs與GRUB
sudo rm /etc/X11/xorg.conf
sudo mkinitcpio -p linux
sudo grub-mkconfig -o /boot/grub/grub.cfg
  1. 重開機進入BIOS,設定電腦優先以內顯開機。

  2. 開啟Virt Manager,編輯Ubuntu虛擬機硬體,點選加入PCI裝置,選取Nvidia顯示卡和音訊。

3. 虛擬機安裝Nvidia驅動與CUDA
#

參考 Ubuntu 22.04安裝Nvidia驅動

據說Nvidia舊版本驅動會偵測是否為虛擬機,所以得隱藏KVM狀態,但現在看來不需要了。

nvidia-smi測試輸出驅動版本為530

nvcc -v輸出版本為CUDA 11.8。

Blender確認能夠使用CUDA渲染

4. 使用Nvidia PRIME切換GPU
#

即使虛擬機可以使用CUDA了,因目前主螢幕是用QXL,執行3D應用程式還是可能只用軟體解碼渲染,導致性能低下

prime-select指令行不通,因為沒有內顯。這時可以用PRIME環境變數使用Nvidia GPU執行應用程式。

 __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia __VK_LAYER_NV_optimus=NVIDIA_only VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/nvidia_icd.json firefox-esr

詭異的是Snap版Firefox可以跑滿60FPS,但隨即桌面環境整個崩潰。而Firefox ESR雖不會崩潰,但是FPS無法跑滿。 🤷 這就是為什麼我不用Snap的原因(小聲)

5. 低延遲存取Ubuntu桌面
#

跟Windows不同,Ubuntu似乎不會把QXL當一個有效螢幕,無法雙螢幕。如果要完全用Nvidia顯示卡輸出畫面,就得將QXL移除,接真正的第二個螢幕。這樣應用程式才會完全用Nvidia顯示卡渲染畫面。

如果只有一個螢幕,又想要低延遲存取Nvidia渲染的畫面,請參閱 Looking Glass Host for Linux教學

相關文章

如何在Windows虛擬機玩遊戲 ~ Linux QEMU/KVM雙GPU直通 + Looking Glass安裝過程
Linux系統 虛擬機與容器技術 GPU Passthrough QEMU Linux Windows
QEMU/KVM虛擬機繞過遊戲Easy Anti-Cheat的方法,隱藏KVM狀態
Linux系統 虛擬機與容器技術 QEMU Linux Windows
Arch Linux如何將Nvidia GPU直通給Windows QEMU/KVM虛擬機
Linux系統 虛擬機與容器技術 GPU Passthrough Arch Linux QEMU

留言板

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

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

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