Arch Linux での方法が OVMF による PCI パススルー にあるので、これを参考に Ubuntu 16.04.7 LTS でも実施した。
編集したファイル
/etc/modprobe.d/vfio.conf
install vfio-pci /usr/bin/vfio-pci-override.sh
blacklist nouveau
blacklist snd_hda_intel
下2行は不要なドライバーを抑止するためなので、不要かも。
/usr/bin/vfio-pci-override.sh
#!/bin/sh
for i in /sys/bus/pci/devices/*/boot_vga; do
if [ $(cat "$i") -eq 0 ]; then
GPU="${i%/boot_vga}"
AUDIO="$(echo "$GPU" | sed -e "s/0$/1/")"
echo "vfio-pci" > "$GPU/driver_override"
if [ -d "$AUDIO" ]; then
echo "vfio-pci" > "$AUDIO/driver_override"
fi
fi
done
# equivalent for "options vfio-pci ids=8086:8d20" in /etc/modprobe.d/vfio.conf
for i in /sys/bus/pci/devices/*; do
if [ $(cat "$i/vendor") = "0x8086" ]; then
if [ $(cat "$i/device") = "0x8d20" ]; then
echo "vfio-pci" > "$i/driver_override"
fi
fi
done
modprobe -i vfio-pci
前半は前記ページの通りで、後半は GPU とは別にパススルーするマイク&ヘッドホン端子向けの設定。
modprobe の設定におけるoptions
との共用に確信がなかっただけなので、もっとスムーズなやり方があるかもしれない。
ただ、このファイルを /usr/bin
に置くのはなんか違う気がする。
/etc/initramfs-tools/modules
vfio_pci
vfio
vfio_iommu_type1
vfio_virqfd
前記ページの通り。
/usr/share/initramfs-tools/hooks/vfio-pci-override
#!/bin/sh
PREREQ=""
prereqs()
{
echo "$PREREQ"
}
case $1 in
# get pre-requisites
prereqs)
prereqs
exit 0
;;
esac
. /usr/share/initramfs-tools/hook-functions
copy_exec /usr/bin/vfio-pci-override.sh
作成したファイルを initramfs の中から利用するための設定。テンプレート通り。
その後の手順
-
update-initramfs -u
で/boot/initrd.img-xxx
(xxx はカーネルのバージョンなど)を更新する。 -
lsinitramfs
で、必要なファイルが追加されていることを確認する。 - シャットダウンし、ディスプレイの端子を接続して起動する。
- 一方の GPU が boot_vga になり、そちらに Ubuntu のログイン画面が表示されるので、ログインする。
-
dmesg | grep -i vfio
やlspci -nnk
で他方がパススルーされていることを確認し、ゲストにパススルーしたデバイスを追加する(前記ページの通り)。