{{tag>sysadmin virtualisation vm kvm gpu passthrough}}
====== KVM : Activer le GPU passthrough ======
L'usage direct du GPU de l'hôte par la VM (**GPU passthrough**) permet d'obtenir le plus haut niveau de performance exigé par certaines applications s'exécutant sur un système virtualisé comme le rendu 3D ou le machine learning.
Le GPU et les périphériques associés (contrôleurs audio, usb et série) présent sur l' hôte sont dédiés à l'usage exclusif de la VM : le système invité peut alors les piloter directement.
===== Environnement =====
* Ubuntu 25.10 (questing)
* Linux 6.17.0-8-generic
* libvirtd (libvirt) 11.6.0
===== Prérequis =====
Pour que cela soit possible, le PCI passthrough doit être supporté matériellement :
* Côté processeur : avec les fonctionnalité **VT-d** pour Intel ou **AMD-IOV/AMD-Vi** pour AMD ;
* Côté carte mère : le **IOMMU**((**I**nput-**O**utput **M**emory **M**anagement **U**nit)) intégré au chipset permet aux périphériques qui en sont capables (GPU, contrôleur réseau, contrôleur de stockage) d'accéder directement à la mémoire (**D**irect **M**emory **A**ccess ou DMA) sans solliciter le CPU. Il assure également un rôle d'isolation des entrées/sorties et des accès à la mémoire pour éviter qu'une machine virtuelle ne fasse une attaque DMA sur le matériel du serveur physique.
C'est dans le BIOS de l’hôte qu'il faudra activer ces options.
Pour vérifier que les options de virtualisation nécessaires sont présentes sur le CPU de l’hôte :
Via la commande **lscpu** :
lscpu | grep "Virtualisation"
La commande doit retourner :
Virtualisation: VT-x # Intel
Virtualisation: AMD-V # AMD
Via le fichier **''/proc/cpuinfo''** :
* Pour les processeurs Intel la fonctionnalité de vmx doit être listée ;
* Pour les processeurs AMD la fonctionnalité de virtualisation du processeur est désignée **SVM** ((**S**ecure **V**irtual **M**achine)).
# La commande doit retourner une valeur supérieure à 0
egrep -c '(vmx|svm)' /proc/cpuinfo
Le service libvirt doit être actif et l'utilisateur doit appartenir au groupe libvirt :
===== Configuration de l’hôte =====
Déterminer l'ID du GPU et des périphériques associés au même groupe IOMMU.
Tous les périphériques d'un même groupe IOMMU doivent être paramétrés conjointement en accès direct pour obtenir un comportement correct.
# Lister les périphérique PCI en affichant leurs IDs (ID Vendor:ID Device) et le groupe IOMMU
lspci -nn -vmm
Dans l'exemple ci-dessous, un extrait du retour de la commande ''lspci''. La carte graphique ''10de:2786'' et le contrôleur audio ''10de:22bc'' font parti du même groupe IOMMU, ils seront donc paramétrés ensemble en accès direct
...
Slot: 01:00.0
Class: VGA compatible controller [0300]
Vendor: NVIDIA Corporation [10de]
Device: AD104 [GeForce RTX 4070] [2786]
SVendor: Gigabyte Technology Co., Ltd [1458]
SDevice: Device [40ed]
Rev: a1
ProgIf: 00
IOMMUGroup: 13
Slot: 01:00.1
Class: Audio device [0403]
Vendor: NVIDIA Corporation [10de]
Device: AD104 High Definition Audio Controller [22bc]
SVendor: Gigabyte Technology Co., Ltd [1458]
SDevice: Device [40ed]
Rev: a1
ProgIf: 00
IOMMUGroup: 13
...
Les identifiants correctement déterminés, on peut à présent interdire à l’hôte d'utiliser directement le matériel et le lier au pilote VFIO
Affiche les pilotes utilisés par l’hôte avant modification :
lspci -kd 10de:2786
01:00.0 VGA compatible controller: NVIDIA Corporation AD104 [GeForce RTX 4070] (rev a1)
Subsystem: Gigabyte Technology Co., Ltd Device 40ed
Kernel driver in use: nvidia
Kernel modules: nvidiafb, nouveau, nvidia_drm, nvidia
Mettre à jour grub via le fichier ''/etc/default/grub''. Inclure les paramètres en fonction de l'architecture dans la variable ''GRUB_CMDLINE_LINUX_DEFAULT''sans écraser les valeurs existantes.
# Mettre à jour la variable sans écraser le contenu existant
GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on iommu=pt vfio pci.ids=10de:2786,10de:22bc" # Intel
GRUB_CMDLINE_LINUX_DEFAULT="amd_iommu=on iommu=pt vfio-pci.ids=10de:2786,10de:22bc" # AMD
Renseigner les valeurs des IDs par ceux retournés par la commande lspci.
update-grub
systemctl reboot
Éditer le fichier ''/etc/modprobe.d/vfio.conf'', insérer le contenu suivant :
options vfio-pci ids=10de:2786,10de:22bc
Empêcher le chargement des pilotes nvidia en créant le fichier ''/etc/modprobe.d/disable‑nvidia.conf'' avec le contenu suivant
blacklist nouveau
blacklist nvidia
blacklist nvidia_drm
update-initramfs -u
systemctl reboot
Après redémarrage vérifier les pilotes chargés pour le GPU
lspci -kd 10de:2786
===== Configuration de la VM =====
===== Références =====
* https://infotechys.com/gpu-passthrough-on-kvm/
* https://github.com/HarbourHeading/KVM-GPU-Passthrough?tab=readme-ov-file
* https://www.informatiweb.net/tutoriels/informatique/bios/activer-iommu-ou-vt-d-dans-le-bios.html
* https://itsfoss.gitlab.io/blog/how-to-enable-iommu-vt-d-from-the-bios-uefi-firmware-of-your-motherboard/
* https://en.wikipedia.org/wiki/Input%E2%80%93output_memory_management_unit