GPU passthrough: windows guest распознает GTX 1060, но я не могу его использовать. Передача звука GTX делает VM сверхмедленной

Я пытаюсь сделать GPU passthrough для GTX 1060 на Ryzen 7 2700x.

Я следовал https://mathiashueber.com/windows-virtual-machine-gpu-passthrough-ubuntu/, но я не смог внести драйвер nvidia в черный список, поскольку GPU хоста также является NVIDIA, поэтому я использую причуды, упомянутые ниже.

Когда я запускаю Ubuntu 19 на хост-машине, я получаю следующее lspci -nnv:

07:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU116 [GeForce GTX 1660] [10de:2184] (rev a1) (prog-if 00 [VGA controller])
    Subsystem: NVIDIA Corporation TU116 [GeForce GTX 1660] [10de:1324]
    Flags: bus master, fast devsel, latency 0, IRQ 11
    Memory at f6000000 (32-bit, non-prefetchable) [size=16M]
    Memory at d0000000 (64-bit, prefetchable) [size=256M]
    Memory at e0000000 (64-bit, prefetchable) [size=32M]
    I/O ports at f000 [size=128]
    Expansion ROM at 000c0000 [disabled] [size=128K]
    Capabilities: <access denied>
    Kernel driver in use: vfio-pci
    Kernel modules: nvidiafb, nouveau

07:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:1aeb] (rev a1)
    Subsystem: NVIDIA Corporation Device [10de:1324]
    Flags: bus master, fast devsel, latency 0, IRQ 81
    Memory at f7080000 (32-bit, non-prefetchable) [size=16K]
    Capabilities: <access denied>
    Kernel driver in use: snd_hda_intel
    Kernel modules: snd_hda_intel

07:00.2 USB controller [0c03]: NVIDIA Corporation Device [10de:1aec] (rev a1) (prog-if 30 [XHCI])
    Subsystem: NVIDIA Corporation Device [10de:1324]
    Flags: bus master, fast devsel, latency 0, IRQ 49
    Memory at e2000000 (64-bit, prefetchable) [size=256K]
    Memory at e2040000 (64-bit, prefetchable) [size=64K]
    Capabilities: <access denied>
    Kernel driver in use: xhci_hcd

07:00.3 Serial bus controller [0c80]: NVIDIA Corporation Device [10de:1aed] (rev a1)
    Subsystem: NVIDIA Corporation Device [10de:1324]
    Flags: bus master, fast devsel, latency 0, IRQ 11
    Memory at f7084000 (32-bit, non-prefetchable) [size=4K]
    Capabilities: <access denied>
    Kernel driver in use: vfio-pci

Они находятся в одной группе iommu (15). Вы можете видеть, что некоторые устройства группы не удерживаются vfio-pci. Поскольку у меня есть карта NVIDIA в госте и хосте, я не могу просто внести в черный список драйвер nvidia, и я не потрудился внести в черный список остальные. Вместо этого я сделал этот сценарий, чтобы вручную отвязать pci устройства от драйверов:

echo -n "0000:07:00.1" > /sys/bus/pci/drivers/snd_hda_intel/unbind
echo -n "0000:07:00.1" > /sys/bus/pci/drivers/vfio-pci/bind

echo -n "0000:07:00.2" > /sys/bus/pci/drivers/xhci_hcd/unbind
echo -n "0000:07:00.2" > /sys/bus/pci/drivers/vfio-pci/bind

echo -n "0000:07:00.3" > /sys/bus/pci/drivers/nvidia-gpu/unbind
echo -n "0000:07:00.3" > /sys/bus/pci/drivers/vfio-pci/bind

Иногда строки 07.00.3 не нужны, потому что драйвер начинает привязываться к vfio-pci, но иногда он используется nvidia-gpu.

После запуска скрипта от имени root все 4 устройства отображаются как используемые vfio-pci.

