GNU/Linux >> Tutoriels Linux >  >> Linux

Linux - Activer Iommu dans le noyau pour le passage de carte graphique ?

Question courte :

Comment puis-je activer le intel_iommu paramètre dans le noyau Linux ? J'exécute un hôte Debian, en utilisant le chargeur de démarrage grub2. La documentation que j'ai vue dit de modifier /boot/grub/menu.lst , qui semble être pertinent uniquement pour grub 1.x, car je n'ai pas ce fichier.

Je crois comprendre (et la dernière option à laquelle je peux penser) que la modification de cette option de démarrage pourrait supprimer le message d'erreur suivant dans /var/log/kern.log

vboxpci: No IOMMU domain (attach)

Longue question :

Donnant à un système d'exploitation invité un accès direct à la carte graphique

J'ai récemment réalisé qu'il était possible de passer par un périphérique PCI-express vers un système d'exploitation invité exécuté dans Virtualbox. Cool, j'ai pensé! J'ai deux cartes graphiques NVIDIA Quadro FX (avec une connexion de pont SLI en place, ce qui, j'espère, ne cause pas de chagrin) et j'aimerais dédier la 2ème carte graphique au système d'exploitation invité, afin que je puisse utiliser les fonctionnalités OpenGL dans Photoshop et autres.

NVIDIA commercialise cette configuration "SLI Multi-OS", qui est essentiellement ce que je voulais mettre en place depuis des lustres, mais je ne veux pas dépenser plus d'un grand sur le logiciel de virtualisation (Parallels Workstation Extreme), quand j'ai été utiliser VirtualBox avec plaisir depuis des années maintenant.

Système hôte

J'utilise linux-3.5.0-19 à partir des référentiels Debian, sur un équipement de station de travail assez haut de gamme (Asus P6T7 WS Supercomputer mobo avec chipset Intel ICH10R et processeur Xeon W3680) et j'aimerais activer le support IOMMU dans le noyau , de préférence sans avoir à le compiler moi-même.

BIOS

Dans les paramètres du BIOS, j'ai activé le support VT-x et VT-d. Cependant, je n'ai rien vu qui mentionne spécifiquement IOMMU.

Connecter le périphérique PCI

C'était agréablement étonnamment simple! La documentation officielle de VirtualBox est ici. Ce que j'ai fait, que j'ai trouvé moins ambigu, c'est d'ouvrir nvidia-settings , sélectionnez la carte graphique secondaire et notez l'ID du bus ("PCI:5:0:0" dans mon cas). Ensuite, à partir de la ligne de commande de l'hôte :-

VBoxManage modifyvm "Windows Guest" --pciattach 05:00.0

