Faire du Pci Passtrough sous Proxmox

mar 29, 2013   //   by Sheldon   //   Auto Hébergement, Blog, Logiciel, matériel  //  31 Comments

Logo-ProxmoxVE

 

Encore un article sur Proxmox ??
Ben oui, y a matière à faire dessus !

Cette fois je vais parler du Pci Passtrough, "kécécé" ??

Il s'agit de pouvoir utiliser des périphériques physiques (comme des cartes réseaux, graphiques …) dans une machine virtuelle, afin qu'elle bénéficie d'un usage unique aux ressources matériels du composant.
Vous allez avec ça pouvoir créer un routeur/firewall virtuel avec Pfsense ou IpCop, faire une vm dédiée aux calcul GPGPU, faire un NAS avec une carte raid …

Sur le papier ça semble simple, beau, pratique… bref tout ce qu'il faut pour plaire !

Et ben nan, pas chez Proxmox !

Dans la pratique, les options n'existent même pas dans l'interface, vous aurez beau chercher, y a rien… donc perdez pas de temps, et mettons les mains dans le cambouis.

Dans un premier temps il est important de vérifier que votre hardware soit compatible (c'est souvent là que ça bloque !).
(mon serveur hôte étant sous Intel, je vais garder ce constructeur dans mes exemples, mais AMD propose également du matériel compatible ;) )

  • Le CPU: il doit supporter les instructions VT-X, c'est souvent le cas pour les familles de Core2Duo, Core2Quad, Core i5 / i7, les Xeon (à partir des série Exxxx
    attention aux CPU "grand publique" (sauf exceptions) comme les Pentium, Atom, Core i3…  ils ne supportent pas toujours pas ces instructions.
    Pour savoir si votre CPU est compatible, faites une recherche sur le site Intel Ark (http://ark.intel.com/fr).
    Voici la liste des CPU Intel ayant le VT-X : http://ark.intel.com/fr/search/advanced/?s=t&VTX=true

     

     

     

  • La carte mère: oui car pour faire fonctionner notre super carte TV, dans notre super VM, il faut que le chipset de la CM soit compatible lui aussi avec des instructions de virtualisations, chez Intel c'est le VT-d (chez AMD on parlera de gestion d'IOMMU).
    C'est malheureusement beaucoup plus rare que sur les processeurs, il va falloir chercher du coté des cartes mère pour serveurs ou workstations.
    Généralement chez Intel les chipsets compatibles sont de la gamme Q ou X (mais là encore avec des exceptions).

    Voici une liste non exaustive : Q45 / Q65 / Q57 / Q67 / Z77 / X79 / X58 / 5520 / 5500 …
    Pensez à bien vérifier si vous achetez du nouveau matériel !

     

Maintenant que vous être sûr d'avoir le bon matériel (et de l'avoir bien activé dans le bios ;) ), il faut modifier notre Proxmox 2.3 :
(comme je l'avais dit sur HFR, j'ai fais pas mal de modifs avant d'arriver à tout faire fonctionner, j'ai fais une synthèse, de ce qui est nécessaire).

 

On commence par modifier le fichier "default" de Grub :

# nano /etc/default/grub

Puis on modifie la ligne :

 GRUB_CMDLINE_LINUX_DEFAULT="quiet"

en

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"

 

Il faut créer un fichier à l'endroit suivant : 

# nano /etc/modprobe.d/kvm_iommu_map_guest.conf

pour y ajouter :

options kvm allow_unsafe_assigned_interrupts=1

 

# update-grub

REBOOT !!  turbocat 

On vérifie que l'IOMMU est bien géré :

dmesg | grep -e DMAR -e IOMMU

Chez moi ça donne :

