Добрый вечер. Проблема: виртуалка с прокинутой видеокартой грузится только один раз, после чего требуется ребут хостовой системы, чтобы можно было снова загрузить виртуалку.
Использую 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
Помогите!