it-swarm.com.de

Nvidia GPU-Passthrough schlägt mit Code 43 fehl

Ich versuche gerade, eine nvidia-GPU mit qemu 2.5 und libvirt 1.3.5 an den Windows 10-Gast zu übergeben.

Ich sehe "Fehler 43" auf Nvidia GPU im Geräte-Manager.

Ich hatte versucht, den Hypervisor durch Hinzufügen von "kvm = off" und "hv_vendor_id = 123456780ab" zu verbergen, aber es funktioniert nicht für mich. Ich habe in Google gesucht und die Leute haben das Problem auf diese Weise gelöst.

Und ich habe auch Virtual Machine gesehen: Ja, im Task-Manager.

  1. Habe ich falsch benutzt? Ich kann ein AMD-GPU an Windows-Gast übergeben (AMD prüft nicht die Kvm-Virtualisierung).

  2. Kann ich Nvidia auf andere Weise fälschen?

Meine Systeminformationen:

#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>

qemu Befehl

/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

Freuen Sie sich auf Ihre Hilfe!

5
Sev_Y

Sie müssen eine Kopie der nicht geänderten Videokarte ROM an die VM übergeben.

  • Sie benötigen eine sekundäre GPU, die Sie als primäre dafür verwenden können
    verarbeiten. Sie können keine saubere Kopie des BIOS sichern, ohne die Passthrough-GPU als sekundäre Karte zu haben
  • Legen Sie die zusätzliche Karte in den primären Steckplatz und die beabsichtigte Passthrough-Karte in einen anderen PCI-E-Port ein, und starten Sie das System.
  • Suchen Sie Ihre gewünschte GPU erneut über lspci -v. In meinem Fall hatte es ungefähr die gleiche Adresse.
  • Jetzt können Sie das ROM in eine Datei kopieren:

    # 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
    

    In diesem Fall ist 0000: 05: 00.0 meine PCI-Kartenadresse. Sie brauchen den Bindungsschritt an der Unterseite nicht wirklich, da Sie sowieso neu starten.

  • Sie können die Integrität des ROM -Dumps mit diesem praktischen Dienstprogramm unter https://github.com/awilliam/rom-parser überprüfen. Mein Rom sieht so aus:

    # ./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
    

    Sie sollten sowohl einen EFI als auch einen Nicht-EFI x86 ROM im Speicherauszug haben (ich glaube, die meisten Karten haben beide).

  • Schalten Sie das Gerät aus und setzen Sie die GTX 1070 wieder in den primären Steckplatz.
  • Bearbeiten Sie nach dem Start Ihr VM xml. In dem Abschnitt für Ihre GPU (wenn Sie der GPU bereits die GPU zugewiesen haben), sollte ein Abschnitt vorhanden sein. Fügen Sie eine Anweisung file = 'path/to/dump/here' hinzu. Mein ganzer Abschnitt sieht so aus:

    <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>
    

    Dies bewirkt, dass VM die Karte mit diesem BIOS startet, und nicht mit dem Kernel.

Quelle

Beachten Sie, dass Sie OVMF (EFI) verwenden müssen, da SeaBIOS die Karte ROM nicht ordnungsgemäß verwendet.

5
Andrey

Wenn Sie OVMF oder eine andere UEFI verwenden, sollten Sie dreimal überprüfen, ob Ihre Karte UEFI-fähig ist. Dies gilt insbesondere für Inhalte, die älter als ~ 2014 sind.

Ich hatte den falschen Eindruck, dass meine (GTX 770) war, während es tatsächlich nicht der Fall war (sah die falsche Version von ROM online) und verschwendete fast 2 Tage, um mir die Haare zu reissen. Suchen Sie nach dem UEFI-Support wie auch und suchen Sie nach ROM updates hier .

Ich habe meine Karte geflasht, aber ich denke, Sie können einen UEFI-fähigen ROM als romfile= setzen. Es scheint, dass die ROMs anderer Hersteller ebenfalls funktionieren könnten , wenn Ihre UEFI-Korrektur nicht für Sie bereitstellt.

1