web-dev-qa-db-de.com

Setzen Sie eine Nvidia-GPU für QEMU / KVM-Passthrough auf die schwarze Liste

Ich versuche, Windows auf einer virtuellen Maschine auszuführen, während die VM für eine bessere Leistung direkt an die GPU weitergeleitet wird.

Ich habe eine integrierte Intel-GPU (ich werde diese für den Host verwenden) und eine Nvidia GTX980 (ich möchte diese für die VM). Ich benutze Elementary OS 0.3.2 Freya 64 Bit.

Ich habe diese Anleitung befolgt, stecke aber jetzt bei Schritt 2 fest. Ich kann nicht dafür sorgen, dass die Nvidia-GPU auf die schwarze Liste gesetzt wird.

Zu Beginn mache ich lspci -nn | grep NVIDIA

Daraus ergibt sich die folgende Ausgabe

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)

Als nächstes habe ich diese Zeile zur Datei /etc/initramfs-tools/modules hinzugefügt.

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

Und dann habe ich mit update-initramfs -u neu geladen und danach neu gestartet.

Nach dem Neustart, wenn ich dmesg | grep pci-stub starte, erhalte ich die folgende Ausgabe:

[    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

Wie Sie sehen können, werden weder Audio noch Video von Stub beansprucht.

Ich habe auch versucht, diese Option direkt der Grub-Datei in etc/default/grub hinzuzufügen, sodass die GRUB_CMDLINE_LINUX_DEFAULT -Zeile so aussieht:

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

Dies führte jedoch auch dazu, dass die Nvidia-Karte nicht auf die schwarze Liste gesetzt wurde.

Hat jemand eine Ahnung, woran das liegen könnte?

4
Mathyn

Ich richte auch qemu-kvm-Passthrough ein, und ich hatte das gleiche Problem wie Sie. Ich verwende meine integrierte Intel-Grafikkarte als primäre GPU, daher habe ich die NVIDIA-Einstellungen geöffnet und die Hybrid-Grafik deaktiviert, sodass die NVIDIA-Karte nicht verwendet wird: (pic related)

Danach hatte ich kein Problem damit, die Karte an vfio-pci zu binden.

Es ist möglich, dass die nvidia-Module beim Starten von qemu Probleme verursachen oder dass Sie nicht die Möglichkeit haben, Hybridgrafiken zu deaktivieren. In diesem Fall können Sie auch versuchen, was ich auch getan habe, und die nvidia-Module manuell mithilfe eines Skripts wie dieses im Konsolenmodus deaktivieren (STRG + 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

Dies stoppt den Display-Manager (in meinem Fall lightdm), deaktiviert die nvidia-Module der Reihe nach und startet den Display-Manager anschließend neu. Stellen Sie sicher, dass dies im Konsolenmodus gestartet wird, da das Ausführen dieses Befehls vom Desktop aus wahrscheinlich das Skript nach der ersten Zeile unterbricht.

Die nvidia-Module werden beim Neustart automatisch neu geladen. Sie können sie jedoch auch manuell mit den folgenden Schritten erneut laden:

modprobe nvidia nvidia_modeset nvidia_drm nvidia_uvm

Hoffe das hilft.

1
Xanty

Deaktiviere nvidia/nuveau mit grub config.

Es besteht die Möglichkeit, die Anweisung module_blacklist=<module1>[,<module2>](documentation) über die Befehlszeile grub2 an den Kernel zu übergeben. Ich konnte den Nuveau- und NVIDIA-Treiber mit dem folgenden Zusatz zum GRUB_CMDLINE_LINUX_DEFAULT in /etc/default/grub deaktivieren (vergessen Sie nicht, Sudo update-grub auszugeben):

module_blacklist=nvidia,nvidia_uvm,nvidia_drm,nvidia_modeset,nouveau

Es gibt auch die Möglichkeit, automatisch Grub-Einträge mit und ohne diese Option für jeden Kernel zu generieren: https://unix.stackexchange.com/questions/24670/choose-at-grub-menu-whether-nvidia-driver -sollte-verwendet werden (erste Antwort). Aber es stellte sich als umständlicher heraus als erwartet. Die Ubuntu-Grub-Konfiguration ist sehr kompliziert. Stellen Sie sicher, dass Sie ein Backup erstellen, bevor Sie daran basteln.

Dies ist besonders hilfreich, wenn Sie eine leistungsstarke NVIDIA-Karte zum Spielen in einer virtuellen Maschine mit VGA-Passthrough verwenden möchten, diese jedoch für vertiefendes Lernen verwenden können, z. B. tensorflow. Nur ein Neustart ist erforderlich, um zwischen diesen beiden zu wechseln.

0
user334287

Ihr Audio wurde von Stub beansprucht

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

Das Video ist nicht. Ich habe das gleiche Problem, ich habe Nvidia und/oder Nouveau auf die schwarze Liste gesetzt. Ich benutze Ubuntu Server 15.10 also nicht genau das gleiche aber ich habe das gleiche Problem. Ich habe seit Wochen im Internet gesucht und nichts.

edit Endlich behoben, ich fand es hier: https://forum.level1techs.com/t/pci-stub-not-claming-secondary-graphics-card/88728

Also habe ich die Nvidia- und Nouveau-Module auf die schwarze Liste gesetzt und neu gestartet. Ich hoffe es hilft

erneut bearbeiten:

Meine aktuellen Schritte, die ich unternommen habe, um die PCI-Karten mit Kernel 4.10.1-1 an pci-stub on Arch zu binden.

Ich habe/etc/default/grub so bearbeitet: GRUB_CMDLINE_LINUX_DEFAULT = "quiet intel_iommu = on pci-stub.ids = 1002: 6798,1002: 679a, 1002: aaa0,1106: 3483"

Dann erstelle ich die neue Grub-Konfigurationsdatei

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

Starten Sie dann neu.

In /etc/mkinitcpio.conf habe ich pci-stub zu Modules hinzugefügt, so dass es so aussieht: MODULES = "pci-stub"

dann renne

$ Sudo mkinitcpio -P

um alle initramfs-bilder neu zu erstellen. Starten Sie dann neu.

Dann soll dieser Befehl nur sicherstellen, dass sie von pci-grub beansprucht wurden

$ dmesg | grep pci-stub

0
Dan
0
tomsk

Ich bin auf ähnliche Probleme gestoßen wie Sie (Lubuntu 16.04). Dies liegt daran, dass Treiber/Module die Geräte an sie binden, bevor pci-stub dies kann. Hier haben Sie mindestens zwei Möglichkeiten:

Die erste und einfachste Möglichkeit besteht darin, die Module, die den Anspruch auf das Gerät erheben, auf eine schwarze Liste zu setzen. Geben Sie lspci -knn | grep VGA -A 5 ein, um alle Ihre VGA-PCI-Geräte und deren Geräte anzuzeigen Gerätenummer und deren Kernel-Module.

 01: 00.0 VGA-kompatibler Controller [0300]: NVIDIA Corporation Gerät [10de: 128b] (Rev. A1) 
 Subsystem: Micro-Star International Co., Ltd. [MSI] Gerät [1462: 8c93] 
 Verwendeter Kernel-Treiber: nouveau 
 Kernel-Module: nvidiafb, nouveau 
 01: 00.1 Audiogerät [0403]: NVIDIA Corporation GK208 HDMI/DP-Audiocontroller [10de: 0e0f ] (Rev. A1) 
 Subsystem: Micro-Star International Co., Ltd. [MSI] GK208 HDMI/DP-Audiocontroller [1462: 8c93] 
 - 
 02: 00.0 VGA-kompatibler Controller [0300]: NVIDIA Corporation GM204 [GeForce GTX 970] [10de: 13c2] (Rev. A1) 
 Subsystem: ZOTAC International (MCO) Ltd. GM204 [GeForce GTX 970] [19da: 1366] 
 Verwendeter Kernel-Treiber: nouveau 
 Kernel-Module: nvidiafb, nouveau 
 02: 00.1 Audiogerät [0403]: NVIDIA Corporation GM204 High Definition Audio Controller [10de: 0fbb] (Rev. a1 ) 
 Subsystem: GM204 High Definition Audio Controller von ZOTAC International (MCO) Ltd. [19da: 1366] 
 

Jetzt müssen Sie überprüfen, welcher Treiber verwendet wird. Zum Beispiel griff nouveau nach meinem VGA-Gerät 02: 00.0, das ich für meine VM verwenden möchte.

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

und du bist fertig.

In meinem Fall würde dies ein Problem verursachen, da zwei nVidia VGAs (01: 00.0 und 02: 00.0) installiert sind, die beide mit demselben Treiber ausgeführt werden. In meinem Fall setze ich den Fahrer nicht auf die schwarze Liste.

Ich habe manuell Nouveau von meiner 02: 00.0 VGA-Karte gelöst, da ich diese Karte für meinen VM-Gast und die 01: 00.0 VGA für verwenden wollte mein Linux Host. Dank dieser Anleitung habe ich herausgefunden, wie das geht: https://lwn.net/Articles/143397/

Geben Sie Sudo tree /sys/bus/pci/drivers/nouveau ein. Tauschen Sie nouveau mit einem beliebigen Modul aus, das Ihr Gerät erfasst hat.

Sie sollten eine Liste wie diese erhalten:

/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 
 ├── uevent 
 └── unbind 
 

Wir sehen, dass Driver Nouveau Geräte hat, die daran binden: 0000: 01: 00.0 und 0000: 02: 00.0

Um meine Grafikkarte zu lösen und zu binden, muss ich zuerst lightdm.service ausschalten. Dazu öffne ich die Konsole außerhalb der Desktop-Umgebung zum Beispiel mit STRG + ALT + F2. Melden Sie sich als root an und geben Sie systemctl stop lightdm.service ein.

Jetzt kann ich das Modul von der Grafikkarte lösen:

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

und binde es an ein beliebiges Modul (pci-stub oder vfio-pci). Ich habe vfio-pci verwendet.

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

Danach können Sie Ihren Desktopmanager erneut starten: systemctl start lightdm.service

Wenn alles geklappt hat, sollten Sie feststellen, dass Ihr Gerät an das von Ihnen angegebene Modul gebunden ist, indem Sie erneut mit lspci -knn | grep VGA -A 5 nachschlagen.

 01: 00.0 VGA-kompatibler Controller [0300]: NVIDIA Corporation Gerät [10de: 128b] (Rev. A1) 
 Subsystem: Micro-Star International Co., Ltd. [MSI] Gerät [1462: 8c93] 
 Verwendeter Kernel-Treiber: nouveau 
 Kernel-Module: nvidiafb, nouveau 
 01: 00.1 Audiogerät [0403]: NVIDIA Corporation GK208 HDMI/DP-Audiocontroller [10de: 0e0f ] (Rev. A1) 
 Subsystem: Micro-Star International Co., Ltd. [MSI] GK208 HDMI/DP-Audiocontroller [1462: 8c93] 
 - 
 02: 00.0 VGA-kompatibler Controller [0300]: NVIDIA Corporation GM204 [GeForce GTX 970] [10de: 13c2] (Rev. A1) 
 Subsystem: ZOTAC International (MCO) Ltd. GM204 [GeForce GTX 970] [19da: 1366] 
 Verwendeter Kernel-Treiber: vfio-pci 
 Kernel-Module: nvidiafb, nouveau 
 02: 00.1 Audiogerät [0403]: NVIDIA Corporation GM204 High Definition Audio Controller [10de: 0fbb] ( rev a1) 
 Subsystem: GM204 High Definition Audio Controller von ZOTAC International (MCO) Ltd. [19da: 1366] [.___ _.]

Leider verliert diese Problemumgehung nach dem Neustart an Wirkung. Dennoch habe ich nicht herausgefunden, wie ich es dauerhaft machen kann. Vielleicht kann mir jemand einen Hinweis geben. So etwas wie ein Startskript wäre möglich, denke ich. Besser wäre es jedoch, das Gerät an ein bestimmtes Modul zu binden, ohne es vorher binden zu müssen. Stellen Sie sich vor, ich möchte eines Tages den nvidia-Treiber verwenden. In diesem Fall wäre das Aufheben der Bindung von nouveau nutzlos, da die Grafikkarte an das nvidia-Modul gebunden wäre.

0
AlexOnLinux