Если я добавляю только устройство 07.00.0, которое является GTX 1060, virt-manager запускается мгновенно, и Windows показывает GTX 1060 в диспетчере устройств, но с желтым восклицательным знаком. Я попробовал обновить драйверы через диспетчер устройств, но это ничего не дало. Если я запускаю игру в Steam, она запускается и закрывается. Очевидно, я изменил HDMI телевизора на HDMI GTX 1060, но я получаю "нет сигнала" от телевизора. Windows также установила панель управления NVIDIA, но когда я пытаюсь запустить ее, ничего не происходит. Стоит отметить, что когда я запускаю virt-manager с GTX, я не могу обнаружить другие дисплеи, только один по умолчанию, и я даже не могу изменить разрешение (800x600). Я пробовал QXL, VGA и Virtio, все они запускаются с 800x600, не позволяя мне изменить.

Если я ставлю GTX (07.00.0) с любой другой из 07.00.x для x=1,2,3, virt-manager зависает на несколько минут, когда я нажимаю кнопку run, пока наконец не запускает VM. Затем Windows начинает работать крайне медленно, я даже не могу разблокировать экран, потому что, когда я нажимаю на него, требуется около 5 минут, чтобы анимировать и показать ввод пароля для разблокировки.

Моя Windows 10 использует i440FX в качестве чипсета и UEFI x86_64: /usr/share/OVMF/OVMF_CODE.fd в качестве прошивки.

Я использую Ubuntu 19.10 с ядром 4.15.0-1050-oem, потому что тот, который поставляется (5.something), дает эту ошибку замораживания: 19.10 Ubuntu host entirely freezes during Windows 10 qemu install everytime I launch the windows vm.

Затем я скомпилировал qemu 4.1, но когда я запускаю все 4 устройства pci (07.00.x для x=0,1,2,3), я по-прежнему получаю проблему сверхмедленного запуска virt-manager, а также сверхмедленного экрана разблокировки Windows. Когда я запускаю только GTX (07.00.0), я получаю такое же поведение, как и в старом QEMU.

Стоит заметить, что каждый раз, когда я добавляю 07.00.x для x=1,2,3, когда я выключаю ВМ и пытаюсь удалить эти pci устройства, virt-manager замерзает, и мне приходится его убивать и открывать заново. Затем, когда он открывается, мне приходится ждать, пока QEMU/KVM снова подключится. Когда это происходит, я получаю

Error starting domain: internal error: Unknown PCI header type '127'

при повторном запуске виртуальной машины. Приходится перезагружать хост. Это происходит со старым и 4.1 qemu.

Вот мой подробный XML машины: https://pastebin.com/BKtJq9PX

Я пытался изменить

<type arch="x86_64" machine="pc-i440fx-4.0">hvm</type>

на

<type arch='x86_64' machine='pc-q35-4.1'>hvm</type>

но я всегда получаю

error: XML error: The PCI controller with index='0' must be model='pcie-root' for this machine type, but model='pci-root' was found instead

Любые идеи о том, как дальше отлаживать эту проблему?

UPDATE:

Я обнаружил, что ошибка в моем драйвере NVIDIA была "error 43", и таким образом нашел о https://mathiashueber.com/fighting-error-43-nvidia-gpu-virtual-machine/. Я применил исправления в XML, но они не сработали.

Вот весь мой XML: https://pastebin.com/yajTNFPs

0
задан 21 February 2020 в 08:55

1 ответ

Вы должны убедиться, что устройства, через которые вы проходите, не испорчены драйверами на стороне хоста, прежде чем они будут назначены vfio-pci. Обычно это делается путем занесения в черный список nouveau, nvidia и любых других драйверов, на которые выставлен счет (например, драйверов для USB-устройств, упомянутых выше). Если вам нужны эти драйверы для других устройств в системе, загрузите их в сценарии запуска ПОСЛЕ того, как устройства, которые необходимо привязать к vfio-pci, будут привязаны к vfio-pci.

Также имейте в виду, что привязка и отмена привязки устройств PCI между гостевой и хост-системой динамически вызывает проблемы со стабильностью во многих системах. Лучший способ - статически привязать устройства к vfio-pci и оставить их привязанными.

Ваш XML-файл libvirt выглядит так, как будто он содержит все необходимые биты, чтобы избежать ошибки code 43 в гостевой системе.

1
ответ дан 3 May 2020 в 16:20

Другие вопросы по тегам:

Похожие вопросы: