web-dev-qa-db-fra.com

GPU passthrough fonctionne avec le firmware UEFI mais pas Windows ISO

J'essaie de mettre en place une machine virtuelle avec des graphiques passthrough. Je suis capable d'obtenir le passage au travail pour la coquille UEFI, mais pas le Officiel Windows Installer . Je peux faire fonctionner le programme d'installation Windows, mais seulement avec des graphiques émulés

Cela démarre le programme d'installation Windows dans une fenêtre QEMU:

Sudo qemu-system-x86_64 --enable-kvm \
-name TESTVM,process=TESTVM \
-cdrom /media/big-tank-8TB/OSISOS/Windows/WindowsOct2018.iso \
-smp 4 \
-cpu core2duo \
-m 4096 \
-vga qxl

Cela démarre également le programme d'installation Windows dans une fenêtre QEMU (toujours pas de passage)

Sudo qemu-system-x86_64 --enable-kvm \
-name TESTVM,process=TESTVM \
-cdrom /media/big-tank-8TB/OSISOS/Windows/WindowsOct2018.iso \
-smp 4 \
-cpu core2duo \
-m 4096 \
-device vfio-pci,Host=43:00.0,multifunction=on \
-device vfio-pci,Host=43:00.1 

Mais si je spécifie les chemins du micrologiciel UEFI, je reçois l'écran Tiano Slpash, puis la coquille UEFI sur le moniteur connecté à ma carte vidéo transcédée et dans une fenêtre QEMU.

Sudo qemu-system-x86_64 --enable-kvm \
-name TESTVM,process=TESTVM \
-cdrom /media/big-tank-8TB/OSISOS/Windows/WindowsOct2018.iso \
-smp 4 \
-cpu core2duo \
-m 4096 \
-device vfio-pci,Host=43:00.0,multifunction=on \
-device vfio-pci,Host=43:00.1 \
-drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE.fd \
-drive if=pflash,format=raw,file=/usr/share/OVMF/OVMF_VARS.fd 

Pourquoi la passée ne travaille-t-elle que en l'absence des fichiers UEFI? Ou pourquoi spécifier les fichiers UEFI m'empêche de commencer à démarrer Windows?

