Proxmox VEでGPUパススルーしてみました
動機
メインPCのGPUをいっぱい使っているときに、メインPCのリソースを使わずに横にVRChatを出しておきたいと思った
ハードウェア
DELL XPS8930 (Proxmox Virtual Environment 9.0.10)
| CPU | Intel Core i7 8700 |
| RAM | DDR4 32GB |
| GPU | NVIDIA GeForce GTX1050Ti 4GB |
| SSD | NVMe 512GB |
| HDD | SATA 1TB x2 |
やったこと
GRUB設定ファイルの編集
/etc/default/grub の編集
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
変更し、GRUBを更新して再起動
root@orchard:~# update-grub
root@orchard:~# reboot
IOMMUグループの確認
0000:01:00.0(VGAデバイス)と0000:01:00.1(Audioデバイス)を含むグループみたい
root@orchard:~# find /sys/kernel/iommu_groups/ -type l
/sys/kernel/iommu_groups/17/devices/0000:04:00.0
/sys/kernel/iommu_groups/7/devices/0000:00:17.0
/sys/kernel/iommu_groups/15/devices/0000:02:00.0
/sys/kernel/iommu_groups/5/devices/0000:00:15.1
/sys/kernel/iommu_groups/5/devices/0000:00:15.0
/sys/kernel/iommu_groups/23/devices/idma64.2
/sys/kernel/iommu_groups/13/devices/0000:00:1e.0
/sys/kernel/iommu_groups/3/devices/0000:00:08.0
/sys/kernel/iommu_groups/21/devices/idma64.1
/sys/kernel/iommu_groups/11/devices/0000:00:1c.4
/sys/kernel/iommu_groups/1/devices/0000:00:00.0
/sys/kernel/iommu_groups/18/devices/0000:70:00.0
/sys/kernel/iommu_groups/8/devices/0000:00:1c.0
/sys/kernel/iommu_groups/16/devices/0000:03:00.0
/sys/kernel/iommu_groups/6/devices/0000:00:16.0
/sys/kernel/iommu_groups/24/devices/dw-apb-uart.2
/sys/kernel/iommu_groups/14/devices/0000:00:1f.2
/sys/kernel/iommu_groups/14/devices/0000:00:1f.0
/sys/kernel/iommu_groups/14/devices/0000:00:1f.3
/sys/kernel/iommu_groups/14/devices/0000:00:1f.4
/sys/kernel/iommu_groups/4/devices/0000:00:14.0
/sys/kernel/iommu_groups/22/devices/i2c_designware.1
/sys/kernel/iommu_groups/12/devices/0000:00:1d.0
/sys/kernel/iommu_groups/2/devices/0000:00:01.0
/sys/kernel/iommu_groups/2/devices/0000:01:00.0
/sys/kernel/iommu_groups/2/devices/0000:01:00.1
/sys/kernel/iommu_groups/20/devices/i2c_designware.0
/sys/kernel/iommu_groups/10/devices/0000:00:1c.3
/sys/kernel/iommu_groups/0/devices/0000:00:02.0
/sys/kernel/iommu_groups/19/devices/idma64.0
/sys/kernel/iommu_groups/9/devices/0000:00:1c.2
GPUドライバのブラックリスト化
Proxmoxがデバイスを使わないように、ブラックリスト化する
デバイスIDの特定
GPUのデバイスIDを特定する
root@orchard:~# lspci -n -s 01:00.0
01:00.0 0300: 10de:1c82 (rev a1)
root@orchard:~# lspci -n -s 01:00.1
01:00.1 0403: 10de:0fb9 (rev a1)
VGAデバイス:10de:1c82
Audioデバイス:10de:0fb9
/etc/modprobe.d/blacklist.conf の編集
blacklist nouveau
blacklist nvidiafb
blacklist nvidia
/etc/modprobe.d/vfio.conf の編集
options vfio-pci ids=10de:1c82,10de:0fb9 disable_vga=1 disable_reset=1
設定を更新し、再起動
root@orchard:~# update-initramfs -u
root@orchard:~# reboot
仮想マシンへのGPU追加
対象のVMに追加する

Raw Device: 0000:01:00.0
All Functions: true
PCI-Express: true
Rom-Bar: true
ROM-File: (後述、この段階では設定していない)

標準のディスプレイデバイスはnoneにしておく
VMの起動(失敗)
起動したが、GPUから映像が出てこない
デバイスマネージャーを見るとエラー43になっている

qm startでコンソールからVMを起動すると、以下のエラーが出る
root@orchard:~# qm start 100
error writing '1' to '/sys/bus/pci/devices/0000:01:00.0/reset': Inappropriate ioctl for device
failed to reset PCI device '0000:01:00.0', but trying to continue as not all devices need a reset
swtpm_setup: Not overwriting existing state file.
VM設定ファイルの変更
一度VMを落とし、設定ファイルを変更
/etc/pve/qemu-server/100.conf
末尾に追加
args: -cpu host,+kvm_pv_unhalt,+kvm_pv_eoi,hv_vapic,hv_time,kvm=off
これでも映像は出力されず・・・
NVIDIA vBIOS VFIO Patcherの適用
libvirt 使用時に PCI パススルーを可能にする NVIDIA vBIOS のパッチ適用済み/スプライス済みコピーを作成するスクリプトらしい(Google翻訳
GPU-ZでVBIOSをダンプする
パススルーしたVMでGPU-Zを実行
このボタンを押すとダンプできる

パッチを当てる
python nvidia_vbios_vfio_patcher.py -i GP107.rom -o GP107_patched.rom

パッチを当てたVBIOSをProxmoxホストの/usr/share/kvm/にコピーする

VM設定ファイル(/etc/pve/qemu-server/100.conf)でVBIOSを指定する
romfile= で指定します x-vga=1を追加するとPCIデバイスをVGAカードとして認識させる?ようなので入れた
hostpci0: 0000:01:00,pcie=1,rombar=1,x-vga=1,romfile=GP107_patched.rom
VMの起動(成功)
仮想マシンの画面がGPUから出力されました!

グラフィックドライバをインストールして、完成!

VRChatも動作しました

おまけ:Sunshine + Moonlight + VBAN
メインPCにつながっているものとは別にモニター置きたくない(というか置けない)ので、Sunshine + Moonlightで操作、VBANでマイクを入力してみました

ハマったポイント

VMのNICがVirtIOだとMoonlightで映像を受信できなかった、Intel E1000にしたらできた



コメント