LINUX.ORG.RU

VM с прокинутой GPU запускается только один раз, после чего требуется рестарт хоста

 , , ,


0

1

Добрый вечер. Проблема: виртуалка с прокинутой видеокартой грузится только один раз, после чего требуется ребут хостовой системы, чтобы можно было снова загрузить виртуалку.

Использую virt-manager. вот xml описание VM:

<domain xmlns:qemu="http://libvirt.org/schemas/domain/qemu/1.0" type="kvm">
  <name>winxp</name>
  <uuid>da70b974-84c2-4f92-a52c-d9b695a40c81</uuid>
  <metadata>
    <libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
      <libosinfo:os id="http://microsoft.com/win/xp"/>
    </libosinfo:libosinfo>
  </metadata>
  <memory unit="KiB">4194304</memory>
  <currentMemory unit="KiB">4194304</currentMemory>
  <vcpu placement="static">4</vcpu>
  <os>
    <type arch="x86_64" machine="pc-i440fx-7.2">hvm</type>
  </os>
  <features>
    <acpi/>
    <apic/>
    <hyperv mode="custom">
      <relaxed state="on"/>
      <vapic state="on"/>
      <spinlocks state="on" retries="8191"/>
      <vendor_id state="on" value="randomid"/>
    </hyperv>
    <kvm>
      <hidden state="on"/>
    </kvm>
    <vmport state="off"/>
  </features>
  <cpu mode="host-passthrough" check="none" migratable="on">
    <topology sockets="1" dies="1" cores="4" threads="1"/>
  </cpu>
  <clock offset="localtime">
    <timer name="rtc" tickpolicy="catchup"/>
    <timer name="pit" tickpolicy="delay"/>
    <timer name="hpet" present="no"/>
    <timer name="hypervclock" present="yes"/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled="no"/>
    <suspend-to-disk enabled="no"/>
  </pm>
  <devices>
    <emulator>/usr/bin/qemu-system-x86_64</emulator>
    <disk type="file" device="cdrom">
      <driver name="qemu" type="raw"/>
      <target dev="hdb" bus="ide"/>
      <readonly/>
      <boot order="1"/>
      <address type="drive" controller="0" bus="0" target="0" unit="1"/>
    </disk>
    <disk type="file" device="disk">
      <driver name="qemu" type="raw"/>
      <source file="/var/lib/libvirt/images/VM_images_ssd/winxp.img"/>
      <target dev="hdc" bus="ide"/>
      <boot order="2"/>
      <address type="drive" controller="0" bus="1" target="0" unit="0"/>
    </disk>
    <controller type="usb" index="0" model="ich9-ehci1">
      <address type="pci" domain="0x0000" bus="0x00" slot="0x05" function="0x7"/>
    </controller>
    <controller type="usb" index="0" model="ich9-uhci1">
      <master startport="0"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x05" function="0x0" multifunction="on"/>
    </controller>
    <controller type="usb" index="0" model="ich9-uhci2">
      <master startport="2"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x05" function="0x1"/>
    </controller>
    <controller type="usb" index="0" model="ich9-uhci3">
      <master startport="4"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x05" function="0x2"/>
    </controller>
    <controller type="pci" index="0" model="pci-root"/>
    <controller type="ide" index="0">
      <address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x1"/>
    </controller>
    <controller type="virtio-serial" index="0">
      <address type="pci" domain="0x0000" bus="0x00" slot="0x06" function="0x0"/>
    </controller>
    <interface type="network">
      <mac address="52:54:00:65:4d:32"/>
      <source network="default"/>
      <model type="rtl8139"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x0"/>
    </interface>
    <serial type="pty">
      <target type="isa-serial" port="0">
        <model name="isa-serial"/>
      </target>
    </serial>
    <console type="pty">
      <target type="serial" port="0"/>
    </console>
    <input type="tablet" bus="usb">
      <address type="usb" bus="0" port="1"/>
    </input>
    <input type="mouse" bus="ps2"/>
    <input type="keyboard" bus="ps2"/>
    <audio id="1" type="none"/>
    <hostdev mode="subsystem" type="pci" managed="yes">
      <source>
        <address domain="0x0000" bus="0x06" slot="0x00" function="0x0"/>
      </source>
      <rom bar="on" file="/opt/630_rom"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x08" function="0x0"/>
    </hostdev>
    <hostdev mode="subsystem" type="usb" managed="yes">
      <source>
        <vendor id="0x09da"/>
        <product id="0xfa70"/>
      </source>
      <address type="usb" bus="0" port="3"/>
    </hostdev>
    <hostdev mode="subsystem" type="usb" managed="yes">
      <source>
        <vendor id="0x0a12"/>
        <product id="0x0001"/>
      </source>
      <address type="usb" bus="0" port="4"/>
    </hostdev>
    <hostdev mode="subsystem" type="usb" managed="yes">
      <source>
        <vendor id="0x1a2c"/>
        <product id="0x4c5e"/>
      </source>
      <address type="usb" bus="0" port="2"/>
    </hostdev>
    <hostdev mode="subsystem" type="pci" managed="yes">
      <source>
        <address domain="0x0000" bus="0x06" slot="0x00" function="0x1"/>
      </source>
      <rom bar="on"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x0"/>
    </hostdev>
    <memballoon model="virtio">
      <address type="pci" domain="0x0000" bus="0x00" slot="0x07" function="0x0"/>
    </memballoon>
  </devices>
  <qemu:override>
    <qemu:device alias="hostdev0">
      <qemu:frontend>
        <qemu:property name="x-vga" type="bool" value="true"/>
        <qemu:property name="romfile" type="string" value="/opt/630_rom"/>
      </qemu:frontend>
    </qemu:device>
  </qemu:override>