EDIT: Essayé de télécharger une version différente de Windows (avril 2018 au lieu de l'octobre), même problème.

EDIT: Essayé de purger et de réinstaller OVMF, mais pas de chance.

Edit: Je peux vous rendre au gestionnaire de démarrage en tapant "EXIT" dans la coque, mais la sélection du lecteur de DVD disponible (et toutes les autres options) redevient immédiatement au gestionnaire de démarrage.

EDIT: Ran Ceci:

-name TESTVM,process=TESTVM \
-drive file=/media/big-tank-8TB/OSISOS/Windows/Win10_1803_English_x64.iso,index=1,media=cdrom  \
-drive file=/media/big-tank-8TB/OSISOS/Windows/virtio-win-0.1.160.iso,index=2,media=cdrom \
-smp 4 \
-cpu core2duo \
-m 4096 \
-device vfio-pci,Host=43:00.0,multifunction=on \
-device vfio-pci,Host=43:00.1 \
-drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE.fd \
-drive if=pflash,format=raw,file=/usr/share/OVMF/OVMF_VARS.fd 

Lorsque j'ai eu aussi la coquille UEFI, j'ai tapé "Sortie" pour accéder au gestionnaire de démarrage. Dans le gestionnaire de démarrage, la sélection du lecteur de DVD disponible est revenue instantanément au gestionnaire de démarrage.

J'ai ensuite ajouté un autre lecteur de DVD par Boot Maintenance Manager> Options de démarrage> Ajouter une option de démarrage, puis sélectionnée dans le menu Boot Manager. the boot entry I picked .

Cela m'a donné un très bref "Appuyez sur n'importe quelle touche pour démarrer de CD". Si je suis assez rapide, cela démarre dans l'installateur Windows mais uniquement dans la fenêtre QEMU. L'écran attaché à la carte transcédée était noir avec un simple curseur, par opposition à la mise en miroir comme avec le gestionnaire UEFI/Boot.

Edit: J'essaie de passer à travers un NVIDIA GTX1070. Mobo est Asrock X399 Taichi, le processeur est Threadripper 1950x. OS est serveur Ubuntu avec XFCE installé.

Edit: Si je poursuit l'installation, j'ai toujours des fenêtres dans la fenêtre QEMU et juste un écran Splash Tianocore sur la carte passthrough. Si je vais au gestionnaire de périphériques, Windows voit la carte, mais elle est arrêtée pour une raison quelconque. Error 43

EDIT: J'ai essayé d'utiliser ces instructions pour vous débarrasser du code 43, en vain. Pour essayer cela, j'ai utilisé Vér-installation au lieu de QEMU-SYSTEM, et lorsque cela vous contient, il n'y a pas d'écran Splash Tianocore. Mais toujours le code 43 quand je suis dans Windows.

EDIT: DMESG d'occasion pour vérifier les erreurs de réservation de mémoire comme décrit ICI. trouvé aucun. Edit: Également à partir du lien ci-dessus, utilisé ROM Parser et confirmé la présence d'un "type 3 (EFI)"

6
Stonecraft

Vous êtes déjà sur la bonne piste. GPU passthrough n'est pas parfaite, surtout si c'est une carte NVIDIA (que vous ne mentionnez pas NVIDIA ou AMD). Terminez la configuration sur la fenêtre QEMU. Assurez-vous que la machine Windows est connectée à Internet et permet à Windows Update installer les pilotes graphiques pour vous. Lorsque vous revenez, vous devriez être accueilli par un second moniteur, sinon, redémarrez. Je supprime généralement la console SPICE/VNC et je n'ai que le moniteur GPU attaché. Obtenir le GPU Passthrough à travailler est tout au sujet des essais et des erreurs.

Autres choses à essayer:

  • Installez Windows sans passez GPU, puis essayez de GPU passez.
  • Installez les pilotes via nvidia_drivers.exe
  • Installez les pilotes via Windows Update
  • BIOS VS UEFI
  • Q35 vs i440fx

Remarque: le code 43 est une erreur connue avec la vérification des pilotes NVIDIA s'ils fonctionnent dans un VM. Nvidia vend des cartes spécifiquement pour exécuter dans A VM Environment et tente de bloquer l'installation des pilotes pour les cartes de qualité de consommation dans une machine virtuelle. Vous devez vous assurer d'utiliser ce qui suit dans votre domaine.xml

<kvm>
 <hidden state='on'/>
</kvm>

Voir https://passthrouthpo.st/apply-Error-43-worka/ et autres ressources pour des exemples.

Voici une capture d'écran de ma configuration:

QEMU GPU Passtrough Settings

Voici la partie "pertinente" de mon domaine.xml, je peux partager une chose complète si tu veux, mais il a un tas de choses inutiles.

  <os>
    <type Arch='x86_64' machine='pc-i440fx-2.10'>hvm</type>
    <loader readonly='yes' type='pflash'>/usr/share/edk2/ovmf/OVMF_CODE.fd</loader>
    <nvram>/var/lib/libvirt/qemu/nvram/Windows10_VARS.fd</nvram>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <kvm>
      <hidden state='on'/>
    </kvm>
    <vmport state='off'/>
  </features>
  <clock offset='localtime'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
  </clock>
5

Je l'ai fait avec ceci:

Sudo qemu-system-x86_64 --enable-kvm \
-name TESTVM,process=TESTVM \
-drive id=disk0,if=virtio,cache=none,format=raw,file=/dev/nvme-tank/ntfs-zvol,index=2 \
-smp 4 \
-cpu core2duo,kvm=off \
-m 4096 \
-device vfio-pci,Host=43:00.0,multifunction=on \
-device vfio-pci,Host=43:00.1 \
-drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE.fd \
-drive if=pflash,format=raw,file=/usr/share/OVMF/OVMF_VARS.fd 

et ensuite allant à l'entrée GTX 1070 dans le gestionnaire de périphériques et à la mise à jour des pilotes. La dernière fois (à l'aide de virt-installer) J'ai installé des mises à jour auprès du site Web de NVIDIA. Maintenant, pour obtenir cela fonctionne avec virtille afin que je puisse avoir un domaine modifiable XML.

