GPUパススルーがしたかった

Arch Wikiの内容そのまま

$ sudo pacman -S qemu virt-manager

IOMMUの設定

/etc/default/grubを開いて、GRUB_CMDLINE_LINUX_DEFAULTの行にintel_iommu=on iommu=ptを書き加える。

以下のコマンドでgrub.cfgを生成

$ sudo grub-mkconfig -o /boot/grub/grub.cfg

再起動してから、以下のコマンドでIOMMUが有効か確認

$ sudo dmesg | grep -e DMAR -e IOMMU

この作業中、関連は不明なものの、Intel Wireless-AC 9560が認識されないことがあった。

GPUの分離

分離するGPUはホスト側で使えなくなるので、予めIntel HD Graphicsなどに切り替えておくこと。

PCIデバイスのIDを取得するため、以下のコマンドを実行。(IDは型番ごとについているらしい)

$ lspci -nnk | grep NVIDIA
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP102 [GeForce GTX 1080 Ti] [10de:1b06] (rev a1)
        Subsystem: NVIDIA Corporation GP102 [GeForce GTX 1080 Ti] [10de:1b06]
01:00.1 Audio device [0403]: NVIDIA Corporation GP102 HDMI Audio Controller [10de:10ef] (rev a1)
        Subsystem: NVIDIA Corporation GP102 HDMI Audio Controller [10de:1b06]

この場合は、10de:1b06と10de:10efがGPU関連のID。 このIDを指定して、普通のドライバの代わりにVFIOドライバにそのデバイスを読み込ませる(らしい)。

/etc/modprobe.d/vfio.confにこんな感じでIDを記述する。

options vfio-pci ids=10de:1b06,10de:10ef

/etc/mkinitcpio.confMODULESの行にVFIO関連のモジュールを加える。 HOOKSの行にmodconfが含まれていることを確認。

MODULES=(... vfio_pci vfio vfio_iommu_type1 vfio_virqfd ...)

いろいろ書き加え終わったら、initramfsを再生成する。

$ sudo mkinitcpio -p linux56

再起動して設定を確認。

$ sudo dmesg | grep -i vfio

virt-managerで設定して起動する

libvirtのサービスを開始して、QEMU/KVMに接続。 Windowsを入れたり、Fedoraが配ってるドライバを入れたりする。

GPUはオーディオのほうもVMに追加しないといけないのと、2つのデバイスはbusslotを一致させてfunctionを一つ違いにしておくといいらしい。

ここまではうまく行ったけど、NVIDIAのドライバがError 43を吐き続ける。 KVMの偽装設定BIOS ROMのパッチは試したものの、どちらもうまくいかなかった。

今回は面倒だしやらなかったけど、ドライバにパッチするプロジェクトがあったので、次は試してみるつもり。

参考リンク