(Lorsque j'ai exécuté ceci pour la première fois, une erreur s'est produite car VirtualBox émulait un chipset PIIX. Il indiquait que le pass-through PCI ne fonctionnait qu'avec les chipsets ICH9. J'ai donc changé le chipset en ICH9 dans les paramètres du système VirtualBox VM et activé l'invité pour installer les nouveaux pilotes nécessaires. Un redémarrage plus tard et tout fonctionnait correctement, j'ai donc arrêté l'invité et réexécuté la commande.)

Il n'y a eu aucune sortie et j'ai été renvoyé à la ligne de commande presque immédiatement.

Utilisation du GPU hôte de l'invité

Avant d'activer l'invité, j'ai d'abord redémarré la machine hôte, au cas où quelque chose de non documenté devait se produire dans le noyau, par virtualbox-dkms. Comme j'ai exécuté la commande précédente sans sudo privilèges, je doute cependant que des modifications aient été apportées.

Lorsque j'ai ensuite démarré l'invité, Windows Update a commencé à faire son travail et a automatiquement détecté et installé les bons pilotes NVIDIA. Tout semble bon jusqu'à présent. Avant de pouvoir utiliser l'appareil, j'ai dû redémarrer l'invité…

Problème

Maintenant que les pilotes de la carte graphique sont installés sur l'invité et le périphérique PCI connecté, je ne peux pas accéder au bureau Windows. J'arrive à l'écran de connexion Windows, puis après la connexion, l'écran se fige, disant simplement "Bienvenue", avec un cercle bleu qui devrait tourner mais qui n'est pas à côté.

En relation :Linux – Comment Linux décide-t-il d'une application par défaut ?

Dans /var/log/kern.log , les derniers messages imprimés sont :-

vboxpci: vboxPciOsDevInit: dev=500
vboxpci: detected device: 10de:05ff at 05:00.0, driver pci-stub
vboxpci: vboxPciOsDevInit: dev=500 pdev=ffff88061bea0000
pci-stub 0000:05:00.0: irq 76 for MSI/MSI-X
vboxpci: enabled MSI
500: linux vboxPciOsDevGetRegionInfo: reg=0
got mmio region: fa000000:16777216
500: linux vboxPciOsDevGetRegionInfo: reg=1
got mmio region: d0000000:268435456
500: linux vboxPciOsDevGetRegionInfo: reg=3
got mmio region: f8000000:33554432
500: linux vboxPciOsDevGetRegionInfo: reg=5
got pio region: 8c00:128
500: linux vboxPciOsDevGetRegionInfo: reg=6
got mmio region: fb980000:524288
got PCI IRQ: 76
device eth0 entered promiscuous mode
power state: 0
vboxpci: No IOMMU domain (attach)

Une idée de comment résoudre ce problème ?

MISE À JOUR :

J'ai le noyau qui démarre maintenant avec intel_iommu=on , mais les choses ne fonctionnent toujours pas complètement. Après le redémarrage de l'hôte, l'invité démarre, se connecte correctement et tout semble tel qu'il était avant de commencer quoi que ce soit. Ma 2ème carte graphique ne produit rien.

Dans le Gestionnaire de périphériques, il y a un point d'exclamation à côté de l'appareil Quadro FX, et il y a un code d'erreur de 12 dans les propriétés de l'appareil, avec un message disant "Cet appareil ne trouve pas assez de ressources libres". Plus de description sur technet.microsoft.com.

Dans le journal du noyau hôte, cela semble prometteur :-

vboxpci: detected device: 10de:05ff at 05:00.0, driver pci-stub
vboxpci: vboxPciOsDevInit: dev=500 pdev=ffff88061baa0000
pci-stub 0000:05:00.0: irq 76 for MSI/MSI-X
vboxpci: enabled MSI
500: linux vboxPciOsDevGetRegionInfo: reg=0
got mmio region: fa000000:16777216
500: linux vboxPciOsDevGetRegionInfo: reg=1
got mmio region: d0000000:268435456
500: linux vboxPciOsDevGetRegionInfo: reg=3
got mmio region: f8000000:33554432
500: linux vboxPciOsDevGetRegionInfo: reg=5
got pio region: 8c00:128
500: linux vboxPciOsDevGetRegionInfo: reg=6
got mmio region: fb980000:524288
got PCI IRQ: 76
created IOMMU domain ffff88058377c9a0
device eth0 entered promiscuous mode
power state: 0
vboxpci: iommu_attach_device() success

Si je démarre une deuxième fois l'OS invité, sans redémarrer l'hôte, l'affichage se fige à nouveau à l'étape "Bienvenue". Cela termine définitivement l'étape de connexion, car je pourrais utiliser des raccourcis Windows pour éteindre la machine sans forcer un arrêt..

Maintenant, je suis un peu à court d'idées… Des suggestions pour que cela fonctionne ? Plus d'informations que je peux fournir ?

MISE À JOUR 2 :

dmesg contient des erreurs plus intéressantes, mais je ne sais pas ce que je peux y faire :

IOMMU 0 0xfbfff000: using Queued invalidation
IOMMU 1 0xfbffe000: using Queued invalidation
------------[ cut here ]------------
WARNING: at /build/buildd/linux-3.5.0/drivers/iommu/intel-iommu.c:4254 init_dmars+0x39b/0x74f()
Hardware name: System Product Name

Your BIOS is broken; DMA routed to ISOCH DMAR unit but no TLB space.

BIOS vendor: American Megatrends Inc.; Ver: 0811   ; Product Version: System Version
...
Your BIOS is broken; RMRR ends before it starts!

Réponse acceptée :

J'ai un relais VGA fonctionnant avec une NVIDIA GTX 760 utilisant KVM comme hyperviseur avec vfio-vga; Je n'ai jamais essayé avec Virtualbox. C'était une douleur, mais fonctionne bien après avoir obtenu la bonne configuration. KVM est tout aussi pratique que Virtualbox pour les machines virtuelles rapides à partir de votre bureau et vous pouvez le considérer comme une autre option.

Ce fil contient des tonnes d'informations sur de nombreuses configurations et étapes de dépannage différentes, et a été très utile :https://bbs.archlinux.org/viewtopic.php?id=162768


Linux
  1. Linux - Participer à la liste de diffusion du noyau ?

  2. Noyau Linux pour Nintendo Wii ?

  3. Kali sur le sous-système Windows pour Linux

  4. Kali Linux pour le PDA Gemini

  5. Quelle est l'interface pour les appels système ARM et où est-elle définie dans le noyau Linux ?

Comment le noyau Linux gère les interruptions

Comment vérifier la version du noyau sous Linux

GalliumOS :la distribution Linux pour les Chromebooks

Travailler avec le noyau en temps réel pour Red Hat Enterprise Linux

Linux - Trouver le pilote Linux pour casque dans l'arborescence du noyau ?

Comment afficher les paramètres de ligne de commande du noyau Linux donnés pour le démarrage en cours ?