Ceci est une ancienne révision du document !
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é ayant besoin d'exploiter au maximum les capacités du GPU comme le rendu 3D ou le machine learning.
Le GPU et les contrôleurs intégrés à la carte graphique de l'hôte (contrôleur audio, parfois usb et série) seront dédiés à l'usage exclusif de la VM : le système invité les pilote directement.
Pour que cela soit possible, le PCI passthrough doit être supporté matériellement :
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 :
# La commande doit retourner une valeur supérieure à 0 egrep -c '(vmx|svm)' /proc/cpuinfo
Vérifier que l'IOMMU est détecté :
journalctl -b 0 --grep "IOMMU"
On cherche d'abord à déterminer l'ID du GPU et des périphériques associés au même groupe IOMMU.
# 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 ensembles.
... 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 des périphériques correctement déterminés, on peut à présent modifier la configuration de l’hôte afin de forcer le chargement des pilotes VFIO en leiu et place des pilotes initiaux.
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
Ici on peut voir qu'on utilise le pilote propriétaire nvidia.
On met à jour grub via le fichier /etc/default/grub. on inclus les paramètres ci-dessous en fonction de l'architecture dans la variable GRUB_CMDLINE_LINUX_DEFAULT sans écraser les valeurs pré-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
update-grub
Modifier la configuration de modprobe en éditant 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
Redémarrer le système
systemctl reboot
Après redémarrage vérifier les pilotes chargés pour le GPU sur le système hôte
lspci -kd 10de:2786
On doit obtenir un retour de la forme :
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: vfio-pci
Kernel modules: nvidiafb, nouveau, nvidia_drm, nvidia
Dans un premier temps, on essaie de modifier la configuration de modprobe en tentant de charger le pilote vfio au moment où udev charge les pilotes du GPU. C'est la méthode recommandée car ainsi on n’agrandit pas initramfs en y ajoutant des pilotes.
Dans le fichier /etc/modprobe.d/vfio.conf ajouter la directive selon le pilote utilisé :
softdep drm pre: vfio-pci
Pour les pilotes propriétaires nvidia :
softdep nvidia pre: vfio-pci
Pour exemple le fichier après modification :
softdep nvidia pre: vfio-pci options vfio-pci ids=10de:2786,10de:22bc
Si après redémarrage les pilotes vfio ne sont toujours pas chargés pour le GPU, il faudra modifier initramfs.
Ubuntu utilise dracut pour générer/modifier le fichier initramfs. Créer le fichier de configuration /etc/dracut.conf.d/10-vfio.conf avec le contenu suivant :
force_drivers+=" vfio_pci vfio vfio_iommu_type1 "
Mettre à jour initramfs :
update-initramfs -u
systemctl reboot