Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3007 connectés 

  FORUM HardWare.fr
  Hardware
  Carte graphique

  PCI passthrough - single nvidia GeForce GTX 970

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

PCI passthrough - single nvidia GeForce GTX 970

n°10942337
rclsilver
Posté le 04-02-2021 à 11:40:21  profilanswer
 

Hello,
 
J'ai un PC que j'utilise comme serveur sur lequel je voudrais dédier une carte graphique nvidia à une machine virtuelle gérée par qemu/kvm. Voici pour commencer la configuration du serveur en question :

  • Intel(R) Core(TM) i5-9600KF CPU @ 3.70GHz (donc pas de chipset graphique interne)
  • 32 Go RAM
  • NVIDIA GeForce GTX 970
  • Debian 10 (buster) avec le kernel 4.19.0-13-amd64
  • libvirt 5.0.0-4+deb10u1
  • qemu 1:3.1+dfsg-8+deb10u8


J'ai activé VT-d dans le BIOS, et activé iommu dans le kernel avec les paramètres suivants :
 

$ cat /proc/cmdline  
BOOT_IMAGE=/system/boot@/vmlinuz-4.19.0-13-amd64 root=ZFS=/system ro root=ZFS=rpool/system net.ifnames=0 biosdevname=0 intel_iommu=on iommu=pt quiet


 
Afin de configurer vfio (et kvm), j'ai déposé le contenu suivant dans un fichier nommé /etc/modprobe.d/gpu-passthrough.conf :

options vfio-pci ids=10de:13c2,10de:0fbb
options vfio-pci disable_vga=1
options kvm ignore_msrs=1
options kvm report_ignored_msrs=0


 
J'ai également modifié le fichier /etc/initramfs-tools/module avec le contenu suivant :

# cat /etc/initramfs-tools/modules
# List of modules that you want to include in your initramfs.
# They will be loaded at boot time in the order below.
#
# Syntax:  module_name [args ...]
#
# You must run update-initramfs(8) to effect this change.
#
# Examples:
#
# raid1
# sd_mod
vfio_pci


 
Après génération du initramfs, mise à jour de la config grub, et après reboot, j'obtiens donc le résultat suivant :
 

02:00.0 VGA compatible controller [0300]: NVIDIA Corporation GM204 [GeForce GTX 970] [10de:13c2] (rev a1)
 Subsystem: Gigabyte Technology Co., Ltd GM204 [GeForce GTX 970] [1458:3670]
 Kernel driver in use: vfio-pci
 Kernel modules: nouveau
02:00.1 Audio device [0403]: NVIDIA Corporation GM204 High Definition Audio Controller [10de:0fbb] (rev a1)
 Subsystem: Gigabyte Technology Co., Ltd GM204 High Definition Audio Controller [1458:3670]
 Kernel driver in use: vfio-pci
 Kernel modules: snd_hda_intel


 
La carte est bien gérée par le driver vfio-pci, plus d'affichage à l'écran, tout semble prêt pour la suite.
 
Je modifie donc ma VM existante pour utiliser la carte graphique, voici le XML libvirt :

<domain type='kvm'>
  <name>windows</name>
  <uuid>7ea5af47-aee4-4b43-8996-e1c43cdb7947</uuid>
  <metadata>
    <libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
      <libosinfo:os id="http://microsoft.com/win/7"/>
    </libosinfo:libosinfo>
  </metadata>
  <memory unit='KiB'>8388608</memory>
  <currentMemory unit='KiB'>8388608</currentMemory>
  <vcpu placement='static' current='1'>4</vcpu>
  <os>
    <type arch='x86_64' machine='pc-q35-3.1'>hvm</type>
  </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'/>
    <ioapic driver='kvm'/>
  </features>
  <cpu mode='host-model' check='partial'>
    <model fallback='allow'/>
    <topology sockets='1' cores='1' threads='4'/>
  </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='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/windows-disk1.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <boot order='1'/>
      <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/var/lib/libvirt/images/ubuntu-20.04.1-desktop-amd64.iso'/>
      <target dev='sdb' bus='sata'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='1'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/var/lib/libvirt/images/virtio-win.iso'/>
      <target dev='sdc' bus='sata'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='2'/>
    </disk>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x1d' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x1d' function='0x0' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x1d' function='0x1'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x1d' function='0x2'/>
    </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-to-pci-bridge'>
      <model name='pcie-pci-bridge'/>
      <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
    </controller>
    <controller type='pci' index='6' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='6' port='0x14'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x4'/>
    </controller>
    <controller type='pci' index='7' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='7' port='0x15'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x5'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:8c:7e:de'/>
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
    </interface>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <source>
        <address domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
      </source>
      <address type='pci' domain='0x0000' bus='0x06' slot='0x00' function='0x0'/>
    </hostdev>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
    </memballoon>
  </devices>