root@Willbure:~# dmesg | grep -e DMAR -e IOMMU
ACPI: DMAR 00000000bdaa00f0 00178 (v01    AMI  OEMDMAR 00000001 MSFT 00000097)
Intel-IOMMU: enabled
DMAR: Host address width 36
DMAR: DRHD base: 0x000000fed90000 flags: 0x0
IOMMU fed90000: ver 1:0 cap c9008020e30272 ecap 1000
DMAR: DRHD base: 0x000000fed91000 flags: 0x0
IOMMU fed91000: ver 1:0 cap c0000020630272 ecap 1000
DMAR: DRHD base: 0x000000fed92000 flags: 0x0
IOMMU fed92000: ver 1:0 cap c0000020630272 ecap 1000
DMAR: DRHD base: 0x000000fed93000 flags: 0x1
IOMMU fed93000: ver 1:0 cap c9008020630272 ecap 1000
DMAR: RMRR base: 0x000000000ed000 end: 0x000000000effff
DMAR: RMRR base: 0x000000bdc00000 end: 0x000000bfffffff
DMAR: RMRR base: 0x000000bdaf0000 end: 0x000000bdafffff
DMAR: No ATSR found
IOMMU 0xfed92000: using Register based invalidation
IOMMU 0xfed91000: using Register based invalidation
IOMMU 0xfed90000: using Register based invalidation
IOMMU 0xfed93000: using Register based invalidation
IOMMU: Setting RMRR:
IOMMU: Setting identity map for device 0000:00:1d.0 [0xbdaf0000 - 0xbdb00000]
IOMMU: Setting identity map for device 0000:00:1d.1 [0xbdaf0000 - 0xbdb00000]
IOMMU: Setting identity map for device 0000:00:1d.2 [0xbdaf0000 - 0xbdb00000]
IOMMU: Setting identity map for device 0000:00:1d.7 [0xbdaf0000 - 0xbdb00000]
IOMMU: Setting identity map for device 0000:00:1a.0 [0xbdaf0000 - 0xbdb00000]
IOMMU: Setting identity map for device 0000:00:1a.1 [0xbdaf0000 - 0xbdb00000]
IOMMU: Setting identity map for device 0000:00:1a.2 [0xbdaf0000 - 0xbdb00000]
IOMMU: Setting identity map for device 0000:00:1a.7 [0xbdaf0000 - 0xbdb00000]
IOMMU: Setting identity map for device 0000:00:02.0 [0xbdc00000 - 0xc0000000]
IOMMU: Setting identity map for device 0000:00:02.1 [0xbdc00000 - 0xc0000000]
IOMMU: Setting identity map for device 0000:00:1d.0 [0xed000 - 0xf0000]
IOMMU: Setting identity map for device 0000:00:1d.1 [0xed000 - 0xf0000]
IOMMU: Setting identity map for device 0000:00:1d.2 [0xed000 - 0xf0000]
IOMMU: Setting identity map for device 0000:00:1d.7 [0xed000 - 0xf0000]
IOMMU: Setting identity map for device 0000:00:1a.0 [0xed000 - 0xf0000]
IOMMU: Setting identity map for device 0000:00:1a.1 [0xed000 - 0xf0000]
IOMMU: Setting identity map for device 0000:00:1a.2 [0xed000 - 0xf0000]
IOMMU: Setting identity map for device 0000:00:1a.7 [0xed000 - 0xf0000]
IOMMU: Prepare 0-16MiB unity mapping for LPC
IOMMU: Setting identity map for device 0000:00:1f.0 [0x0 - 0x1000000]
DMAR:[DMA Write] Request device [00:02.0] fault addr fffff000 
DMAR:[fault reason 05] PTE Write access is not set

 

Puis pour être sur un petit : cat /proc/cpuinfo

root@Willbure:~# cat /proc/cpuinfo 
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 23
model name	: Intel(R) Core(TM)2 Quad CPU    Q9400  @ 2.66GHz
stepping	: 10
cpu MHz		: 2003.000
cache size	: 3072 KB
physical id	: 0
siblings	: 4
core id		: 0
cpu cores	: 4
apicid		: 0
initial apicid	: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good aperfmperf pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm dts tpr_shadow vnmi flexpriority
bogomips	: 5332.92
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

 

On retrouve bien dans les flags les instructions : vmx et smx
Mon cpu est donc bien compatible VT-x, et il est bien pris en charge par la distribution. (cool !)

Pour attribuer des ressources physiques à une VM, il faut connaitre son adressage, chose facile à faire grâce à la commande lspci :

