web-dev-qa-db-fra.com

Lister un gpu Nvidia pour passerelle qemu / kvm

J'essaie d'exécuter Windows sur une machine virtuelle tout en donnant à la VM un accès direct au GPU pour de meilleures performances.

J'ai un GPU intel intégré (je vais utiliser celui-ci pour l'hôte) et un Nvidia GTX980 (je veux celui-ci pour la machine virtuelle). J'utilise Elementary OS 0.3.2 Freya 64 bit.

J'ai suivi this guide mais je suis maintenant bloqué à l'étape 2. Je ne parviens pas à obtenir le gpu Nvidia sur une liste noire.

Pour commencer je fais lspci -nn | grep NVIDIA

Cela se traduit par la sortie suivante

01:00.0 VGA compatible controller [0300]: NVIDIA Corporation Device [10de:13c0] (rev a1)
01:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:0fbb] (rev a1)

Ensuite, j'ai ajouté cette ligne au fichier /etc/initramfs-tools/modules.

pci_stub ids=10de:13c0,10de:0fbb

Et j'ai ensuite rechargé en utilisant update-initramfs -u et ensuite redémarré.

Après le redémarrage, lorsque je lance dmesg | grep pci-stub, je reçois le résultat suivant:

[    2.029626] pci-stub: add 10DE:13C0 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[    2.029630] pci-stub: add 10DE:0FBB sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[    2.029637] pci-stub 0000:01:00.1: claimed by stub

Comme vous pouvez le voir, ni l’audio ni la vidéo ne sont réclamés par stub.

J'ai également essayé d'ajouter cette option directement au fichier grub dans etc/default/grub afin que la ligne GRUB_CMDLINE_LINUX_DEFAULT ressemble à ceci:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on pci-stub.ids=10de:13c0,10de:0fbb"

Mais cela a également eu pour conséquence que la carte Nvidia n'est pas sur la liste noire.

Quelqu'un a une idée de ce qui pourrait causer cela?

4
Mathyn

