ProxmoxVRChatWindowsパソコン

Proxmox VEでGPUパススルーしてみた

Proxmox VEでGPUパススルーしてみました

動機

メインPCのGPUをいっぱい使っているときに、メインPCのリソースを使わずに横にVRChatを出しておきたいと思った

ハードウェア

DELL XPS8930 (Proxmox Virtual Environment 9.0.10)

CPUIntel Core i7 8700
RAMDDR4 32GB
GPUNVIDIA GeForce GTX1050Ti 4GB
SSDNVMe 512GB
HDDSATA 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の適用

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にしたらできた

コメント

タイトルとURLをコピーしました