root@Willbure:~# lspci
00:00.0 Host bridge: Intel Corporation 4 Series Chipset DRAM Controller (rev 03)
00:02.0 VGA compatible controller: Intel Corporation 4 Series Chipset Integrated Graphics Controller (rev 03)
00:02.1 Display controller: Intel Corporation 4 Series Chipset Integrated Graphics Controller (rev 03)
00:03.0 Communication controller: Intel Corporation 4 Series Chipset HECI Controller (rev 03)
00:03.2 IDE interface: Intel Corporation 4 Series Chipset PT IDER Controller (rev 03)
00:03.3 Serial controller: Intel Corporation 4 Series Chipset Serial KT Controller (rev 03)
00:19.0 Ethernet controller: Intel Corporation 82567LM-3 Gigabit Network Connection (rev 02)
00:1a.0 USB Controller: Intel Corporation 82801JD/DO (ICH10 Family) USB UHCI Controller #4 (rev 02)
00:1a.1 USB Controller: Intel Corporation 82801JD/DO (ICH10 Family) USB UHCI Controller #5 (rev 02)
00:1a.2 USB Controller: Intel Corporation 82801JD/DO (ICH10 Family) USB UHCI Controller #6 (rev 02)
00:1a.7 USB Controller: Intel Corporation 82801JD/DO (ICH10 Family) USB2 EHCI Controller #2 (rev 02)
00:1b.0 Audio device: Intel Corporation 82801JD/DO (ICH10 Family) HD Audio Controller (rev 02)
00:1c.0 PCI bridge: Intel Corporation 82801JD/DO (ICH10 Family) PCI Express Port 1 (rev 02)
00:1d.0 USB Controller: Intel Corporation 82801JD/DO (ICH10 Family) USB UHCI Controller #1 (rev 02)
00:1d.1 USB Controller: Intel Corporation 82801JD/DO (ICH10 Family) USB UHCI Controller #2 (rev 02)
00:1d.2 USB Controller: Intel Corporation 82801JD/DO (ICH10 Family) USB UHCI Controller #3 (rev 02)
00:1d.7 USB Controller: Intel Corporation 82801JD/DO (ICH10 Family) USB2 EHCI Controller #1 (rev 02)
00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev a2)
00:1f.0 ISA bridge: Intel Corporation 82801JDO (ICH10DO) LPC Interface Controller (rev 02)
00:1f.2 SATA controller: Intel Corporation 82801JD/DO (ICH10 Family) SATA AHCI Controller (rev 02)
00:1f.3 SMBus: Intel Corporation 82801JD/DO (ICH10 Family) SMBus Controller (rev 02)
01:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection
02:02.0 Ethernet controller: Intel Corporation 82546EB Gigabit Ethernet Controller (Copper) (rev 01)
02:02.1 Ethernet controller: Intel Corporation 82546EB Gigabit Ethernet Controller (Copper) (rev 01)

Moi je voulais rajouter les cartes Intel 82546EB, les IDs sont donc 02:02.0 et 02:02.1