</domain>

Как вы можете заметить, у меня гостевая ОС - win XP, в EFI она не умеет. GPU - nvidia GTX 630.

Вот параметры загрузки ядра

append="root=/dev/nvme0n1p2 vga=normal ro amd_iommu=on iommu=pt kvm_amd.npt=1 kvm_amd.avic=1 kvm.ignore_msrs=1 video=vesafb:off,efifb:off vfio-pci.disable_idle_d3=1 pcie_acs_override=downstream,multifunction"

вот что в /etc/modules, initrd был пересобран, насколько понимаю, с ними

vfio
vfio_iommu_type1
vfio_pci ids=10de:0f00,10de:0bea

вот /etc/modprobe.d/vfio.conf

options vfio-pci ids=10de:0f00,10de:0bea
softdep nvidia pre: vfio-pci
softdep snd_hda_intel pre: vfio-pci

в виртуалку прокинуто два устройства (видеокарта и звук на ней)

0000:06:00.0 и 0000:06:00.1

при первой загрузке в dmesg по vfio есть такие строки:

[Fri Nov 29 02:09:11 2024] vfio-pci 0000:06:00.0: enabling device (0000 -> 0003)
[Fri Nov 29 02:09:12 2024] vfio-pci 0000:06:00.1: enabling device (0000 -> 0002)
[Fri Nov 29 02:09:13 2024] vfio-pci 0000:06:00.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=io+mem:owns=none

при второй загрузке в dmesg по vfio только это:

[Fri Nov 29 02:12:26 2024] vfio-pci 0000:06:00.0: Invalid PCI ROM header signature: expecting 0xaa55, got 0xffff

Очевидно, что что-то идет не так при выключении вм. Гпу не возвращается в то же состояние, в котором она была до загрузки вм. Я пробовал уже вот так

echo 1 > /sys/bus/pci/devices/0000\:06\:00.0/remove
echo 1 > /sys/bus/pci/devices/0000\:06\:00.1/remove
echo 1 > /sys/bus/pci/rescan

и вот так

echo '0000:06:00.1' > /sys/bus/pci/drivers/vfio-pci/unbind
echo '0000:06:00.0' > /sys/bus/pci/drivers/vfio-pci/unbind
echo '0000:06:00.1' > /sys/bus/pci/drivers/vfio-pci/bind
echo '0000:06:00.0' > /sys/bus/pci/drivers/vfio-pci/bind

и вот так

setpci -s 06:00.0 COMMAND=2:2
setpci -s 06:00.0 COMMAND=0:2

а так же я пробовал стянуть биос с карты и подсунуть его файлом, что видно из xml конфига И всё это не помогло.

Из любопытного - если при первом старте VM снять чекбоксы «ROM BAR» с прокинутой карты - VM не грузится, но в dmesg есть сообщения enabling device и changed VGA decodes. Если повторно включить ROM BAR - она ведет себя как обычно и запускается только один раз. Видимо необратимые изменения происходят только если стоит чекбокс ROM BAR. Но я пытался гуглить и мне не особо помогло то что я находил.

версии ПО:

Linux abyss.example.org 5.15.19 #1 SMP PREEMPT Wed Nov 20 22:34:10 MSK 2024 x86_64 AMD Ryzen 5 3600 6-Core Processor AuthenticAMD GNU/Linux
ядро патченное ACS override patch-ем
libvirt-9.1.0-x86_64-1_SBo
libvirt-glib-4.0.0-x86_64-1_SBo
libvirt-python-9.1.0-x86_64-1_SBo
virt-manager-4.1.0-x86_64-1_SBo
qemu-7.2.1-x86_64-2_SBo

Помогите!



Последнее исправление: hatsujouki (всего исправлений: 1)