Назад | Перейти на главную страницу

Использовать сквозной графический процессор в KVM / QEMU и отображать в ОС хоста в окне

Я новичок в KVM / QEMMU. Я использовал виртуальный ящик для запуска Windows 10 на виртуальной машине в моей хост-системе Arch (ноутбук со встроенными и дискретными графическими процессорами). Неудовлетворенный скоростью реакции гостевой машины на видео, я решил назначить виртуальной машине [неиспользуемый по причинам управления питанием] дискретный графический процессор. Для этого я отказался от Virtual Box и использую Virtual Machine Manager, визуальный менеджер KVM / QEMMU для создания новой машины.

Мне удалось назначить карту без проблем после следующих руководств, я обошел ошибку Code43, и все отлично, официальные последние версии драйверов работают.

Но максимальное разрешение составляет 800x600, и при попытке запустить панель управления Nvidia жалуется, что монитор не подключен.

Чего я пытаюсь достичь: использовать мою виртуальную машину так же, как я использовал ее в VirtualBox (то есть в оконном режиме или в полноэкранном режиме, когда это необходимо), за исключением использования дискретного графического процессора для повышения производительности. Возможно ли это, или для этой конфигурации требуется внешний монитор для использования сквозного графического процессора (это не то, что я хочу сделать, и, кстати, также невозможно, потому что карта находится в ноутбуке, у которого выход HDMI привязан к Intel встроенный графический процессор)

Вот как выглядит сквозная конфигурация для карты Nvidia:

Я заметил, что в конфигурации виртуальной машины есть несколько разделов, связанных с видео. Я не уверен, как они взаимодействуют и как / должны ли они быть настроены для использования графического процессора:

И:

Вот полная конфигурация виртуальной машины:

<domain type="kvm">
  <name>Win10</name>
  <uuid>6ab00ea8-54c1-470e-a37f-83d033b743dc</uuid>
  <metadata>
    <libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
      <libosinfo:os id="http://microsoft.com/win/10"/>
    </libosinfo:libosinfo>
  </metadata>
  <memory unit="KiB">5218304</memory>
  <currentMemory unit="KiB">5218304</currentMemory>
  <vcpu placement="static" current="6">18</vcpu>
  <os>
    <type arch="x86_64" machine="pc-q35-4.2">hvm</type>
    <loader readonly="yes" type="pflash">/usr/share/ovmf/x64/OVMF_CODE.fd</loader>
    <nvram>/var/lib/libvirt/qemu/nvram/Win10_VARS.fd</nvram>
  </os>
  <features>
    <acpi/>
    <apic/>
    <hyperv>
      <relaxed state="off"/>
      <vapic state="off"/>
      <spinlocks state="off"/>
      <vendor_id state="on" value="GoodTimesTM"/>
    </hyperv>
    <kvm>
      <hidden state="on"/>
    </kvm>
    <vmport state="off"/>
  </features>
  <cpu mode="host-model" check="partial">
    <topology sockets="1" cores="3" threads="6"/>
  </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"/>
      <source file="/home/nuk/Downloads/Win10_1909_English_x64.iso"/>
      <target dev="sdb" bus="sata"/>
      <readonly/>
      <address type="drive" controller="0" bus="0" target="0" unit="1"/>
    </disk>
    <disk type="block" device="disk">
      <driver name="qemu" type="raw" cache="none" io="native"/>
      <source dev="/dev/nvme0n1p7"/>
      <target dev="sdc" bus="sata"/>
      <boot order="1"/>
      <address type="drive" controller="0" bus="0" target="0" unit="2"/>
    </disk>
    <disk type="block" device="disk">
      <driver name="qemu" type="raw" cache="none" io="native"/>
      <source dev="/dev/nvme0n1p8"/>
      <target dev="sdd" bus="sata"/>
      <address type="drive" controller="0" bus="0" target="0" unit="3"/>
    </disk>
    <controller type="usb" index="0" model="qemu-xhci" ports="15">
      <address type="pci" domain="0x0000" bus="0x02" slot="0x00" function="0x0"/>
    </controller>
    <controller type="sata" index="0">
      <address type="pci" domain="0x0000" bus="0x00" slot="0x1f" function="0x2"/>
    </controller>
    <controller type="pci" index="0" model="pcie-root"/>
    <controller type="pci" index="1" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="1" port="0x10"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x0" multifunction="on"/>
    </controller>
    <controller type="pci" index="2" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="2" port="0x11"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x1"/>
    </controller>
    <controller type="pci" index="3" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="3" port="0x12"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x2"/>
    </controller>
    <controller type="pci" index="4" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="4" port="0x13"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x3"/>
    </controller>
    <controller type="pci" index="5" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="5" port="0x14"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x4"/>
    </controller>
    <controller type="virtio-serial" index="0">
      <address type="pci" domain="0x0000" bus="0x03" slot="0x00" function="0x0"/>
    </controller>
    <interface type="direct">
      <mac address="52:54:00:77:e0:b9"/>
      <source dev="ens12u1u2" mode="bridge"/>
      <model type="e1000e"/>
      <address type="pci" domain="0x0000" bus="0x01" slot="0x00" 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>
    <channel type="spicevmc">
      <target type="virtio" name="com.redhat.spice.0"/>
      <address type="virtio-serial" controller="0" bus="0" port="1"/>
    </channel>
    <input type="tablet" bus="usb">
      <address type="usb" bus="0" port="1"/>
    </input>
    <input type="mouse" bus="ps2"/>
    <input type="keyboard" bus="ps2"/>
    <graphics type="spice" autoport="yes">
      <listen type="address"/>
      <image compression="off"/>
    </graphics>
    <sound model="ich9">
      <address type="pci" domain="0x0000" bus="0x00" slot="0x1b" function="0x0"/>
    </sound>
    <video>
      <model type="qxl" ram="65536" vram="65536" vgamem="16384" heads="1" primary="yes"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x0"/>
    </video>
    <hostdev mode="subsystem" type="pci" managed="yes">
      <source>
        <address domain="0x0000" bus="0x03" slot="0x00" function="0x0"/>
      </source>
      <address type="pci" domain="0x0000" bus="0x05" slot="0x00" function="0x0"/>
    </hostdev>
    <redirdev bus="usb" type="spicevmc">
      <address type="usb" bus="0" port="2"/>
    </redirdev>
    <redirdev bus="usb" type="spicevmc">
      <address type="usb" bus="0" port="3"/>
    </redirdev>
    <memballoon model="virtio">
      <address type="pci" domain="0x0000" bus="0x04" slot="0x00" function="0x0"/>
    </memballoon>
  </devices>
</domain>

Если вы хотите отображать вывод в окне, у вас есть два варианта:

1) Без графического процессора, установите устройство с эмуляцией QXL, которое подходит для разрешения до 2560x1600

2) Если вам нужен графический процессор и ускорение, вам необходимо удалить любые другие эмулируемые видеоадаптеры, настроить виртуальную машину в качестве сервера удаленного рабочего стола с помощью RemoteFX и подключиться к нему с хоста с помощью xfreerdp.

Настройка последнего описана здесь: https://gist.github.com/Misairu-G/616f7b2756c488148b7309addc940b28

Эта запись нацелена на людей, выполняющих сквозную передачу Optimus GPU на ноутбуках, но процесс того, что вы пытаетесь сделать, фактически идентичен.