概括

概括

概括

我正在尝试在带有 KVM 的 Linux 主机上设置 GPU 直通,以便可以运行 Windows 客户机进行游戏。我遇到了一个问题,一些 IOMMU 条目(所有属于我希望直通的 GPU)被分配给 vfio 总线,而其他条目则分配给 nvidia-gpu 驱动程序。

硬件

CPU——Threadripper 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.10b:00.20b.00.3(均属于 RTX 2080)正被xhci_hcd和使用nvidia-gpu

我的理解就是这个道理。

我做了什么

我主要提到Level1 线程杰克·福特 (Jack Ford) 的博客文章

黑名单新事物

在文件中/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 组中的另外两个条目是什么,但它们似乎都属于 nVidia 设备。我猜如果我可以禁用 USB 和串行控制器,事情可能会好转?

答案1

最近遇到了同样的问题。主要目的是让 wifi 使用 vfio,但还需要移动 USB 和 RAM,因为它们在同一个 IOMMU 组中。

我按照问题中提到的所有步骤操作,在 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。

相关内容