Petite question:
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 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 sudo
privilè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!
CONFIG_CMDLINE_LINUX=intel_iommu=on
pour /etc/default/grub
. Maintenant, l'invité démarre, mais ne détecte pas la carte graphique ...
intel_iommu=soft
ne 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?
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
intel_iommu=igfx_off
...
intel_iommu=soft
. Vous pouvez essayer de passerintel_iommu=on
.