GPU Passthrough sur Proxmox VE
Guide d'utilisation du GPU Passthrough sur Proxmox VE.
Au sommaire :
- 1-Qu'est-ce que le passthrough ?
- 2-Prérequis
- 3-Activer IOMMU
- 4-Intel HD
- 5-AMD R5 240
- 6-AMD RX 6400
1-Qu'est-ce que le passthrough ?
Le passthrough permet aux machines virtuelles d'accéder aux périphériques physiques d'une machine. Cela peut-être :
- Des périphériques USB (clavier, souris, disque dur, clé USB, webcam, etc.)
- Des péripériques SATA (disque dur, SSD)
- Des périphériques PCI (carte graphique, carte RAID, caret réseau, etc.)
- Le circuit graphique d'un processeur (Intel HD)
Les avantages sont multiples :
- La machine virtuelle a un accès direct aux ressources du périphérique et ne passe plus par des pilotes de para-virtualisation comme VirtIO
- Dans le cas d'une carte graphique, le signal vidéo de la machine virtuelle peut être transmis à votre moniteur
- Dans le cas d'une carte réseau, cela vous évite d'acheter un routeur/pare-feu dédié et de l'intégrer dans votre serveur
- Et enfin dans le cas de disques dur/SSD, la machine virtuelle a accès au SMART et les performances sont proche d'un système installé sur du bare metal
Voici un des cas d'usage du passthrough qui est l'un des plus populaires. Dans la vidéo ci-dessous, l'utilisateur connecte sa carte graphique à sa machine virtuelle puis avec l'aide d'un boitier Steam Link, récupère le flux pour le diffuser en streaming sur sa télévision.
Note : cela nécessite que la carte graphique dispose d'un encodeur matériel, ce qui n'est pas toujours le cas.
2-Prérequis
Il vous faut donc :
- Un serveur sous Proxmox VE 7.3-6 (à la date du 05/03/2023)
- Un processeur et un chipset compatible Intel VT-d
- L'instruction Intel-VT-d activé dans les paramètres du BIOS
- Une machine virtuelle sous Windows 11
Pour les besoins de ce tutoriel, j'ai utiliser un Dell Optiplex 7020 SFF qui dispose des instructions Intel-VT-d au niveau du chipset et du processeur.
3-Activer IOMMU
Commencez par activer IOMMU qui est indispensable pour transmettre un périphérique PCI à une machine virtuelle.
Ouvrez le fichier grub.
nano /etc/default/grub
Et ajoutez la ligne "quiet intel_iommu=on" pour activer les fonctionnalités iommu (Input–output memory management unit).
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
Puis mettez à jour le grub.
update-grub
4-Intel HD
Ce tutoriel fonctionne uniquement pour les distributions Linux, pas pour Windows qui fera l'objet d'un tutoriel lorsque j'aurai trouver la solution.
Fonctionne avec les processeurs Intel Core 1th gen, 2th gen, 3th gen et 4th gen. J'ai pas tester au delà faute de matériel.
Créez une machine virtuelle sous Linux (peu importe la distro), allez dans Hardware et cliquez sur "Add". On va tester Manjaro pour l'exemple.
Ensuite, ajoutez les périphériques n°1 et n°2 :
- Xeon E3-1200 v3 Processor Integrated Graphics Controller : le circuit graphique Intel HD
- Xeon E3-1200 v3/4th Gen Core Processor HD Audio Controller : le périphérique audio du processeur
Tout doit être décoché donc décochez "ROM Bar" et cliquez sur "Add" pour ajouter les deux périphériques.
Ajoutez également le périphérique n°7 qui correspond au contrôleur audio de la carte mère qu'on trouve souvent sur les PC professionnels Lenovo, Dell et HP.
J'ai remarquer que sans l'ajout de ce périphérique, aucun son ne sort et les vidéos saccade.
Enfin, vérifiez bien "Display" est sur "None" pour ne pas perturber l'affichage sur votre moniteur avec le pilote SPICE ou VNC
Cela devrait ressembler à ceci
Allumez votre moniteur et démarrez votre machine virtuelle.
Vous pouvez par exemple avec un simple poste bureautique afficher deux systèmes sur deux écrans si vous avez en plus du circuit graphique Intel HD une carte AMD ou Nvidia. Idéal en temps de sobriété énergétique.
Aucun soucis de fonctionnement avec les distributions bureautiques Linux traditionnelles mais j'ai rencontrer un cas spécifique depuis les dernières mises à jour de PVE.
Avec Batocera (fork de Recalbox), je suis obliger d'opter pour la version 7.0 de i440fx car aucun passthrough avec la 7.1 et la "latest" (j'ai pas encore trouver la méthode adéquate).
Cela vaut uniquement avec le circuit graphique Intel HD, pas avec une carte Nvidia ou AMD.
5-AMD R5 240
Chez AMD, aucune restriction. Le passthrough fonctionne tant avec les cartes grand public que professionnelles.
Ce qui nous évite les désagréments suivants :
- Pas d'erreur 43,
- pas besoin d'isoler la carte par le bios du serveur et PVE,
- Pas besoin d'arguments dans les fichiers configuration pour duper la carte,
On va effectuer un test avec une AMD R5 240, une carte low profile qu'on trouve à 30 euros sur Ebay.
C'est une carte que je vous conseille pour de nombreux raisons :
- Compatible DirectX 12 (11.1), OpenGL 4.6, OpenCL 1.2 et Vulkan 1.2
- Compatible Ubuntu, RHEL, WIndows 7/8/8.1/10/11
- Encore mis à jour (23/6/2022)
- Idéal pour les postes bureautique au format SFF
Je m'en sert pour afficher mes différentes distributions Linux, Windows 11 ainsi que Batocera.
Créez une machine virtuelle sous Linux (peu importe la distro), allez dans Hardware et cliquez sur "Add". On va tester Manjaro pour l'exemple.
Dans les paramètres de la machine virtuelle, ajoutez un périphérique PCI.
Choisissez votre carte graphique (0000:01:00.0 pour ma part).
Puis activez toute les options (All functions, ROM Bar, Primary GPU et PCI-Express).
Note : si votre machine virtuelle est configuré sur i440fx, impossible de cocher l'option PCI-Express (disponible uniquement en Q35) qui est INDISPENSABLE pour que le passthrough fonctionne.
Allumez votre moniteur et démarrez votre machine virtuelle. Félicitation! Votre machine virtuelle est enfin prête.
6-AMD RX 6400
Chez AMD, aucune restriction. Le passthrough fonctionne tant avec les cartes grand public que professionnelles mais à la différence du précédent tutoriel sur la R5 240 (voir le lien ci-dessous), la RX 6400 nécessite d'être isolée du système hôte.
La RX 6400 est la dernière carte low profile de chez AMD. Elle se paie le luxe d'être à la fois plus puissante et moins chère que la GTX 1650 de chez Nvidia tout en consommant moins d’énergie et nécessitant seulement un slot, ce qui permet de l'utiliser sur de nombreux postes bureautiques professionnels dont le slot PCIE x16 est situé du côté de l'alimentation, ce qui rend impossible l'utilisation d'une carte graphique low profile 2 slots.
Je l'ai eu en occasion pour 121 euros (159 euros en neuf fdp compris) donc autant dire que j'ai sauter sur "l'occasion" (elle était facile).
Voici ses caractéristiques :
- 4 Go de mémoire vidéo GDDR6
- Architecture RDNA2 (comme sur PS5 et XSX)
- Port PCIE 4.0
- Gravure en 6 nm
- TDP de 50 watts sur 1 slot
- Résolution d'affichage maximale en 8K
Elle dispose d'un excellent rapport qualité/prix/performance et permet de jouer dans de bonnes conditions mais aussi de travailler sur des logiciels de CAO et tout ce qui touche à l'imagerie 3D.
Le gros point noir c'est quelle ne dispose pas d'un encodeur matériel donc impossible de streamer ses jeux via Steam ou Parsec sur d'autres périphériques.
Voici un florilège de quelques vidéos au sujet de cette carte. La première est particulièrement élogieuse à son sujet.
6.1-Mettre le pilote sur liste noire
Tapez la commande "lspci -v" et allez vers le péripérique AMD. Dans "Kernel modules", il est indiqué "amdgpu".
Créez un fichier "blacklist.conf".
nano /etc/modprobe.d/blacklist.conf
il va falloir mettre sur liste noire le pilote du périphérique dans le fichier "blacklist.conf" en tapant la ligne suivante.
blacklist amdgpu
6.2-Activer VFIO
Il va falloir ajouter de nouvelles fonctionnalités au noyau. Ouvrez le fichier "modules".
nano /etc/modules
Et indiquez les modules suivants pour activer VFIO (Virtual Function I/O).
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
Ces modules seront chargés par le noyau Linux au démarrage de PVE.
puis pour finir, il va falloir ajouter le périphérique à VFIO.
Tapez la commande "lspci" et retrouvez votre périphérique (03:00 pour ma part).
lspci
Affichez l'identifiant (Vendor's ID) du périphérique 03:00.
lspci -n -s 03:00
récupérez les identifiants et faites une commande "echo" pour ajouter cette ligne au fichier "vfio.conf".
echo "options vfio-pci ids=1002:743f,1002:ab28 disable_vga=1"> /etc/modprobe.d/vfio.conf
Mettez à jour le système de fichiers initial en mémoire ram (intramfs) pour que les modifications soient prises en compte.
update-initramfs -u
Redémarrez le serveur.
reboot
Félicitation!!!! Vous êtes fin prêt à passez au niveau suivant.
6.3-Configuration de Windows 11
À titre d'exemple, voici la configuration de ma machine virtuelle Windows 11 lorsque je prépare l'installation du système. Pas de périphériques USB ou PCI en passthrough pour le moment.
Suivez les tutoriels vus plus haut sans JAMAIS ajouté la carte graphique comme périphérique PCI sous peine d'obtenir un magnifique écran bleu de la mort (BSOD ou Blue Screen of Death).
C'est lorsque vous aurez finis l'installation qu'il faudra éteindre la machine virtuelle, ajouter la carte graphique et les périphériques USB (clavier, souris).
Vous pouvez activé la carte graphique soit par :
- Le client NoVNC intégré à à l'interface web de PVE
- Le protocole RDP de Microsoft
Je vous conseille NoVNC mais nous allons voir les deux cas ensemble.
NoVNC
Là où sur les cartes Nvidia il fallait désactiver NoVNC sous peine d'obtenir un code erreur 43, j'ai pas eu à le faire pour la RX 6400 et c'est même la solution la plus facile pour activer le périphérique.
Allez dans "PCI Device".
Puis ajoutez votre carte graphique. Pour ma part, c'est le périphérique 03:00.
Vous cochez tout sauf "Primary GPU".
Vous devriez avoir cette configuration à la fin.
Démarrez votre machine virtuelle et dans gestion des périphériques, vous devriez avoir un code erreur 31 qui indique que Windows n'a pas charger le pilote requis pour ce périphérique.
Au bout de quelques minutes, le pilote s'installe.
Félicitation!!!! La carte graphique devrait s'afficher sur votre moniteur.
RDP
Avec le protocole RDP (voir partie bonus du tutoriel Windows 11), c'est moins la joie car vous allez avoir deux codes erreurs et vous devrez également activer le périphérique manuellement.
Il va falloir allez dans "Display" et mettre sur "none" pour ne pas utiliser VNC par défaut.
Allez dans "PCI Device".
Puis ajoutez votre carte graphique. Pour ma part, c'est le périphérique 03:00. Vous cochez tout sauf "Primary GPU".
Vous devriez avoir cette configuration à la fin.
Démarrez votre machine virtuelle et dans gestion des périphériques, vous devriez avoir un code erreur 43 qui indique un problème (qui n'en est pas un).
Au bout de quelques minutes, le pilote s'installe.
Et vous allez avoir un message qui va vous demander de redémarrer (just do it).
Après le redémarrage, vous allez avoir un nouveau code erreur, cette fois-ci le code erreur 22 qui indique que le périphérique est désactivé.
Cliquez sur "Enable Device" puis sur "Next" pour activer le périphérique.
Et enfin sur "Finish" pour finaliser.
Félicitation!!!! La carte graphique devrait s'afficher sur votre moniteur.
Sources :