</domain>


 
Après démarrage de la VM, l'écran s'efface puis écran noir, et ça dans les logs dmesg :

[87836.849258] audit: type=1400 audit(1612434373.367:14): apparmor="STATUS" operation="profile_load" profile="unconfined" name="libvirt-7ea5af47-aee4-4b43-8996-e1c43cdb7947" pid=10775 comm="apparmor_parser"
[87836.938246] audit: type=1400 audit(1612434373.455:15): apparmor="STATUS" operation="profile_replace" profile="unconfined" name="libvirt-7ea5af47-aee4-4b43-8996-e1c43cdb7947" pid=10806 comm="apparmor_parser"
[87837.027135] audit: type=1400 audit(1612434373.543:16): apparmor="STATUS" operation="profile_replace" profile="unconfined" name="libvirt-7ea5af47-aee4-4b43-8996-e1c43cdb7947" pid=10809 comm="apparmor_parser"
[87837.116343] audit: type=1400 audit(1612434373.631:17): apparmor="STATUS" operation="profile_replace" info="same as current profile, skipping" profile="unconfined" name="libvirt-7ea5af47-aee4-4b43-8996-e1c43cdb7947" pid=10812 comm="apparmor_parser"
[87837.488209] br0: port 2(vnet0) entered blocking state
[87837.488214] br0: port 2(vnet0) entered disabled state
[87837.488364] device vnet0 entered promiscuous mode
[87837.489224] br0: port 2(vnet0) entered blocking state
[87837.489228] br0: port 2(vnet0) entered forwarding state
[87837.624267] audit: type=1400 audit(1612434374.138:18): apparmor="STATUS" operation="profile_replace" profile="unconfined" name="libvirt-7ea5af47-aee4-4b43-8996-e1c43cdb7947" pid=10825 comm="apparmor_parser"
[87846.797611] vfio_ecap_init: 0000:02:00.0 hiding ecap 0x1e@0x258
[87846.797634] vfio_ecap_init: 0000:02:00.0 hiding ecap 0x19@0x900
[87849.373556] vfio-pci 0000:02:00.0: No more image in the PCI ROM
[87849.373601] vfio-pci 0000:02:00.0: No more image in the PCI ROM


 
En cherchant "No more image in the PCI ROM" sur internet, je me rends compte qu'il faut utiliser une ROM alternative pour la carte graphique. J'ai deux solutions qui semblent équivalentes :

  • Flash la ROM de la carte graphique
  • Indiquer à qemu d'utiliser une autre ROM pour ma carte


Je choisi bien entendu la deuxième solution qui me semble moins risquée ! Pour cela, voici ma procédure :
1) Téléchargement de nvflash_5.660_linux
 
2) Dump de la ROM actuelle de ma carte avec la commande  

# ./nvflash --save original.rom
NVIDIA Firmware Update Utility (Version 5.660.0)
Copyright (C) 1993-2020, NVIDIA Corporation. All rights reserved.
 
 
Adapter: GeForce GTX 970      (10DE,13C2,1458,3670) H:--:NRM  S:00,B:02,D:00,F:00
 
 
EEPROM ID (C8,4012) : GD GD25Q20 2.7-3.6V 2048Kx1S, page
 
Build GUID            : Blank
IFR Subsystem ID      : 1458-3670
Subsystem Vendor ID   : 0x1458
Subsystem ID          : 0x3670
Version               : 84.04.2F.00.AD
Image Hash            : C5ECE19EC1AABBFAD6D0051FB16876A7
Hierarchy ID          : Normal Board
Build Date            : 10/22/14
Modification Date     : 11/05/14
UEFI Version          : 0x20007
UEFI Variant ID       : 0x0000000000000006 ( GM2xx )
UEFI Signer(s)        : Microsoft Corporation UEFI CA 2011
XUSB-FW Version ID    : N/A
XUSB-FW Build Time    : N/A
InfoROM Version       : N/A
InfoROM Backup        : Not Present
License Placeholder   : Not Present
GPU Mode              : N/A
 
Saving of image completed.


 
3) Je dois ensuite modifier cette ROM pour la rendre compatible avec mon besoin. Pour cela, j'ai utilisé https://github.com/Marvo2011/NVIDIA-vBIOS-VFIO-Patcher pour éditer la ROM :  

# python nvidia_vbios_vfio_patcher.py -i ../original.rom -o /usr/share/vgabios/patched.rom
Opening the ROM file...
Scanning for ROM offsets...
ROM footer for GTX XXX (400 - 900 Series) found!
Offsets found!
Running sanity checks...
No problems found.
 
