まとめ

まとめ

まとめ

ゲーム用に Windows ゲストを実行できるように、KVM を搭載した Linux ホストで GPU パススルーを設定しようとしています。一部の IOMMU エントリ (すべてパススルーする GPU に属する) が vfio バスに割り当てられているのに、他のエントリが nvidia-gpu ドライバーに割り当てられているという問題が発生しています。

ハードウェア

CPU - スレッドリッパー 1950X

GPU - Sapphire RX 480 (AMD、ホスト グラフィックス用) - MSI Duke RTX 2080 (nVidia、ゲスト グラフィックス用)

マザーボード - MSI Carbon Gaming Pro AC x399

問題

nVidia GPU をパススルーしようとすると、エラーが発生しますPlease ensure all devices within the iommu_group are bound to their vfio bus driver.(下の画像を参照)。

を実行するとlspci -k、次のレコードが見つかります。

0b:00.0 VGA compatible controller [0300]: NVIDIA Corporation GV104 [GeForce GTX 1180] [10de:1e87] (rev a1)
    Subsystem: Micro-Star International Co., Ltd. [MSI] Device [1462:3721]
    Kernel driver in use: vfio-pci
    Kernel modules: nvidiafb, nouveau
0b:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:10f8] (rev a1)
    Subsystem: Micro-Star International Co., Ltd. [MSI] Device [1462:3721]
    Kernel driver in use: vfio-pci
    Kernel modules: snd_hda_intel
0b:00.2 USB controller [0c03]: NVIDIA Corporation Device [10de:1ad8] (rev a1)
    Subsystem: Micro-Star International Co., Ltd. [MSI] Device [1462:3721]
    Kernel driver in use: xhci_hcd
0b:00.3 Serial bus controller [0c80]: NVIDIA Corporation Device [10de:1ad9] (rev a1)
    Subsystem: Micro-Star International Co., Ltd. [MSI] Device [1462:3721]
    Kernel driver in use: nvidia-gpu
    Kernel modules: i2c_nvidia_gpu
41:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Radeon RX 470/480/570/570X/580/580X] [1002:67df] (rev c7)
    Subsystem: PC Partner Limited / Sapphire Technology Radeon RX 470/480 [174b:e347]
    Kernel driver in use: amdgpu
    Kernel modules: amdgpu
41:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Radeon RX 580] [1002:aaf0]
    Subsystem: PC Partner Limited / Sapphire Technology Ellesmere [Radeon RX 580] [174b:aaf0]
    Kernel driver in use: snd_hda_intel
    Kernel modules: snd_hda_intel

これは、RTX 2080 が、および 上の vfio-pci によって使用されているが0b:00.00b:00.1と(すべて RTX 2080 に属する) が と によって使用されていること0b:00.2を報告します。0b.00.3xhci_hcdnvidia-gpu

私の理解では、これが問題です。

私がやったこと

私は主にレベル1のスレッドそしてジャック・フォードのブログ投稿:

ブラックリストヌーボー

ファイル内/etc/modprobe.d/blacklist-nouveau.conf

blacklist nouveau
options nouveau modeset=0

GRUB を更新

/etc/default/grub

GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amd_iommu=on vfio-pci.ids=10de:1e87,10de:10f8,10de:1ad8,10de:1ad9"
GRUB_CMDLINE_LINUX=""

カーネルモジュールの追加

/etc/modules

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

/etc/modprobe.d/vfio.conf

options vfio-pci ids=10de:1e87,10de:10f8,10de:1ad8,10de:1ad9

/etc/modules-load.d/vfio-pci.conf

vfio-pci

IOMMU/VFIOが有効になっていることを確認しました

