Ich versuche, PCI-Passthrough zu verwenden, um eine alte Grafikkarte (Radeon 4770) an eine virtuelle Maschine anzuschließen. Ich verwende Linux-KVM, um meine virtuellen Maschinen auf einem Debian Linux-Host (Wheezy, 3.2.0-4-amd64) auszuführen.
Frage
Zur Klarstellung: Ich bin mir nicht sicher, was der richtige „Pfad“ für die Implementierung von PCI-Passthrough mit Linux KVM ist. Zum jetzigen Zeitpunkt vermute ich, dass die richtige Vorgehensweise darin besteht,Fügen Sie CONFIG_DMAR
, CONFIG_DMAR_DEFAULT_ON
, und CONFIG_PCI_STUB
zum Abschnitt „Busoptionen (PCI usw.)“ der Kernelquelle hinzu und kompilieren Sie neu.
Aber ich bin mir nicht sicherwenn dies eine vollständige Liste der vor der Neukompilierung erforderlichen Ergänzungen ist.Oderwenn eine Neukompilierung des Kernels erforderlich ist-- vielleicht gibt es eine einfachere Methode?
Von den Anleitungen, die ich zitiert habe, nurlinux-kvm.orgwird explizit erwähnt, dass eine Kompilierung notwendig ist. Linux-KVM ist bereits installiert und fungiert als Hypervisor.
Forschung
An diesem Punkt denke ich, dass mein Problem mit meinem Kernel zusammenhängt. Meine wichtigste Ressource war der Leitfaden unterlinux-kvm.org(http://www.linux-kvm.org/page/How_to_assign_devices_with_VT-d_in_KVM). Ich habe jedoch andere Ressourcen gefunden, die leicht unterschiedliche Methoden angeben, die (scheinbar) verteilungsspezifisch sind:
SUSE – „openSUSE: Virtualisierung mit KVM“ (Link ausgelassen aufgrund geringer Relevanz und 2-Link-Begrenzung)
Der Fedora-Leitfaden funktioniert bis auf die Referenz setsebool
, die RedHat-spezifisch zu sein scheint. Der SUSE-Leitfaden gibt an, dass die Grafikkartenzuweisung von SUSE nicht unterstützt wird. Ich referenziere ihn jedoch ebenfalls, da er angibt, dass ich eine CONFIG_DMAR_DEFAULT_ON
Zeichenfolge in /boot/config-`uname -r` finden sollte. Dielinux-kvm.orgDie Site verweist auch auf CONFIG_DMAR_DEFAULT_ON
, es scheint sich hierbei also um eine allgemeine und notwendige Komponente zu handeln.
Notiz:Ich habe in Anleitungen für Fedora oder Debian keine Einschränkungen für Grafikkarten gefunden. Das referenzierte SUSE-Dokument ist von 2006 bis 2013.
CONFIG_DMAR_DEFAULT_ON
Ich kann in /boot/config-`uname -r` auf meinem System nichts finden . Weitere Untersuchungen deuten darauf hin, dass CONFIG_DMAR
, CONFIG_DMAR_DEFAULT_ON
, und CONFIG_PCI_STUB
Linux-Kernel-Konfigurationselemente sind, die für die Anweisungen unter relevant sindlinux-kvm.org. Daher glaube ich, dass ich den Kernel meines Hosts mit diesen 3 (mindestens) Kernelkonfigurationselementen neu kompilieren muss. Das Booten mit intel_iommu=on
als Kernelparameter für mein Host-Betriebssystem scheint nicht ausreichend zu sein.
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
VT-d/IOMMU/KVM-Supportbestätigung
Meinen Untersuchungen zufolge erfordert PCI-Passthrough sowohl CPU- als auch Motherboard-Unterstützung für VT-d.
VT-d
Ich habe bestätigt, dass mein Prozessor, einnicht-kINTEL i7-3770 (laut ark.intel.com/products/65719), unterstützt VT-d:
Intel® Virtualisierungstechnik für Directed I/O (VT-d) ‡ Ja
Mein Asrock Z77 Extreme4-Motherboard unterstützt auch VT-d (gemäß Seite 62 des Benutzerhandbuchs):
VT-d Hiermit aktivieren oder deaktivieren Sie die Intel ® VT-d-Technologie (Intel ® Virtualization Technology for Directed I/O). Der Standardwert dieser Funktion ist [Deaktiviert].
IOMMU
Ich habe überprüft, ob mein System IOMMU-Unterstützung bietet:
dmesg | grep -e DMAR -e IOMMU | grep -e "DRHD base" -e "enabled"
[ 0.000000] Intel-IOMMU: enabled
KVM
KVM ist installiert und funktionsfähig, abgesehen von der PCI-Passthrough-Unterstützung:
lsmod | grep kvm
kvm_intel 121968 0
kvm 287749 1 kvm_intel
Ich habe sichergestellt, dass VT-d über das BIOS meines Motherboards aktiviert ist. Daher vermute ich keine Hardware-/BIOS-Probleme, die die Verwendung von VT-d verhindern würden. Unabhängig davonIch kann meine Grafikkarte nicht erfolgreich von meinem Host trennen und sie einer virtuellen Maschine neu zuweisen.
Abschließende Gedanken
Abschließend möchte ich erwähnen, dass ich auch versucht habe zu testen:
echo "8086 10b9" \> /sys/bus/pci/drivers/pci-stub/new_id
echo "0000:01:00.0" \> /sys/bus/pci/devices/0000:01:00.0/driver/unbind
echo "0000:01:00.0" \> /sys/bus/pci/drivers/pci-stub/bind
echo "8086 10b9" > /sys/bus/pci/drivers/pci-stub/remove_id
kvm -m 512 -boot c -net none -hda debian-7.1.0-amd64-netinst.iso -device pci-assign,host=01:00.0
und habe nach dem Versuch, die Ziel-VM zu erstellen, den folgenden Fehler erhalten:
Failed to assign device "(null)" : Device or resource busy
*** The driver 'pci-stub' is occupying your device 0000:01:00.0.
***
*** You can try the following commands to free it:
***
*** $ echo "8086 10b9" > /sys/bus/pci/drivers/pci-stub/new_id
*** $ echo "0000:01:00.0" > /sys/bus/pci/drivers/pci-stub/unbind
*** $ echo "0000:01:00.0" > /sys/bus/pci/drivers/pci-stub/bind
*** $ echo "8086 10b9" > /sys/bus/pci/drivers/pci-stub/remove_id
***
kvm: -device pci-assign,host=01:00.0: Device 'pci-assign' could not be initialized
Ich vermute, dass dies daran liegt, dass der Host die Kontrolle über die Grafikkarte immer noch nicht aufgibt und wahrscheinlich daran, dass der Kernel nicht mit den entsprechenden Konfigurationselementen kompiliert wurde.
Das ist Neuland für mich, also verzeihen Sie mir bitte meine Unerfahrenheit. Ich würdesehrIch freue mich über jedes Feedback, auch wenn es nur eine Bestätigung ist, dass ich auf dem richtigen Weg bin. Bitte lassen Sie mich wissen, wenn mir ein eklatantes Versehen unterlaufen ist oder ich zu viel nachdenke. Konstruktive Kritik an meiner Frage ist ebenfalls willkommen. Lassen Sie mich wissen, wenn ich nicht genügend Informationen bereitgestellt habe, um Ihnen zu helfen, mir zu helfen (oder wenn ich zu viele Informationen angegeben habe!). Ich würde mich sehr freuen, wenn ich Ihnen dabei helfen könnte, meine Frage klarer oder leichter beantwortbar zu machen.
Vielen Dank im Voraus,
Antwort1
Artikel erwähnt für PCI-Passthrough, die Kernel-Konfiguration ist erforderlich
make menuconfig
set "Bus options (PCI etc.)" -> "Support for DMA Remapping Devices" to "*"
set "Bus options (PCI etc.)" -> "Enable DMA Remapping Devices" to "*"
set "Bus options (PCI etc.)" -> "PCI Stub driver" to "*"
optional setting:
set "Bus options (PCI etc.)" -> "Support for Interrupt Remapping" to "*"
Allerdings konnte ich diese Option unter „Busoptionen“ nicht finden, stattdessen suchte ich sie unter „Gerätetreiber --> IOMMU-Hardware-Support“.
Nachdem ich den erwähnten Artikel gelesen hatte, hatte ich immer noch Probleme beim Booten des Gastcomputers und erhielt die Fehlermeldung „Gerät ‚pci-assign‘ konnte nicht initialisiert werden“. Ich konnte es booten, indem ich Folgendes ausführte:
echo 1 > /sys/module/kvm/parameters/allow_unsafe_assigned_interrupts
Wenn weiterhin Probleme auftreten, lesen Sie den folgenden Artikel:http://spica-and-roid.blogspot.com.au/2012/07/howto-kvm-passthrough.html