0
0

More than 3 years have passed since last update.

同一の GPU の一方を PCI パススルーする

Posted at

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 の中から利用するための設定。テンプレート通り。

その後の手順

  1. update-initramfs -u/boot/initrd.img-xxx (xxx はカーネルのバージョンなど)を更新する。
  2. lsinitramfs で、必要なファイルが追加されていることを確認する。
  3. シャットダウンし、ディスプレイの端子を接続して起動する。
  4. 一方の GPU が boot_vga になり、そちらに Ubuntu のログイン画面が表示されるので、ログインする。
  5. dmesg | grep -i vfiolspci -nnk で他方がパススルーされていることを確認し、ゲストにパススルーしたデバイスを追加する(前記ページの通り)。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0