USE THIS SOFTWARE AT YOUR OWN DISCRETION. THIS SOFTWARE HAS *NOT* BEEN
EXTENSIVELY TESTED AND MAY NOT WORK WITH YOUR GRAPHICS CARD.
 
If you want to save the created vBIOS file, type the following phrase
EXACTLY as it is written below:
 
I agree to be careful
 
Type here: I agree to be careful
Writing the edited ROM...
Done!


 
4) J'édite mon fichier XML libvirt pour utiliser cette ROM :

...
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <source>
        <address domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
      </source>
      <rom file='/usr/share/vgabios/patched.rom'/>
      <address type='pci' domain='0x0000' bus='0x06' slot='0x00' function='0x0'/>
    </hostdev>
...


 
Lors du démarrage de la VM, je n'ai plus les erreurs "No more image in the PCI ROM", mais toujours pas d'affichage.
 
Après avoir posé la question à des collègues, il se trouve qu'à une époque, NVIDIA empêchait cette utilisation (le reset n'était pas disponible), et que la seule solution était d'utiliser une autre carte graphique en primaire, afin de pouvoir dédier la NVIDIA à ma VM. J'ai commandé une carte GT 710 (pas encore reçue), pour tester cette hypothèse, mais pour des raison de consommation electrique, j'aurais préféré faire sans.
 
Pourriez-vous me dire si je loupe quelque chose, ou si effectivement, l'information que l'on ma donnée est toujours valable à ce jour ?
 
Merci d'avoir lu jusqu'ici et merci d'avance pour vos retour !

mood
Publicité
Posté le 04-02-2021 à 11:40:21  profilanswer
 

n°10942347
quicksilve​r01
Posté le 04-02-2021 à 11:59:47  profilanswer
 
n°10942411
zoobidoo
Posté le 04-02-2021 à 13:57:45  profilanswer
 

Regarde ici, mais bon courage pour contourner le code 43...
 
https://pve.proxmox.com/wiki/Pci_passthrough


---------------
[Feed-Back] - [VDS Rien] - [VDS 1080TI-CamIP]
n°10942441
rclsilver
Posté le 04-02-2021 à 15:18:42  profilanswer
 

J'avais déjà pas mal tenté tout ce qui était écrit sur cette doc, je pense que c'est bien NVIDIA qui bloque :(

n°10942506
zoobidoo
Posté le 04-02-2021 à 16:55:49  profilanswer
 

Perso j'ai lâché et j'ai mis une Radeon pro pour la vm windows
Trop de problèmes avec les drivers nvidia : en gros dans le meilleur des cas ça passe au boot mais si tu as le malheur de reboot ta vm tu te prends un 43


---------------
[Feed-Back] - [VDS Rien] - [VDS 1080TI-CamIP]
n°10942511
rclsilver
Posté le 04-02-2021 à 17:03:08  profilanswer
 

Ah ouais, c'est ce que je redoutais... Va falloir que je me documente sur les carte graphiques alors... Pour en trouver une pas trop gourmande mais pas trop pourrie non plus... En mode bureautique / conception 3D (fusion 360) et quelques petits jeux mais sans plus

n°10942513
zoobidoo
Posté le 04-02-2021 à 17:08:11  profilanswer
 

j'avais trouvé une radeon wx3100 pro sur la baie autour de 80 balles je crois
mais c'est plutot bureautique mon utilisation...


---------------
[Feed-Back] - [VDS Rien] - [VDS 1080TI-CamIP]
n°10942576
rclsilver
Posté le 04-02-2021 à 18:05:06  profilanswer
 

Je viens de me commander https://www.amazon.fr/gp/product/B08P4Y393V/ du coup.
L'avantage, c'est que lorsque la VM sera éteinte, je pourrais avoir l'affichage original du serveur... Ca peut servir...

n°10945367
rclsilver
Posté le 09-02-2021 à 09:05:46  profilanswer
 

J'ai finialement rendu cette carte et commandé une WX2100.... En espérant que ces problèmes soient réglés!


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Hardware
  Carte graphique

  PCI passthrough - single nvidia GeForce GTX 970

 

Sujets relatifs
Par quoi remplacer une NVIDIA GeForce GTX 260 ?2x16 GO vs 4x8 GO? Dual Rank vs Single Rank ? Daisy Chain vs Topology?
Multi cartes graphiques Nvidia Quadro sans SLI sur Workstation ?Périphérique PCI inconnue et erreur démarrage
B550M DS3H (rev. 1.x) Debit M2 PCI 3.0 4xGtx 1070 qui prend feu
GTX 970 et WQHD ? 
Plus de sujets relatifs à : PCI passthrough - single nvidia GeForce GTX 970


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR