Activation d'IOMMU dans le noyau pour le passage de carte graphique

16

Petite question:

Comment puis-je activer le intel_iommuparamè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 la modifier /boot/grub/menu.lst, ce qui ne semble pertinent que pour grub 1.x, car je n'ai pas ce fichier.

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

vboxpci: No IOMMU domain (attach)

Longue question:

Donner à un OS 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 pour les OS invités fonctionnant dans Virtualbox. Cool, je pensais! J'ai deux cartes graphiques NVIDIA Quadro FX (avec une connexion de pont SLI en place, ce qui, je l'espère, ne cause pas de problème) et je voudrais dédier la 2ème carte graphique au système d'exploitation invité, afin de pouvoir utiliser les fonctionnalités OpenGL dans Photoshop et al.

NVIDIA commercialise cette configuration " SLI Multi-OS ", qui est fondamentalement ce que je voulais mettre en place depuis des lustres, mais je ne veux pas dépenser plus d'un centime sur le logiciel de virtualisation (station de travail Parallels extreme), quand j'ai été en utilisant VirtualBox très heureusement depuis des années maintenant.

Système hôte

J'exécute linux-3.5.0-19 à partir des référentiels Debian, sur un équipement de poste de travail assez haut de gamme (Asus P6T7 WS Supercomputer mobo w / Intel ICH10R chipset et Xeon W3680 CPU) et je souhaite 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, la prise en charge de VT-x et VT-d est activée. Cependant, je n'ai rien vu mentionner spécifiquement IOMMU.

Connexion du 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, était d'ouvrir nvidia-settings, de sélectionner la carte graphique secondaire et de noter l'ID de 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é cela pour la première fois, il y avait une erreur car VirtualBox émulait un chipset PIIX; il a dit que la transmission PCI ne fonctionne qu'avec les chipsets ICH9. J'ai donc changé le chipset en ICH9 dans les paramètres du système VM VirtualBox et allumé l'invité pour installer les nouveaux pilotes nécessaires. Un redémarrage plus tard et tout fonctionnait bien, j'ai donc arrêté l'invité et relancé 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 sudoprivilèges, je doute que des modifications aient été apportées.

Lorsque j'ai démarré l'invité, Windows Update a commencé à faire son travail et a automatiquement détecté et installé les bons pilotes NVIDIA. Tout va bien 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 que le périphérique PCI est connecté, je ne peux pas accéder au bureau Windows. J'arrive à l'écran de connexion de Windows, puis après la connexion, l'écran se bloque, disant simplement "Bienvenue", avec un cercle bleu qui devrait être tourné mais qui n'est pas à côté.

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 maintenant le noyau qui démarre 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 bien et tout semble être comme avant de commencer tout cela. Ma 2e carte graphique ne produit rien.

Dans le Gestionnaire de périphériques, il y a un point d'exclamation à côté du périphérique Quadro FX, et il y a un code d'erreur de 12 dans les propriétés du périphérique, avec un message disant "Ce périphérique ne peut pas trouver suffisamment de ressources libres". Plus de détails 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 le système d'exploitation invité une deuxième fois, sans redémarrer l'hôte, l'affichage se fige à nouveau à l'étape "Bienvenue". Il termine définitivement l'étape de connexion, car je pouvais utiliser des raccourcis Windows pour arrêter la machine sans forcer un arrêt.

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