EDIT: Jusqu'à présent, lorsque vous utilisez virt-installer, je reçois maintenant l'écran Tiano, mais cette fois-ci l'installation des pilotes comme décrit ci-dessus n'était pas suffisant, il ne fonctionnait pas non plus pour importer l'installation ci-dessus à l'aide d'une installation virtuelle (sur un Note latérale, il m'a fallu un moment pour réaliser que tout ce que je devais faire pour effectuer des travaux virtus avec mon installation existante était d'inclure l'ISO de démarrage, ce qui lui permet de démarrer à partir de l'installation sans erreur).

EDIT: Alors, je pense que je l'ai travaillé maintenant.

  1. Faites l'installation initiale à l'aide du QEMU-System-System-X86_64 ci-dessus
  2. Pilotes mis à jour à l'aide du gestionnaire de périphériques
  3. Ensuite, faites virt-installer (mais obtenez une erreur 43 à nouveau):

    virt-installer\--Name myWinvm1\--Boot uefi\-ram 4096\--Features kvm_hiden = on\--HostDev 43: 00.0, adresse.type = pci, adresse.multifunction = on\--HostDev 43: 00.1, adresse.type = pci\-disk chemin =/dev/nvme-réservoir/ntfs-zvol-part2\--cpu core2duo\-vcpus 4\-S-Type Windows\--os-Variant Win10\\ - Network Bridge = Virbr0\--Console PTY, Target_Type = Serial\--Disk /Media/big-tank-8tb/oseSo/windows/windowsoct2018.iso,device=cdrom\--Disk/média/Big-Tank- 8TB/OSOSOS/Windows/Virtio-Win-0.1.160.ISO, appareil = cdrom

  4. Supprimé le dispositif graphique d'épices à partir du XML MyWinvM1. Ne pouvait toujours pas passer le tianocore.

  5. a ajouté la fausse ligne d'identification du vendeur à mon xml

  6. Ajouté mes appareils USB

mon XML final:

