Краткое содержание
Я пытаюсь настроить GPU-passthrough на хосте Linux с KVM, чтобы я мог запустить гостевую Windows для игр. У меня возникла проблема, когда некоторые записи IOMMU (все принадлежащие GPU, который я хочу пропустить) назначаются шине vfio, в то время как другие назначаются драйверам nvidia-gpu.
Аппаратное обеспечение
ЦП - Threadripper 1950X
Графический процессор - Sapphire RX 480 (AMD, предназначен для хостовой графики) - MSI Duke RTX 2080 (nVidia, предназначен для гостевой графики)
Материнская плата - MSI Carbon Gaming Pro AC x399
Проблема
Когда я пытаюсь подключить свой графический процессор nVidia, я получаю сообщение об ошибке Please ensure all devices within the iommu_group are bound to their vfio bus driver.
(см. изображения ниже).
- Настройка в virt-manager:https://i.stack.imgur.com/BK0s4.png
- Ошибка, которую я получаю:https://i.stack.imgur.com/XJKfm.png
При запуске 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.0
, и 0b:00.1
, но 0b:00.2
и 0b.00.3
(которые все относятся к RTX 2080) используются xhci_hcd
и nvidia-gpu
.
Насколько я понимаю, проблема именно в этом.
Что я наделал
Я в основном ссылалсяпоток уровня 1изапись в блоге Джека Форда:
Черный список Nouveau
в файле/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
Недавно столкнулся с той же проблемой. Основная цель — заставить Wi-Fi использовать vfio, но нужно также переместить USB и RAM, так как они находятся в одной группе IOMMU.
Я выполнил все шаги, указанные в вопросах, получил оперативную память и устройство WIFI на VFIO, но не USB.
Наконец выяснилось, что xhci_hcd скомпилирован в ядро, а не как модуль. Поэтому, поместив идентификатор контроллера USB в 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-идентификатор.
После перезагрузки автоматически будет назначен драйвер vfio-pci.