ProxmoxでGPUを使えるようにする

今回は備忘録も兼ねて久しぶりに技術ブログっぽい投稿を書くことにする。
まず大前提としてProxmoxのバージョンは8以上である必要がある。
NOTE: これから紹介する方法は1つの仮想マシンに対して1つのGPUを割り当てる方法である。 複数台のVMでリソースを共有することはできないのであしからず。
1. Adding GPU to VFIO
次にGPUのHEX値(1002:1638,1002:1637)を控えておく:
lspci -nn | grep -Ei "vga|audio"
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation [1002:1638]
01:00.1 Audio device [0403]: NVIDIA Corporation [1002:1637]
echo "options vfio-pci ids=1002:1638,1002:1637 disable_vga=1" > /etc/modprobe.d/vfio.conf
grub側にもvfio-pciバインドの設定も加えるとよい:
GRUB_CMDLINE_LINUX_DEFAULT=""
2. Enable GRUB
NOTE: BIOS画面でIOMMUを有効化する必要がある。
次に/etc/default/grubを次のように編集する:
# Intel
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt vfio-pci.ids=1002:1638,1002:1637"
# AMD
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt vfio-pci.ids=1002:1638,1002:1637"
3. Edit module files
次に/etc/modulesに以下の行を追加する:
echo "vfio" >> /etc/modules
echo "vfio_iommu_type1" >> /etc/modules
echo "vfio_pci" >> /etc/modules
echo "vfio_virqfd" >> /etc/modules
4. IOMMU remapping
それからmodprobe.dに以下のファイルを作成していく:
echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf
echo "options kvm ignore_msrs=1" > /etc/modprobe.d/kvm.conf
5. Blacklist the GPU drivers
さらにmodprobe.dにブラックリストファイルを作成する:
echo "blacklist radeon" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
echo "options nouveau modeset=0" >> /etc/modprobe.d/blacklist.conf
6. Command to update everything
最後に次のコマンドを実行してからリブートする:
update-initramfs -u
update-grub
reboot
再起動後に次のコマンドが表示されていれば次のステップに移る:
# Intel
dmesg | grep -i "IOMMU enable"
# AMD
dmesg | grep -Ei "AMD-Vi|IOMMU"
あとはVMを作成したあとにPCI DeviceからGPUを指定できるようになっていれば成功だ。