Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| sysadmin:linux:virtualisation:kvm:configurer-gpu-passthrough [2025/12/17 09:44] – supprimée - modification externe (Date inconnue) 127.0.0.1 | sysadmin:linux:virtualisation:kvm:configurer-gpu-passthrough [2025/12/17 09:44] (Version actuelle) – ↷ Liens modifiés en raison d'un déplacement. yoann | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | {{tag> | ||
| + | |||
| + | : | ||
| + | |||
| + | |||
| + | ====== KVM : Activer le GPU passthrough ====== | ||
| + | |||
| + | L' | ||
| + | |||
| + | Le GPU et les contrôleurs intégrés à la carte graphique de l' | ||
| + | |||
| + | < | ||
| + | Dans ce mode de fonctionnement, | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Environnement ===== | ||
| + | |||
| + | * Ubuntu 25.10 (questing) | ||
| + | * Linux 6.17.0-8-generic | ||
| + | * libvirtd (libvirt) 11.6.0 | ||
| + | * AMD AMD Ryzen 7 7800X3D ; 32 GO RAM ; carte-mère Asus TUF GAMING X670E-PLUS WIFI | ||
| + | |||
| + | |||
| + | |||
| + | ===== 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/ | ||
| + | * 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' | ||
| + | |||
| + | 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** : | ||
| + | |||
| + | <code bash> | ||
| + | lscpu | grep " | ||
| + | </ | ||
| + | |||
| + | La commande doit retourner : | ||
| + | |||
| + | < | ||
| + | Virtualisation: | ||
| + | Virtualisation: | ||
| + | </ | ||
| + | |||
| + | Via le fichier **''/ | ||
| + | |||
| + | * 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)). | ||
| + | |||
| + | <code bash> | ||
| + | # La commande doit retourner une valeur supérieure à 0 | ||
| + | egrep -c ' | ||
| + | </ | ||
| + | |||
| + | Vérifier que l' | ||
| + | |||
| + | <code bash> | ||
| + | journalctl -b 0 --grep " | ||
| + | </ | ||
| + | |||
| + | ===== Configuration de l’hôte ===== | ||
| + | |||
| + | ==== Rechercher l'ID matériel et le groupe IOMMU ==== | ||
| + | |||
| + | < | ||
| + | Afin qu'il puisse être correctement assigné à la VM, le périphérique et tous ceux qui partagent le même groupe IOMMU doivent avoir leur pilote remplacé par le pilote VFIO afin qu'il ne soient pas utilisés par l’hôte. | ||
| + | </ | ||
| + | |||
| + | On cherche d' | ||
| + | |||
| + | <code bash> | ||
| + | # Lister les périphérique PCI en affichant leurs IDs (ID Vendor:ID Device) et le groupe IOMMU | ||
| + | lspci -nn -vmm | ||
| + | </ | ||
| + | |||
| + | Dans l' | ||
| + | |||
| + | <file txt [highlight_lines_extra=" | ||
| + | ... | ||
| + | Slot: | ||
| + | Class: | ||
| + | Vendor: NVIDIA Corporation [10de] | ||
| + | Device: AD104 [GeForce RTX 4070] [2786] | ||
| + | SVendor: | ||
| + | SDevice: | ||
| + | Rev: a1 | ||
| + | ProgIf: 00 | ||
| + | IOMMUGroup: | ||
| + | |||
| + | Slot: | ||
| + | Class: | ||
| + | Vendor: NVIDIA Corporation [10de] | ||
| + | Device: AD104 High Definition Audio Controller [22bc] | ||
| + | SVendor: | ||
| + | SDevice: | ||
| + | Rev: a1 | ||
| + | ProgIf: 00 | ||
| + | IOMMUGroup: | ||
| + | ... | ||
| + | </ | ||
| + | |||
| + | |||
| + | Les identifiants des périphériques correctement déterminés, | ||
| + | |||
| + | Affiche les pilotes utilisés par l’hôte avant modification : | ||
| + | |||
| + | <code bash [highlight_lines_extra=" | ||
| + | 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. | ||
| + | |||
| + | ==== Mise à jour du bootloader ==== | ||
| + | |||
| + | On met à jour grub via le fichier ''/ | ||
| + | |||
| + | |||
| + | < | ||
| + | # Mettre à jour la variable sans écraser le contenu existant | ||
| + | GRUB_CMDLINE_LINUX_DEFAULT=" | ||
| + | |||
| + | GRUB_CMDLINE_LINUX_DEFAULT=" | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | Bien renseigner les valeurs des IDs retournés par la commande lspci. | ||
| + | </ | ||
| + | |||
| + | <code bash> | ||
| + | update-grub | ||
| + | </ | ||
| + | |||
| + | ==== Mise à jour de modprobe ==== | ||
| + | |||
| + | Modifier la configuration de modprobe en éditant le fichier ''/ | ||
| + | |||
| + | < | ||
| + | options vfio-pci ids=10de: | ||
| + | </ | ||
| + | |||
| + | Empêcher le chargement des pilotes nvidia en créant le fichier ''/ | ||
| + | |||
| + | < | ||
| + | blacklist nouveau | ||
| + | blacklist nvidia | ||
| + | blacklist nvidia_drm | ||
| + | </ | ||
| + | |||
| + | Redémarrer le système | ||
| + | <code bash> | ||
| + | systemctl reboot | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | Si après redémarrage, | ||
| + | </ | ||
| + | |||
| + | |||
| + | Après redémarrage vérifier les pilotes chargés pour le GPU sur le système hôte | ||
| + | <code bash> | ||
| + | lspci -kd 10de:2786 | ||
| + | </ | ||
| + | |||
| + | On doit obtenir un retour de la forme : | ||
| + | <file conf [highlight_lines_extra=" | ||
| + | 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 | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | Si après redémarrage les pilotes vfio ne sont pas utilisés, confère section [[sysadmin: | ||
| + | </ | ||
| + | |||
| + | ===== Configuration de la VM ===== | ||
| + | |||
| + | : | ||
| + | |||
| + | ===== Dépannage ===== | ||
| + | |||
| + | ==== GPU hôte non isolé ==== | ||
| + | |||
| + | |||
| + | 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 ''/ | ||
| + | |||
| + | < | ||
| + | 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: | ||
| + | </ | ||
| + | |||
| + | Si après redémarrage les pilotes vfio ne sont toujours pas chargés pour le GPU, il faudra modifier initramfs. | ||
| + | |||
| + | === Modification du initramfs via dracut === | ||
| + | |||
| + | Ubuntu utilise dracut pour générer/ | ||
| + | |||
| + | < | ||
| + | force_drivers+=" | ||
| + | </ | ||
| + | |||
| + | Mettre à jour initramfs : | ||
| + | |||
| + | <code bash> | ||
| + | update-initramfs -u | ||
| + | systemctl reboot | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | C'est cette modification qui a fonctionné pour mon système hôte. | ||
| + | </ | ||
| + | |||
| + | ===== Références ===== | ||
| + | |||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||