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.
Est-ce que j'ai mal utilisé? Je peux passer un GPU AMD à l'invité Windows (AMD ne vérifie pas la virtualisation KVM).
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!
Vous devez transmettre une copie de la carte vidéo non modifiée ROM à la machine virtuelle.
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)
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.
Veuillez noter que vous devez utiliser OVMF (EFI) car SeaBIOS n'utilise pas la carte ROM correctement.
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.