Je modifie le fichier de conf de ma VM (qui est éteinte pour l'occasion !!) :

# nano /etc/pve/qemu-server/111.conf

ce qui donne chez moi :

boot: c
bootdisk: scsi0
cores: 1
keyboard: fr
memory: 512
name: Pfsense
net0: e1000=A2:93:78:F6:32:BC,bridge=vmbr1
ostype: l26
scsi0: local:111/vm-111-disk-1.qcow2,size=2G
sockets: 1
tablet: 0

Et sous la ligne "cores: 1", je rajoute les commandes "hostpci".

boot: c
bootdisk: scsi0
cores: 1
hostpci0: 02:02.0
hostpci1: 02:02.1
keyboard: fr
memory: 512
name: Pfsense
net0: e1000=A2:93:78:F6:32:BC,bridge=vmbr1
ostype: l26
scsi0: local:111/vm-111-disk-1.qcow2,size=2G
sockets: 1
tablet: 0

y a plus qu'à !

 

pour faire booter ma VM (ou depuis l'interface graphique, c'est au choix !) :

# qm start 111

Et voici un petit screenshot de ma VM, où on voit apparaitre mes deux cartes physiques (les Copper):

 

pci passtrough proxmox

31 Comments

  • Salut,

     

    Super ce tuto. Je cherchais de claire et précis… je vais essayer ce soir…j'espère que ma carte mère permet la gestion d'IOMMU.

     

    A+

    • Tu as quoi comme chipset ?

      Vérifie bien que dans ton bios le VT-D soit activé, et si ça déconne désactive, le Intel TXT (si tu as une carte mère Intel évidemment ;) )
       
      c'est une instruction qui "protège" les accès mémoires. 
      Et ça pose de nombreux soucis avec le pci passtrough (que ce soit sous Proxmox, ESX …)
  • Super ! Merci beaucoups pour ces infos ! Pile poil ce qu'il me manquait!

    Petite remarque, il manque un petit update-grub avant le reboot.

    • ah oui exact !

      merci pour l'oublie ;)
  • Bonjour,

    Quand je verifie mon cpuinfo, je n'ai que smx et je n'ai pas vmx

    Est-ce bloquant ? (Je vérifie avec mon Ubuntu avant de suater le pas avec Proxmox)

    • Il faut l'instruction VMX si tu compte utiliser les machines virtuelles à base de KVM et que tu souhaite utiliser l'accélération matériel (et/ou faire du pci passtrough).

      Aucun problème pour les VMs OpenVZ.

      Quel est le modèle de ton processeur ? peut être que les instructions de virtualisation ne sont pas activées dans ton bios ?

      • Voici mon processeur : http://ark.intel.com/fr/products/53416/

        Il me semble avoir activer les options de virtualisation dans mon BIOS, car je n'arrivais pas à installer Ubuntu en 64bits.

        • 64 bits et virtualisation ne sont pas la meme chose !

          le premier sert à l'adressage du CPU, l'autre à la virtualisation de certaines instructions matérielles.

      • En 64bits sur une VM (petite précision)

        • normalement tu ne devrais pas avoir de problème pour virtualiser des os invités 32 ou 64 bits !

          et cela en Openvz ou en KVM.
           

          • Une question :

            As-t-on besoin de Vt-d pour faire du Pci-passtrough avec OpenVZ ??

      • En faite j'ai revérifier

        jewome62@homeServer:~$ cat /proc/cpuinfo | grep vmx
        flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 popcnt tsc_deadline_timer xsave lahf_lm arat epb xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid
        flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 popcnt tsc_deadline_timer xsave lahf_lm arat epb xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid
        jewome62@homeServer:~$ cat /proc/cpuinfo | grep smx

        J'ai bien vmx mais pas smx

        Après quelques recherches : j'ai vu cela

        vmx: Hardware virtualization: Intel VMX

        smx: Safer mode: TXT (TPM support)

        A mon avis smx n'a rien à voir avec notre virtualisation, tu ne t'ai pas tromper avec svm ? Le module de virtualisation chez AMD ? http://en.wikipedia.org/wiki/X86_virtualization#Processor

        Cela reviendrai à dire vmx OU svm ??

        • justement le TXT pour Trusted Execution Technology (donc pour l'instruction SMX), gère grosso modo la protection de la mémoire, qui est nottamment utilisée lors de la virtualisation.

          le SVM étant comme tu l'indique l'équivalent du VMX pour AMD (et qui donc ne s'appel plus VT-x mais IOMMU). :)

  • Après mon test, cela ne fonctionne pas.

    En effet, il manque un truc : Il ne faut pas seulement l'extension VT-x (virtualisation pour processeur) il faut aussi VT-d (Technologie de virtualisation Intel® VT pour les E/S répartis : en gros virtualisation pour chipset)

    Après quelque recherche, j'ai pas trouvé de processeur disponible à moins de 150€ avec cette option ..
    Bref pour faire passer ma carte PCI pour faire du Wifi depuis un VM, j'oublie et je vais plus m'acheter un point d'acces pour 80€ …

    • c'est effectivement moins cher ^^

      regarde du coté de l'occasion sinon !
      un Core2Duo/Quad et un chipset X45 fera très biebn l'affaire :) (ce que j'ai CF le post "infra" !)

      • Arf, j'ai des contraintes de place qui m'oblige à avoir du Mini-ITX, et pour faire cette solution, je n'ai trouver que la nouvelle génération

        Carte mère avec chipset Q77 (VT-d, 2 LAN , 1 PCI-E, 1 Mini-PCI -> 172€
        Un Proc ( compatible vt-d) 150€ …
        Module Wifi de qualité 45-60€ …

        En gros du 400€ pour faire du PCI-passtougth avec du nouveau materiel …

        Si tu connais du vieux en mini-itx je suis preneur.

        Après un question Virtualisation, je vais faire un NAS dans une VM, tu ferais comment (accès au HDD, RAID, etc)
         

        • Oula une floppé de questions ^^

          - tu ne peux pas faire de pci passtrough en OpenVZ puisqu'il ne s'agit de pas de "vraie" virtualisation, mais d'un containers qui utilise le kernel de ton hote.
          En gros c'est parfait pour tester un petit programme, un site web, de la BDD …
          Tu as de très bonnes perfs, mais tu feras rien d'éxotique (au risque de vautrer tout).

          - Aucun soucis pour installer Ubuntu 64b en OpenVz ou en KVM (testé et approuvé ;) )

          - Faire du VT-d en mini itx, effectivement c'est un challenge, il faut que tu regarde les chipsets serveur ou pour workstation (tu peux oublier la quasi totalité des chipsets grand publique).

          Après sache que tu n'as pas les memes limitation chez AMD que chez Intel, je veux pas risquer de dire des bétises (j'en dit déjà pas mal ^^), mais l'IOMMU d'Amd permet de faire pci passtrough sur plus de chipset "grand publique", faut voir si y a des cartes Mini ITX qui tiennent la route …

          - Pour ta CM, la Intel DQ77KB est à 129,49€ http://www.materiel.net/carte-mere-mini-itx/intel-dq77kb-86982.html

          - faut voir en socket 775 du coté de l'occaz ;)

          - Pour ta dernière question, je ne virtualiserais jamais un NAS, car pour moi les VMs reposent sur le NAS, donc si la VM "NAS" se casse la gue***, toutes les autres vont suivrent.

          Puis tu risquerais de perdre un tout petit peu en perf, là où tu cherche à en gratter le plus possible !

          Un NAS ne demande pas une machine exceptionnel pour un usage domestique, il vaut donc mieux garder une vielle machine pour ça ;) ou regarder du coté un Micro Proliant (petit, pas cher,assez performant pour l'usage, consomme rien !)

          Mais si jamais je devais en faire, je ferais une VM KVM, et du Pci Passrouth, sur la carte raid, pour avoir un accès complet à la gestion de la carte et des disques depuis l'OS du Nas.

          • Salut,

            Alors normalement aucune VM ne dependra du NAS, c'est un NAS por mes fichier et vidéo.

            Les autre VM, c'est pour du dev, pour le Réseau, pour Internet. Mais je vais pas m'amuser à racheter du materiel alors que le mien est neuf, dommage, car j'aimais bien Proxmox.

            Mais bon on va revenir au moins cher, un Ubuntu multi-fonction, j'ai pas interet à me lourder :D

  • Si tu veux t'amuser pourquoi ne pas partir sur du Debian ou Arch ? :)

  • Salut,

    AS-tu essayé de "passthrougher" ta carte graphique ?

    • non, je n’ai pas de carte graphique sur mon serveur, je n’ai donc pas essayé.

      Par contre il faut vérifier ta version de Qemu, le support du vga passtrough a été activé à partir de la version en 1.5 (mais ça reste un support expérimantal).

       

      dis moi ce que cela donne ;)

  • Salut,

    J'ai essayé sous fedora (vt-d activé dans le bios et le noyau, noyau 3.9 et qemu 1.5), windows détecte bien la carte graphique mais avec une erreur "le peripherique ne fonctionne pas correctement" dans le gestionnaire de périphérique. La passthrough de ports ethernet fonctionne bien.

    Sous proxmox (vt-d activé dans le bios et le noyau, noyau 2.6.32-22 et qemu 1.4), la vm windows ne démarre pas "can't reset pci device". Le passthrough de ports ethernet fonctionne bien (meme carte dual port que toi).

  • Salut !

    Tu as eu un problème avec ton site ?

    • Oui un petit soucis de Dns avec Ovh, j’étais en vacances et je ne ‘m’en suis pas rendu compte tout de suite :

      Mais c’est réglé maintenant :)

  • Salut la compagnie, est -ce qu'une carte additionnelle port parallele sur le port pci express peut fonctionner en passtrough sous Proxmox car sous ESXi ça ne fonctionne pas ? Merci :)

    • ça dépend plutôt du chipset de ta CM et de ton CPU, tu as quoi ?

      le passtrough fonctionne déjà avec d’autres périph ?

  • Salut Sheldon :)

    J'ai vu que tu avais mis à jour ton blog avec de nouveaux articles interessants.

    Tu as testé de "passthroughé" 3 périphériques ? (hostpci0, hostpci1 et hostpci2)

    De mon côté, ca ne fonctionne pas. Seulement hostpci0 et hostpci1 sont détectés dans la VM.

    (J'ai une autre question mais dans ton article concernant le bonding)

    • Non même problème que toi, je n'ai que deux pci "host" qui sont reconnus.

      Tu as quoi comme couple chipset + cpu ?

  • Je posterai un message sur le forum de proxmox pour "passthroughé" plusieurs devices :)

    Asrock Z77 Extreme4 + i7 3770

  • J'avais fait ce genre de recherches :pet même constat avec beaucoup de monde, il s'agit peut être d'une limitation !

    Toujours est il qu'on a mis un cluster Proxmox au boulot, je vais avoir plus de temps pour faire des tests :)

Leave a comment