{ "meta": { "title": "Ajouter un GPU à une VM | Documentation ProxMenux", "description": "Attribuez un GPU physique à une VM Proxmox. ProxMenux vérifie IOMMU, configure VFIO et les périphériques VM et détecte les conflits avec d’autres VM ou LXC." }, "header": { "title": "Ajouter un GPU à une VM (passthrough)", "description": "Détecte les GPU Intel, AMD ou NVIDIA pour l’accès direct depuis une VM. Vérifie IOMMU et les périphériques associés, configure VFIO et la VM et applique ses règles de compatibilité. Vérifiez tous les périphériques concernés.", "section": "Matériel : GPU et Coral-TPU" }, "intro": { "title": "Fonctionnement", "body": "Automatise la configuration hôte et hostpci décrite dans la documentation PCI passthrough Proxmox. Vérifie les attributions aux autres invités et propose de résoudre les conflits. Ne garantit pas toute combinaison GPU, réinitialisation et pilote invité." }, "who": { "heading": "C'est pour qui ?", "body": "Pour qu’une machine virtuelle utilise directement un GPU via VFIO. Tant qu’il est lié à VFIO, le pilote hôte ne peut pas l’utiliser, même VM arrêtée. Pour le partager avec LXC, utilisez Ajouter un GPU à LXC." }, "prereqs": { "title": "Avant de commencer", "gpu": "GPU compatible physiquement installé. Le script détecte Intel, AMD et NVIDIA via lspci.", "gpuCheck": "lspci | grep -iE 'VGA|3D|Display'", "iommu": "Prise en charge IOMMU matérielle et activation dans le micrologiciel si nécessaire (Intel VT-d ou AMD-Vi). Vérifie le système et peut configurer Linux ; ne modifie pas BIOS/UEFI et ne prouve pas qu’un IOMMU inactif y est désactivé.", "q35": "Cet assistant exige q35 et refuse i440fx. Le type de machine est distinct du micrologiciel BIOS/UEFI. Changer le chipset d’une VM existante se planifie et n’est pas automatique.", "q35Check": "qm config VMID | grep machine", "moreGpus": "Prévoyez un autre GPU ou accès alternatif via SSH, IPMI ou série. Réserver le GPU principal peut couper l’affichage local. Pour NVIDIA, une carte hors du groupe IOMMU concerné peut rester sur l’hôte.", "nvidiaInstalled": "Après installation NVIDIA sur l’hôte, les fonctions sélectionnées sont réservées à vfio-pci plutôt qu’à nvidia. Le module nvidia peut rester disponible pour les autres cartes hors du groupe IOMMU concerné. Vérifiez avec nvidia-smi." }, "pickOne": { "title": "Attribution exclusive VM ou partage LXC", "body": "Un GPU lié à vfio-pci pour la transmission VM ne peut pas être utilisé simultanément par l'hôte ou un LXC. Si vous avez deux GPU, vous pouvez en consacrer un à chaque chemin. Si vous n'en avez qu'une, choisissez :", "vmItem": "VM : accès direct et exclusif pour cette VM.", "lxcItem": "LXC (Ajouter un GPU à LXC) : partage le périphérique avec l’hôte et d’autres conteneurs via le pilote natif." }, "running": { "heading": "Exécuter l’installateur", "body": "Ouvrez ProxMenux et choisissez Matériel : GPU et Coral-TPU → Ajouter un GPU à une VM.", "imageAlt": "Option du menu pour ajouter un GPU à une VM" }, "howRuns": { "heading": "Déroulement du script", "body": "Détection et sélection précèdent les changements principaux, confirmés par un résumé final. L’activation IOMMU possède une confirmation préalable et peut déjà modifier le démarrage. Le nettoyage audio ultérieur peut aussi demander un choix." }, "walkthrough": { "heading": "Étapes de la procédure", "detect": { "title": "Détecter les GPU et vérifier IOMMU", "body": "Considère IOMMU comme actif uniquement si le noyau en cours a intel_iommu=on ou amd_iommu=on et que des groupes IOMMU existent. Si le paramètre est déjà enregistré pour le prochain démarrage, il continue en mode redémarrage en attente ; sinon, une étape confirmée séparément peut l’ajouter avec iommu=pt. Son heuristique de fichier d’amorçage utilise /etc/kernel/cmdline lorsqu’un marqueur de racine ZFS comme root=ZFS= s’y trouve ; sinon, elle utilise /etc/default/grub. Cette heuristique ne prouve pas le chargeur d’amorçage réellement utilisé. Un IOMMU nouvellement configuré prend effet après redémarrage ; vérifiez ensuite les groupes réels.", "tipTitle": "Post-installation déjà configurée ?", "tipBody": "Si la prise en charge VFIO IOMMU est configurée et active dans le noyau, le contrôle passe. Un réglage prévu pour le prochain démarrage ne prouve pas son activation actuelle.", "imageAlt": "Liste des GPU détectés avec l'adresse du fournisseur et du PCI" }, "preflight": { "title": "Choisir un GPU et lancer les contrôles préalables", "intro": "Une fois que vous choisissez le GPU, le script exécute une série de vérifications qui peuvent chaque bloquer les progrès suivants:", "items": [ "Contrôle SR-IOV. Refuse VF et PF avec VF actives : cette procédure configure des périphériques complets, pas SR-IOV. Configurez SR-IOV séparément sur du matériel compatible.", "Un seul GPU. La console locale peut perdre son affichage lorsque VFIO le réserve. Vérifiez d’abord l’accès SSH ou web depuis un autre ordinateur.", "Politique de réinitialisation AMD. Lit /sys/bus/pci/devices/<pci>/reset_method. APU ou carte dédiée sans FLR est bloquée par la politique de l’assistant ; un sous-type inconnu sans FLR exige confirmation. Cela ne prouve pas une impossibilité universelle.", "État D3cold. L’assistant bloque les cartes AMD signalant D3cold en raison du risque d’échec d’activation. Vérifiez alimentation et micrologiciel.", "Analyse du groupe IOMMU. Lit /sys/kernel/iommu_groups/ et inclut dans le plan de la VM tous les membres sauf les ponts, éventuellement des contrôleurs réseau ou de stockage. Si le groupe contient des périphériques d’un autre slot, le script les liste avant le résumé ; vérifiez que l’hôte n’en a pas besoin. Si IOMMU attend un redémarrage, les groupes réels ne sont pas disponibles et le plan ne contient initialement que la fonction GPU sélectionnée ; vérifiez l’isolation après le redémarrage." ], "audioIntro": "Audio associé. Deux cas selon l’emplacement du contrôleur :", "audioDgpu": "GPU dédié : l’audio HDMI occupe souvent la fonction .1 du même emplacement PCI et est inclus si détecté. Si l’hôte l’utilisait, il en perd l’accès lors de la réservation à la VM.", "audioIgpu": "Sans fonction audio .1 : l’audio peut être sur un autre périphérique comme 00:1f.3. Liste les contrôleurs et pilotes, par exemple snd_hda_intel. Par défaut aucun n’est sélectionné ; choisissez seulement le nécessaire." }, "pickVm": { "title": "Choisir la VM cible", "body": "Choisissez la VM. Exige q35 et réutilise les entrées GPU existantes si possible. BIOS/UEFI est un réglage distinct, pas un type de machine. Ne change pas automatiquement chipset ou mode de démarrage du système installé.", "imageAlt": "Sélection de VM par nom, ID et état" }, "switchMode": { "title": "Gérer les attributions existantes", "intro": "Le script scanne chaque config VM et chaque config LXC sur l'hôte à la recherche du GPU que vous avez choisi. Trois résultats possibles :", "items": [ "GPU disponible. Continue sans retirer d’attribution.", "Attribué à une autre VM. Arrêtez d’abord la source. Vous pouvez garder ses entrées et désactiver le démarrage automatique ou retirer les entrées en conservant le démarrage automatique. Avec vfio-pci déjà actif et sans changement hôte, le transfert VM→VM peut éviter un redémarrage hôte.", "GPU utilisé par LXC. Pour les conteneurs ordinaires, choisissez garder la configuration GPU et désactiver le démarrage automatique ou retirer la configuration du périphérique GPU en conservant le démarrage automatique. Le retrait supprime les entrées devN et, pour AMD/Intel, aussi les anciennes règles /dev/dri lxc.mount.entry et lxc.cgroup2.devices.allow. Les conteneurs OCI conservent leur configuration et sont arrêtés avec le démarrage automatique désactivé ; retirez leur GPU via OCI manager Apps. La détection des conflits se fait par famille de périphériques GPU et peut inclure d’autres cartes de cette famille." ], "imageAlt": "Boîte de dialogue offrant de supprimer le GPU d'un LXC avant de l'assigner au VM", "smartTitle": "Vérifier l’audio associé au retrait du GPU", "smartBody": "Propose ensuite une liste d’audio potentiellement inutilisé dans la VM source. Décochez ce qui reste nécessaire. Par exemple, peut conserver 02:00.1 et proposer de retirer 00:1f.3. La liste détermine les suppressions supplémentaires, sans garantie universelle d’association audio/affichage." }, "audioPick": { "title": "Sans audio .1, sélectionner les contrôleurs nécessaires", "body": "Pour les GPU dont l’audio est séparé, une liste présente les contrôleurs audio PCI et leurs pilotes, hors groupe IOMMU déjà inclus. Choisissez seulement ceux nécessaires à la VM, ou aucun.", "imageAlt": "Boîte de dialogue de liste de contrôle avec chaque contrôleur audio PCI hôte (BDF + pilote) lorsque le GPU n'a pas d'audio associé .1", "warnTitle": "Ne sélectionnez pas l’audio nécessaire à l’hôte", "warnBody": "Attribuer l’audio peut retirer l’accès à l’hôte ; le contrôleur ne peut pas appartenir à une autre VM active simultanément. Laissez l’audio facultatif non sélectionné si inutile et vérifiez ses attributions. Le bip de console ne vient pas nécessairement du PCI audio." }, "summary": { "title": "Examiner le résumé de la confirmation", "body": "Vérifiez le plan final de l’hôte et de la VM, et annulez s’il est incorrect. Il affiche le groupe IOMMU et son nombre de périphériques ; les membres d’un autre slot sont listés à l’étape précédente. L’annulation empêche les changements principaux, sans annuler une modification de la configuration d’amorçage IOMMU confirmée séparément auparavant.", "imageAlt": "Résumé des modifications prévues sur hôte et VM" }, "hostApply": { "title": "Les changements d'hôte sont appliqués", "intro": "La phase d’application modifie hôte et VM. Le nettoyage audio peut encore demander un choix. Modifications possibles :", "items": [ "/etc/modules — ajoute vfio, vfio_iommu_type1, vfio_pci (plus vfio_virqfd sur les noyaux < 6.2).", "/etc/modprobe.d/vfio.conf — AMD/Intel : options vfio-pci ids=<vendor:device,...> disable_vga=1. NVIDIA : softdep nvidia pre: vfio-pci (_drm/_modeset/_uvm) ; la liaison réelle se fait par BDF. AMD ajoute l’ordre de chargement softdep: vfio-pci → radeon/amdgpu.", "Écrit /etc/modprobe.d/iommu_unsafe_interrupts.conf et kvm.conf avec allow_unsafe_interrupts=1 et ignore_msrs=1. Réglages du script, pas des exigences universelles Windows/macOS ; les interruptions non sûres réduisent la protection du remappage.", "/etc/modprobe.d/blacklist.conf: NVIDIA — nouveau/lbm-nouveau; AMD — radeon + amdgpu; Intel — i915. Ces règles globales au fabricant peuvent toucher d’autres cartes utilisant le même pilote. Le module nvidia est bloqué uniquement via /etc/modprobe.d/proxmenux-nvidia-vfio-blacklist.conf lorsque toutes les NVIDIA de l’hôte sont réservées à VFIO.", "/etc/udev/rules.d/10-proxmenux-vfio-bind.rules + /etc/proxmenux/vfio-bind.bdfs — NVIDIA seulement. Applique ATTR'{'driver_override'}'=\"vfio-pci\" au PCI ADD des BDF enregistrés, y compris les fonctions du groupe IOMMU concerné. Hors de ces groupes, nvidia peut rester actif. La politique BDF ne divise pas les groupes matériels.", "AMD seulement. Tente d’extraire la ROM de /sys/bus/pci/.../rom ou ACPI VFCT vers /usr/share/kvm/vbios_<vendor>_<device>.bin. En cas de réussite, la VM utilise romfile=. Une extraction valide ne garantit pas la réussite de l’initialisation du GPU.", "NVIDIA seulement. Arrête et désactive nvidia-persistenced, nvidia-powerd, nvidia-fabricmanager seulement si toutes les NVIDIA sont réservées à VFIO. En usage mixte, conserve les services et nvidia pour les cartes natives.", "update-initramfs -u -k all — ne fonctionne que si l'un des éléments ci-dessus a réellement changé." ] }, "vmApply": { "title": "La configuration VM est appliquée via qm set", "body": "La configuration VM à /etc/pve/qemu-server/<vmid>.conf est mise à jour via qm set (jamais par sed):", "after1": "Ajoute x-vga=1 pour AMD et NVIDIA, pas Intel. C’est la politique du script, pas la preuve que tous les iGPU Intel manquent de micrologiciel ou que ce réglage bloque toujours.", "after2": "D'autres lignes hostpciN sont jointes si le groupe IOMMU du GPU contient d'autres appareils que vous devez transmettre ensemble." }, "reboot": { "title": "Redémarrer si la modification hôte l’exige", "body": "Suivez le redémarrage demandé si démarrage ou pilotes changent et vérifiez la liaison active avant de lancer la VM. La configuration enregistrée ne prouve pas son activation. VM→VM avec VFIO correct peut éviter de redémarrer l’hôte.", "imageAlt": "Écran sommaire montrant ce qui a été changé, suivi d'une invite de redémarrage" } }, "vendors": { "heading": "Notes par fabricant", "nvidiaHeading": "NVIDIA", "nvidiaBody": "Conserve un ancien contournement Code 43 : hidden=1, ID NV43FIX dans args, kvm=off. Pas une exigence universelle des GeForce actuels : NVIDIA a activé le passthrough Windows avec R465. Le code peut avoir d’autres causes ; vérifiez GPU et pilote.", "nvidiaMultiHeading": "Prise en charge multi-GPU NVIDIA", "nvidiaMultiBody": "Usage mixte NVIDIA par BDF. Enregistre les fonctions vfio-pci par adresse plutôt que seulement par ID vendor:device. Hors des groupes concernés, peut conserver nvidia ; vérifiez avec nvidia-smi. N’isole pas deux cartes du même groupe.", "amdHeading": "AMD", "amdBody": "Certains GPU AMD échouent à se réinitialiser après arrêt VM. L’assistant vérifie les capacités annoncées, pas tous les cycles réels. vendor-reset prend en charge une liste limitée et exige noyau compatible et chargement précoce ; il n’est pas installé. RadeonResetBugFix sous Windows dépend aussi du matériel, sans garantie générale.", "intelHeading": "Intel iGPU", "intelBody": "L’attribution Intel iGPU complète et SR-IOV sont distincts. Cet assistant réserve le périphérique à une VM sans x-vga=1. i915-sriov-dkms exige matériel et noyau pris en charge ; « UHD 630+ » n’est pas une règle de compatibilité. Prévoyez un autre accès hôte." }, "verification": { "heading": "Vérification" }, "troubleshoot": { "heading": "Dépannage", "code43Title": "Code 43 dans Windows (NVIDIA)", "code43Body": "Code 43 ne prouve pas un échec du masquage. Consultez qm config VMID | grep -E \"cpu|args\" avec la vraie VMID, puis hidden=1 et hv_vendor_id=NV43FIX. Vérifiez aussi pilote invité, micrologiciel et attribution. Relancer peut quitter si déjà attribué.", "amdResetTitle": "AMD GPU fonctionne une fois, échoue sur le redémarrage VM", "amdResetBody": "Un échec de réinitialisation est une cause possible. Redémarrer ou couper/rétablir l’alimentation peut aider temporairement. Vérifiez la compatibilité et le chargement précoce de vendor-reset ; softdep amdgpu pre: vendor-reset seul ne garantit pas un chargement avant VFIO. RadeonResetBugFix exige aussi un GPU compatible.", "stuckBootTitle": "VM démarrage bloqué / GPU non détecté", "stuckBootBody": "Consultez l’adresse réelle avec lspci -nnk -s PCI_ADDRESS ; attendez Kernel driver in use: vfio-pci. Remplacez PCI_ADDRESS. Si le pilote natif reste actif, vérifiez la politique de liaison, pas seulement /etc/modprobe.d/blacklist.conf ; NVIDIA utilise les BDF. Lisez dmesg | grep vfio. Après correction, update-initramfs -u -k all puis redémarrage prévu.", "darkTitle": "La console d'hôte devient sombre après le redémarrage et je ne peux pas SSH", "darkBody": "Un écran noir ne prouve pas l’arrêt de l’hôte. Si SSH échoue aussi, vérifiez réseau et contrôleurs inclus dans le groupe IOMMU. Récupérez l’accès via IPMI, série ou environnement de secours ; examinez /etc/pve/qemu-server/<vmid>.conf et annulez seulement les attributions/règles concernées. Ne supprimez pas les autres réglages.", "logTitle": "Vérifiez le journal d'installation", "logBody": "Chaque exécution écrit /tmp/add_gpu_vm.log. Joignez le journal aux demandes d’aide." }, "revert": { "heading": "Annuler manuellement les modifications", "intro": "Arrêtez la VM et retirez seulement ses attributions PCI concernées dans Matériel ou avec l’index explicite ci-dessous. Cela ne rend pas encore le GPU au pilote hôte. Utilisez Changer le mode GPU pour cette transition et vérifiez les invités concernés." }, "related": { "heading": "Voir aussi", "items": [ { "label": "Installer les pilotes NVIDIA (host)", "href": "/docs/hardware/nvidia-host", "tail": " — préparer le pilote des cartes gardées sur l’hôte ; un GPU lié à VFIO ne peut pas l’utiliser simultanément." }, { "label": "Ajouter un GPU à LXC", "href": "/docs/hardware/igpu-acceleration-lxc", "tail": "— modèle alternatif: partager le GPU avec plusieurs conteneurs au lieu de le consacrer à un VM." }, { "label": "Changer le mode GPU (VM ↔ LXC)", "href": "/docs/hardware/switch-gpu-mode", "tail": " — basculer le même GPU entre partage et attribution exclusive." }, { "label": "commandes GPU Passthrough", "href": "/docs/help-info/gpu-commands", "tail": " — lspci, vérification d’IOMMU et référence de qm set hostpci." } ] } }