$ dmesg | grep -E "DMAR|IOMMU"
[    0.946794] AMD-Vi: IOMMU performance counters supported
[    0.946855] AMD-Vi: IOMMU performance counters supported
[    0.976135] AMD-Vi: Found IOMMU at 0000:00:00.2 cap 0x40
[    0.976139] AMD-Vi: Found IOMMU at 0000:40:00.2 cap 0x40
[    0.977856] perf/amd_iommu: Detected AMD IOMMU #0 (2 banks, 4 counters/bank).
[    0.977873] perf/amd_iommu: Detected AMD IOMMU #1 (2 banks, 4 counters/bank).
[    1.367168] AMD-Vi: AMD IOMMUv2 driver by Joerg Roedel <[email protected]>
$ dmesg | grep -i vfio
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-5.0.0-37-generic root=UUID=27ff4f46-db04-4ca0-8981-191a45c365ad ro quiet splash amd_iommu=on vfio-pci.ids=10de:1e87,10de:10f8,10de:1ad8,10de:1ad9 vt.handoff=1
[    0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-5.0.0-37-generic root=UUID=27ff4f46-db04-4ca0-8981-191a45c365ad ro quiet splash amd_iommu=on vfio-pci.ids=10de:1e87,10de:10f8,10de:1ad8,10de:1ad9 vt.handoff=1
[    2.667765] VFIO - User Level meta-driver version: 0.3
[    2.675583] vfio-pci 0000:0b:00.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=io+mem:owns=none
[    2.692215] vfio_pci: add [10de:1e87[ffffffff:ffffffff]] class 0x000000/00000000
[    2.712193] vfio_pci: add [10de:10f8[ffffffff:ffffffff]] class 0x000000/00000000
[    2.712199] vfio_pci: add [10de:1ad8[ffffffff:ffffffff]] class 0x000000/00000000
[    2.712204] vfio_pci: add [10de:1ad9[ffffffff:ffffffff]] class 0x000000/00000000
[    4.960496] vfio-pci 0000:0b:00.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=io+mem:owns=none

結論

ご協力ありがとうございます。nVidia IOMMU グループ内の他の 2 つのエントリが何なのかはわかりませんが、すべて nVidia デバイスに属しているようです。USB およびシリアル コントローラーを無効にすれば、問題が解決すると思います。

答え1

最近同じ問題に直面しています。主な目的は、Wi-Fi で vfio を使用するようにすることですが、同じ IOMMU グループにあるため、USB と RAM も移動する必要があります。

質問に記載されているすべての手順を実行し、vfio に RAM と WIFI デバイスを取得しましたが、USB は取得できませんでした。

最終的に、xhci_hcd はモジュールとしてではなくカーネルにコンパイルされていることがわかりました。したがって、USB コントローラー ID を GRUB_CMDLINE_LINUX_DEFAULT に配置すると、USB コントローラーはカーネル内にすでにあるため、xhci_hcd とバインドされます。カーネルが xhci_hcd をコンパイルしているかどうかを確認するには、次の手順を実行します。

modprobe -D xhci_hcd

出力が次の場合:

builtin xhci_hcd

するとカーネルに xhci_hcd が含まれるようになります。

最終的には、手動でドライバーのアンバインドとバインドを実行するスクリプトが作成されます。

#!/bin/sh
PCI_HID=
echo -n "$PCI_HID" > /sys/bus/pci/drivers/xhci_hcd/unbind
echo -n "$PCI_HID" > /sys/bus/pci/drivers/vfio-pci/bind

質問については、次のようになります。

#!/bin/sh
PCI_HID="0000:0b:00.2"
echo -n "$PCI_HID" > /sys/bus/pci/drivers/xhci_hcd/unbind
echo -n "$PCI_HID" > /sys/bus/pci/drivers/vfio-pci/bind
PCI_HID="0000:0b:00.3"
echo -n "$PCI_HID" > /sys/bus/pci/drivers/nvidia-gpu/unbind
echo -n "$PCI_HID" > /sys/bus/pci/drivers/vfio-pci/bind

PS: ドライバーを手動でバインドおよびアンバインドしていますが、GRUB_CMDLINE_LINUX_DEFAULT およびモジュール構成の手順は依然として必要です。そうしないと、vfio は USB コントローラーにバインドされません。

答え2

少し遅れたことは承知していますが、同様の問題に直面している人々の役に立つことを願います。 これは個別の USB コントローラーでのみテストしたことに注意してください。

xhci_hcd は実際はカーネル内に組み込まれているため、USB コントローラーを要求します。vfio-pci をバインド/アンバインドするスクリプトなどの回避策が見つからない限り、使用中のカーネルとして割り当てられません。

この問題を解決する別の方法は、次のコマンドを使用することです。

sudo driverctl -v set-override 0000:0X:00 vfio-pci

どこ0000:0X:00 は PCI ID です。

再起動すると、割り当てられたドライバーは自動的に vfio-pci になります。

関連情報