MISE À JOUR2:

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

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!
Alex Leach
la source
1
Le paramètre IOMMU doit être actif par défaut sur Debian stable si le matériel le prend en charge. Puisqu'il causait des problèmes et des tonnes d'erreurs dans le journal, j'ai dû le désactiver intel_iommu=soft. Vous pouvez essayer de passer intel_iommu=on.
Marco
1
Cool, vient de trouver le fichier et la ligne où changer cela; Le module de configuration de grub de KDE mis CONFIG_CMDLINE_LINUX=intel_iommu=onpour /etc/default/grub. Maintenant, l'invité démarre, mais ne détecte pas la carte graphique ...
Alex Leach
intel_iommu=softne semble pas être une option de noyau valide, et quand je l'ai utilisée, elle est revenue à intel_iommu=on... De www.kernel.org , vous pouvez en avoir iommu=soft, mais je ne trouve aucune documentation pour cela .. Savez-vous de quoi il s'agit Est-ce que?
Alex Leach
3
Tu as raison, ça l'est iommu=soft. Il désactive le matériel IOMMU (ce qui provoque de nombreuses erreurs DMA sur mon système) et utilise à la place un logiciel IOMMU. Voici un lien vers un ancien fil de discussion: Suggestion d'utiliser iommu = soft pour tous les paquets du noyau
Marco
Merci. Je pourrais peut-être essayer cela au prochain redémarrage. Je pense que tout mon matériel prend en charge IOMMU, cependant, donc je ne sais pas si une émulation logicielle serait une bonne idée. Sur une note connexe, je ne sais pas si mon GPU a une unité DMAR, et si ce serait une bonne idée d'utiliser intel_iommu=igfx_off...
Alex Leach

Réponses:

2

J'ai obtenu le passthrough VGA avec une NVIDIA GTX 760 utilisant KVM comme hyperviseur avec vfio-vga; Je ne l'ai jamais essayé avec Virtualbox. Ce fut 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 différentes et étapes de dépannage, et était vraiment utile: https://bbs.archlinux.org/viewtopic.php?id=162768

Josh
la source
1
CUDA fonctionne-t-il?
Aleksandr Dubinsky
Ce blog prétend maintenant être obsolète et recommande vfio.blogspot.com
Aleksandr Dubinsky
Eh bien, la mise en place d'un qemu KVM + efficace à partir du sol froid pourrait ne pas être aussi rapide.
sitilge
@AleksandrDubinsky, Actuellement pour faire fonctionner CUDA, un noyau Linux spécifique doit être utilisé: superuser.com/a/1392031/109803
Gabriel Fair
0

Si votre pilote Nvidia indique qu'il n'a pas pu trouver suffisamment de ressources gratuites, essayez de désactiver l'adaptateur "VGA standard" émulé dans le Gestionnaire de périphériques. Redémarrez l'invité et vous constaterez que les événements suivants se produisent, dans l'ordre:

1) Votre VM POST / boot se produit sur l'adaptateur VGA émulé. 2) L'adaptateur VGA émulé se vide juste avant d'arriver à l'écran de connexion 3) Le pilote Nvidia se charge et affiche le GPU passthrough, et vous obtenez l'écran de connexion sur la carte Nvidia.

Avec un peu de chance, vous constaterez peut-être que les choses fonctionnent bien à partir de là. C'est plus ou moins exactement ce qui se passe sur ma configuration similaire avec Xen. Veuillez rapporter les résultats. :)

user1842677
la source
0

Il semble que vous ayez deux problèmes distincts. Obtenir un redémarrage pour travailler avec le passage VGA peut être un véritable ours. Dans Xen, le périphérique VGA apparaît souvent comme un périphérique amovible et certaines personnes ont eu plus de chance «d'éjecter» le périphérique avant de redémarrer.

L'erreur de code 12 peut probablement être corrigée en désactivant simplement le périphérique vidéo virtuel dans le gestionnaire de périphériques Windows.

StrongBad
la source
0

Essayez d'en définir un dans /etc/grub:

  • iommu=memmaper
  • iommu=soft
  • vga=normal
  • vesa=0

J'ai un nouveau système AMD 64 bits et j'ai constaté que Linux avait des problèmes avec les paramètres Nvidia et DMA causés par les paramètres iommu dans le BIOS, donc les configurer dans grub l'a corrigé pour moi.

Lisez ceci pour plus de détails .

Steve LinuxBlue
la source
-1

testé sur HP dc7900 pour voir le message "IOMMU trouvé":

désactiver la vidéo intégrée

iommu=calgary intel_iommu=on intel_iommu=igfx_off
backtolinux
la source