web-dev-qa-db-fra.com

Nvidia GPU passthrough échec avec le code 43

J'essaie actuellement de passer un GPU nvidia à un invité Windows 10 à l'aide de qemu 2.5 et de libvirt 1.3.5.

Je vois "Erreur 43" sur le GPU Nvidia dans le Gestionnaire de périphériques.

J'avais essayé de cacher l'hyperviseur en ajoutant "kvm = off" et "hv_vendor_id = 123456780ab", mais cela ne fonctionne pas pour moi. J'ai cherché dans google et les gens ont résolu le problème de cette façon.

Et j'ai aussi vu la machine virtuelle: oui dans le gestionnaire de tâches.

  1. Est-ce que j'ai mal utilisé? Je peux passer un GPU AMD à l'invité Windows (AMD ne vérifie pas la virtualisation KVM).

  2. Puis-je usurper nvidia d'une autre manière?

Mes informations système:

#uname -a
Linux ns.mqcache.net 4.2.0-1.el7.elrepo.x86_64 #1 SMP Sun Aug 30 21:25:29 EDT 2015 x86_64 x86_64 x86_64 GNU/Linux

#/root/qemu25/qemu/x86_64-softmmu/qemu-system-x86_64 --version
QEMU emulator version 2.5.1.1, Copyright (c) 2003-2008 Fabrice Bellard

GPU:

02:00.0 VGA compatible controller: NVIDIA Corporation GF119 [GeForce GT 620 OEM] (rev a1)
02:00.1 Audio device: NVIDIA Corporation GF119 HDMI Audio Controller (rev a1)

libvirt.xml

<domain xmlns:qemu="http://libvirt.org/schemas/domain/qemu/1.0" type="kvm">  
  <name>win10</name>  
  <os> 
    <type machine="q35">hvm</type>  
    <boot dev="hd"/>  
    <boot dev="cdrom"/> 
  </os>  
  <features> 
    <acpi/>  
    <apic/>  
    <hyperv>
      <vendor_id state='on' value='1234567890ab'/>
    </hyperv>
    <kvm>
      <hidden state='on'/>
    </kvm>
  </features>   
  <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>  
  <vcpu current="4">4</vcpu>  
  <cpu mode="Host-passthrough"> 
    <topology sockets="1" cores="4" threads="1"/> 
  </cpu>  
  <memory>8388608</memory>  
  <currentMemory>8388608</currentMemory>  
  <devices> 
    <emulator>/root/qemu25/qemu/x86_64-softmmu/qemu-system-x86_64</emulator>  
    <disk device="disk" type="file"> 
      <driver name="qemu" type="qcow2"/>  
      <source file="/root/vm/win10/image.qcow2"/>  
      <target bus="virtio" dev="vda"/> 
    </disk>  
    <sound model="ac97"/>  
    <interface type="bridge"> 
      <mac address="fa:16:3e:81:00:03"/>  
      <source bridge="eucabr"/>  
      <model type="virtio"/>  
      <driver name="qemu"/>  
      <alias name="net0"/> 
    </interface>  
    <hostdev mode="subsystem" type="pci" managed="yes"> 
      <source> 
        <address domain="0x0000" bus="0x02" slot="0x00" function="0x1"/>
      </source> 
    </hostdev> 
  </devices>  
  <qemu:commandline> 
    <qemu:arg value="-machine"/>  
    <qemu:arg value="smm=off"/>  
    <qemu:arg value="-device"/>  
    <qemu:arg value="ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1"/>  
    <qemu:arg value="-device"/>  
    <qemu:arg value="vfio-pci,Host=02:00.0,bus=root.1,addr=00.0,multifunction=on,x-vga=on"/>  
    <qemu:arg value="-vga"/>  
    <qemu:arg value="none"/>  
  </qemu:commandline> 
</domain>

commande qemu