J'établis également qemu-kvm passthrough, et j'ai eu le même problème que vous. J'utilise ma carte graphique intel intégrée comme gpu principal. J'ai donc ouvert les paramètres nvidia et désactivé les graphiques hybrides. La carte nvidia ne sera donc pas utilisée: (lié à l'image)

Après cela, je n’ai eu aucun problème à relier la carte à vfio-pci.

Il est possible que les modules nvidia vous causent des problèmes lors du démarrage de qemu ou que vous n’ayez pas la possibilité de désactiver les graphiques hybrides. Si tel est le cas, vous pouvez également essayer ce que j'ai également fait et désactiver manuellement les modules nvidia à l'aide d'un script tel que celui-ci du mode console (CTRL + ALT + F1):

#!/bin/bash
Sudo service lightdm stop
Sudo rmmod nvidia_uvm
Sudo rmmod nvidia_drm
Sudo rmmod nvidia_modeset
Sudo rmmod nvidia
Sudo service lightdm start

Cela arrête le gestionnaire d’affichage (dans mon cas lightdm), désactive les modules nvidia dans l’ordre et redémarre ensuite le gestionnaire d’affichage. Assurez-vous de lancer ceci en mode console, car son exécution à partir du bureau interrompra très probablement le script après la première ligne.

Les modules nvidia se rechargeront automatiquement lorsque vous redémarrerez, mais vous pouvez également les recharger manuellement avec:

modprobe nvidia nvidia_modeset nvidia_drm nvidia_uvm

J'espère que cela t'aides.

1
Xanty

Désactivez nvidia/nuveau en utilisant la configuration de grub.

Il est possible de transmettre la directive module_blacklist=<module1>[,<module2>](documentation) au noyau via la ligne de commande grub2. J'ai pu désactiver les pilotes nuveau et nvidia avec l'ajout suivant au GRUB_CMDLINE_LINUX_DEFAULT dans /etc/default/grub (n'oubliez pas d'émettre Sudo update-grub):

module_blacklist=nvidia,nvidia_uvm,nvidia_drm,nvidia_modeset,nouveau

Il est également possible de générer automatiquement des entrées grub avec et sans cette option pour chaque noyau: https://unix.stackexchange.com/questions/24670/choose-at-grub-menu-whether-nvidia-driver -should-be-be-used (première réponse). Mais cela s’est avéré plus lourd que prévu. La configuration de la commande ubuntu est très compliquée. Assurez-vous de faire une sauvegarde avant de bricoler avec elle.

Ceci est particulièrement utile si vous souhaitez utiliser une puissante carte NVIDIA pour jouer sur une machine virtuelle utilisant la technologie VGA Passthrough, tout en ayant la possibilité de l'utiliser pour un apprentissage approfondi, tel que tensorflow. Seul un redémarrage est nécessaire pour basculer entre ces deux.

0
user334287

Vos fichiers audio ont été réclamés par stub

[    2.029637] pci-stub 0000:01:00.1: claimed by stub

La vidéo n'est pas. J'ai le même problème, j'ai mis Nvidia et/ou Nouveau sur la liste noire. J'utilise le serveur Ubuntu 15.10, donc pas exactement la même chose, mais j'ai le même problème. J'ai recherché l'interweb pendant des semaines et rien.

edit Enfin résolu, je l'ai trouvé ici: https://forum.level1techs.com/t/pci-stub-not-claming-secondary-graphics-card/88728

J'ai donc mis les listes Nvidia et Nouveau sur une liste noire, puis redémarré. J'espère que ça aide

éditer à nouveau:

Mes étapes actuelles que j'ai prises pour lier les cartes PCI à pci-stub sur Arch avec le noyau 4.10.1-1.

J'ai édité/etc/default/grub pour qu'il ressemble à ceci: GRUB_CMDLINE_LINUX_DEFAULT = "quiet intel_iommu = on pci-stub.ids = 1002: 6798, 1002: 679a, 1002: aaa0,1106: 3483"

Puis je crée le nouveau fichier de configuration grub

$ Sudo grub-mkconfig -o/boot/grub/grub.cfg

Puis redémarrez.

Dans /etc/mkinitcpio.conf, j’ai ajouté pci-stub aux modules afin qu’il ressemble à: MODULES = "pci-stub"

puis courir

$ Sudo mkinitcpio -P

pour reconstruire toutes vos images initramfs. Puis redémarrez.

Puis cette commande juste pour s'assurer qu'ils ont bien été réclamés par pci-grub

$ dmesg | grep pci-stub

0
Dan
0
tomsk

J'ai rencontré des problèmes semblables à vous (Lubuntu 16.04). Cela est dû au fait que les pilotes/modules lient les périphériques à ceux-ci avant que pci-stub puisse le faire. Vous avez au moins deux options ici:

La première et la plus simple consiste à mettre en liste noire les modules revendiquant le périphérique. Saisissez lspci -knn | grep VGA -A 5 pour afficher tous vos périphériques pci VGA, ainsi que leur numéro et leurs modules de noyau.

 01: 00.0 Contrôleur compatible VGA [0300]: Périphérique NVIDIA Corporation [10de: 128b] (rév. A1) 
 Sous-système: Micro-Star International Co., Ltd. [MSI] Périphérique [1462: 8c93] 
 Pilote de noyau utilisé: nouveau 
 Modules du noyau: nvidiafb, nouveau 
 01: 00.1 Périphérique audio [0403]: Contrôleur audio HDMI/DP NVKIA GK208 [10de: 0e0f ] (rev a1) 
 Sous-système: Micro-Star International Co., Ltd. [MSI] Contrôleur audio HDMI/DP GK208 [1462: 8c93] 
 - 
 02: 00.0 Contrôleur compatible VGA [0300]: NVIDIA Corporation GM204 [GeForce GTX 970] [10de: 13c2] (rév. A1) 
 Sous-système: ZOTAC International (MCO) Ltd. GM204 [GeForce GTX 970] [19da: 1366] 
 Pilote du noyau utilisé: nouveau 
 Modules du noyau: nvidiafb, nouveau 
 02: 00.1 Périphérique audio [0403]: Contrôleur audio haute définition NVIDIA Corporation GM204 [10de: 0fbb] (rév. A1 ) 
 Sous-système: Contrôleur audio haute définition GM204 de ZOTAC International (MCO) Ltd. [19da: 1366] 
 

Vous devez maintenant vérifier quel pilote est utilisé. Par exemple, nouveau a saisi mon périphérique VGA 02: 00.0 que je souhaite utiliser pour ma machine virtuelle. Je l'ai donc ajouté à la liste noire:

Sudo nano /etc/modprobe.d/blacklist.conf blacklist nouveau

et vous avez terminé.

Dans mon cas, cela poserait un problème étant donné que deux nVidia VGA sont installés (01: 00.0 et 02: 00.0) et fonctionnent tous les deux avec le même pilote. Dans mon cas, je ne fais pas de liste noire du pilote.

Je dissocie manuellement nouveau de ma carte VGA 02: 00.0, car je voulais utiliser cette carte pour mon invité VM et le VGA 01: 00.0 pour mon hôte Linux. Grâce à ce guide, j'ai découvert comment faire: https://lwn.net/Articles/143397/

Tapez Sudo tree /sys/bus/pci/drivers/nouveau. Échangez du nouveau avec le module saisi par votre appareil.

Vous devriez recevoir une liste comme celle-ci:

/sys/bus/pci/drivers/nouveau 
 0000: 01: 00.0 -> ../../../../devices/pci0000:00/0000: 00: 03.0/0000: 01: 00.0 
 0000: 02: 00.0 -> ../../../../devices/pci0000:00/0000:00:05.0/0000: 02: 00.0 
 ├── bind 
 ├── module -> ../../../../module/drm
├── new_id 
 ├── remove_id 
 ├── un événement 
 └── dissocier 
 

Nous voyons que le nouveau pilote a des périphériques qui le lient: 0000: 01: 00.0 et 0000: 02: 00.0

Pour dissocier et lier ma carte graphique, je dois d’abord éteindre lightdm.service. Par conséquent, j'ouvre la console en dehors de l'environnement de bureau avec CTRL + ALT + F2 par exemple. Connectez-vous en tant que root et tapez systemctl stop lightdm.service

Maintenant je peux dissocier le module de la carte graphique:

echo -n "0000:02:00.0" > /sys/bus/pci/drivers/nouveau/unbind

et le lier à n'importe quel module que je veux (pci-stub ou vfio-pci). J'ai utilisé vfio-pci.

echo -n "0000:02:00.0" > /sys/bus/pci/drivers/vfio-pci/bind

Après cela, vous pouvez redémarrer votre desktopmanager: systemctl start lightdm.service

Si tout fonctionne, vous devriez trouver votre périphérique lié au module que vous avez spécifié en recherchant à nouveau avec lspci -knn | grep VGA -A 5.

 01: 00.0 Contrôleur compatible VGA [0300]: Périphérique NVIDIA Corporation [10de: 128b] (rév. A1) 
 Sous-système: Micro-Star International Co., Ltd. [MSI] Périphérique [1462: 8c93] 
 Pilote de noyau utilisé: nouveau 
 Modules du noyau: nvidiafb, nouveau 
 01: 00.1 Périphérique audio [0403]: Contrôleur audio HDMI/DP NVKIA GK208 [10de: 0e0f ] (rev a1) 
 Sous-système: Micro-Star International Co., Ltd. [MSI] Contrôleur audio HDMI/DP GK208 [1462: 8c93] 
 - 
 02: 00.0 Contrôleur compatible VGA [0300]: NVIDIA Corporation GM204 [GeForce GTX 970] [10de: 13c2] (rév. A1) 
 Sous-système: ZOTAC International (MCO) Ltd. GM204 [GeForce GTX 970] [19da: 1366] 
 Pilote utilisé: vfio-pci 
 Modules du noyau: nvidiafb, nouveau 
 02: 00.1 Périphérique audio [0403]: Contrôleur audio haute définition GM204 de NVIDIA Corporation [10de: 0fbb] (10 rev a1) 
 Sous-système: contrôleur audio haute définition GM204 de ZOTAC International (MCO) Ltd. [19da: 1366] [.___ _.]

Malheureusement, cette solution de contournement perd son effet après le redémarrage. Pourtant, je n'ai pas trouvé comment le rendre persistant. Peut-être que quelqu'un d'autre peut me donner un indice. Quelque chose comme un script de démarrage serait possible, je suppose. Mais il serait préférable d’être en mesure de lier l’appareil à un module spécifique sans avoir à le dissocier d’abord. Imaginez que je voudrais utiliser le pilote nvidia un jour. Dans ce cas, désolidariser de nouveau serait inutile puisque la carte graphique serait liée au module nvidia.

0
AlexOnLinux