<domain type='kvm' id='24'>
  <name>myWINVM1</name>
  <uuid>43e052b3-b3da-4025-92d8-ec7c8ff96ae9</uuid>
  <memory unit='KiB'>4194304</memory>
  <currentMemory unit='KiB'>4194304</currentMemory>
  <vcpu placement='static'>4</vcpu>
  <resource>
    <partition>/machine</partition>
  </resource>
  <os>
    <type Arch='x86_64' machine='pc-i440fx-bionic'>hvm</type>
    <loader readonly='yes' type='pflash'>/usr/share/OVMF/OVMF_CODE.fd</loader>
    <nvram>/var/lib/libvirt/qemu/nvram/myWINVM1_VARS.fd</nvram>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <hyperv>
      <relaxed state='on'/>
      <vapic state='on'/>
      <spinlocks state='on' retries='8191'/>
      <vendor_id state='on' value='1234567890ab'/>
    </hyperv>
    <kvm>
      <hidden state='on'/>
    </kvm>
    <vmport state='off'/>
  </features>
  <cpu mode='custom' match='exact' check='full'>
    <model fallback='forbid'>core2duo</model>
    <feature policy='disable' name='ss'/>
    <feature policy='disable' name='monitor'/>
    <feature policy='require' name='cx16'/>
    <feature policy='require' name='x2apic'/>
    <feature policy='require' name='hypervisor'/>
    <feature policy='require' name='lahf_lm'/>
  </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/kvm-spice</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/dev/nvme-tank/ntfs-zvol-part2'/>
      <backingStore/>
      <target dev='hda' bus='ide'/>
      <alias name='ide0-0-0'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/media/big-tank-8TB/OSISOS/Windows/WindowsOct2018.iso'/>
      <backingStore/>
      <target dev='hdb' bus='ide'/>
      <readonly/>
      <alias name='ide0-0-1'/>
      <address type='drive' controller='0' bus='0' target='0' unit='1'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/media/big-tank-8TB/OSISOS/Windows/virtio-win-0.1.160.iso'/>
      <backingStore/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
      <alias name='ide0-1-0'/>
      <address type='drive' controller='0' bus='1' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <alias name='usb'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <alias name='usb'/>
      <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'>
      <alias name='usb'/>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x1'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <alias name='usb'/>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'>
      <alias name='pci.0'/>
    </controller>
    <controller type='ide' index='0'>
      <alias name='ide'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <controller type='virtio-serial' index='0'>
      <alias name='virtio-serial0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:36:1d:c4'/>
      <source bridge='virbr0'/>
      <target dev='vnet0'/>
      <model type='rtl8139'/>
      <alias name='net0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <source path='/dev/pts/4'/>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
      <alias name='serial0'/>
    </serial>
    <console type='pty' tty='/dev/pts/4'>
      <source path='/dev/pts/4'/>
      <target type='serial' port='0'/>
      <alias name='serial0'/>
    </console>
    <channel type='spicevmc'>
      <target type='virtio' name='com.redhat.spice.0' state='disconnected'/>
      <alias name='channel0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
    <input type='tablet' bus='usb'>
      <alias name='input0'/>
      <address type='usb' bus='0' port='1'/>
    </input>
    <input type='mouse' bus='ps2'>
      <alias name='input1'/>
    </input>
    <input type='keyboard' bus='ps2'>
      <alias name='input2'/>
    </input>
    <sound model='ich6'>
      <alias name='sound0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </sound>
    <video>
      <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
      <alias name='video0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <hostdev mode='subsystem' type='usb' managed='no'>
      <source>
        <vendor id='0x046d'/>
        <product id='0xc33b'/>
        <address bus='5' device='3'/>
      </source>
      <alias name='hostdev0'/>
      <address type='usb' bus='0' port='4'/>
    </hostdev>
    <hostdev mode='subsystem' type='usb' managed='no'>
      <source>
        <vendor id='0x046d'/>
        <product id='0xc52b'/>
        <address bus='5' device='4'/>
      </source>
      <alias name='hostdev1'/>
      <address type='usb' bus='0' port='5'/>
    </hostdev>
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <driver name='vfio'/>
      <source>
        <address domain='0x0000' bus='0x43' slot='0x00' function='0x0'/>
      </source>
      <alias name='hostdev2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </hostdev>
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <driver name='vfio'/>
      <source>
        <address domain='0x0000' bus='0x43' slot='0x00' function='0x1'/>
      </source>
      <alias name='hostdev3'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
    </hostdev>
    <redirdev bus='usb' type='spicevmc'>
      <alias name='redir0'/>
      <address type='usb' bus='0' port='2'/>
    </redirdev>
    <redirdev bus='usb' type='spicevmc'>
      <alias name='redir1'/>
      <address type='usb' bus='0' port='3'/>
    </redirdev>
    <memballoon model='virtio'>
      <alias name='balloon0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
    </memballoon>
  </devices>
  <seclabel type='dynamic' model='apparmor' relabel='yes'>
    <label>libvirt-43e052b3-b3da-4025-92d8-ec7c8ff96ae9</label>
    <imagelabel>libvirt-43e052b3-b3da-4025-92d8-ec7c8ff96ae9</imagelabel>
  </seclabel>
  <seclabel type='dynamic' model='dac' relabel='yes'>
    <label>+64055:+120</label>
    <imagelabel>+64055:+120</imagelabel>
  </seclabel>
</domain>
3
Stonecraft