/root/qemu25/qemu/x86_64-softmmu/qemu-system-x86_64 \
-name win10 \
-machine q35,accel=kvm,usb=off \
-cpu Host,kvm=off,hv_relaxed,hv_spinlocks=0x1fff,hv_vapic,hv_time,hv_vendor_id=blah \
-m 2048 \
-realtime mlock=off \
-smp 2,sockets=1,cores=2,threads=1 \
-no-user-config \
-nodefaults  \
-rtc base=localtime \
-no-shutdown \
-boot strict=on \
-device i82801b11-bridge,id=pci.1,bus=pcie.0,addr=0x1e \
-device pci-bridge,chassis_nr=2,id=pci.2,bus=pci.1,addr=0x1 \
-drive file=/root/vm/win10/snap.qcow2,if=none,id=drive-virtio-disk0,format=qcow2 \
-device virtio-blk-pci,scsi=off,bus=pci.2,addr=0x2,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 \
-k en-us \
-device virtio-balloon-pci,id=balloon0,bus=pci.2,addr=0x4 \
-machine smm=off \
-device ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1 \
-device vfio-pci,Host=02:00.0,bus=root.1,addr=00.0,multifunction=on,x-vga=on \
-device vfio-pci,Host=02:00.1,bus=root.1,addr=00.1 \
-msg timestamp=on \
-vga none

J'attends votre aide avec impatience!

5
Sev_Y

Vous devez transmettre une copie de la carte vidéo non modifiée ROM à la machine virtuelle.

  • Vous avez besoin d’un GPU secondaire que vous pouvez utiliser comme principal pour cela.
    processus. Vous ne pouvez pas vider une copie vierge du BIOS sans avoir le GPU Intermédiaire comme carte secondaire
  • Placez la carte supplémentaire dans l’emplacement principal et la carte intermédiaire dans un autre port PCI-e et démarrez.
  • Recherchez à nouveau votre processeur graphique souhaité via lspci -v. Dans mon cas, il avait à peu près la même adresse.
  • Vous pouvez maintenant vider le ROM dans un fichier:

    # echo "0000:05:00.0" > /sys/bus/pci/drivers/vfio-pci/unbind
    # cd /sys/bus/pci/devices/0000\:05\:00.0
    # echo 1 > rom 
    # cat rom > /home/username/KVM/evga_gtx970.dump
    # echo 0 > rom
    # echo "0000:05:00.0" > /sys/bus/pci/drivers/vfio-pci/bind
    

    Dans ce cas, 0000: 05: 00.0 est l'adresse de ma carte PCI. Vous n'avez pas vraiment besoin de l'étape de liaison au bas de l'écran car vous allez redémarrer de toute façon.

  • Vous pouvez vérifier l’intégrité du dump ROM avec cet utilitaire pratique à l’adresse https://github.com/awilliam/rom-parser . Mon rom ressemble à:

    # ./rom-parser evga_gtx970.dump
    Valid ROM signature found @0h, PCIR offset 1a0h
            PCIR: type 0 (x86 PC-AT), vendor: 10de, device: 13c2, class: 030000
            PCIR: revision 0, vendor revision: 1
    Valid ROM signature found @f400h, PCIR offset 1ch
            PCIR: type 3 (EFI), vendor: 10de, device: 13c2, class: 030000
            PCIR: revision 3, vendor revision: 0
                    EFI: Signature Valid, Subsystem: Boot, Machine: X64
    Last image
    

    Vous devriez avoir à la fois un EFI et un non-EFI x86 ROM dans le dump (je pense que la plupart des cartes ont les deux)

  • Éteignez la machine et replacez votre GTX 1070 dans le logement principal.
  • Après l’amorçage, éditez votre VM xml et dans la section de votre GPU (si vous avez déjà attribué le GPU à la VM), il devrait y avoir une section. Ajoutez-y une instruction file = 'path/to/dump/here'. Ma section complète ressemble à:

    <hostdev mode='subsystem' type='pci' managed='yes'>
      <source>
        <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
      </source>
      <rom bar='on' file='/home/username/KVM/evga_gtx970.dump'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </hostdev>
    

    La VM démarrera la carte avec ce BIOS au lieu de ce que le noyau lui donne.

la source

Veuillez noter que vous devez utiliser OVMF (EFI) car SeaBIOS n'utilise pas la carte ROM correctement.

5
Andrey

Si vous utilisez OVMF ou un autre UEFI, assurez-vous de vérifier que votre carte est prête pour l'UEFI, en particulier pour les éléments plus anciens que ~ 2014.

J'avais la fausse impression que la mienne l'était (GTX 770), alors qu'en fait ce n'était pas le cas (j'ai regardé la mauvaise version de ROM en ligne) et j'ai perdu presque deux jours à me déchirer les cheveux. Recherchez le support UEFI comme si et recherchez ROM mises à jour ici .

J'ai flashé ma carte, mais je pense que vous pouvez mettre un ROM compatible UEFI sous la forme romfile=. Il semble que les ROM d’autres fabricants pourraient également fonctionner , si le vôtre n’a pas de solution UEFI pour vous.

1