Implementierung von PCI-Passthrough mit Linux-KVM unter Debian

10

Ich versuche, mit PCI-Passthrough 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 Verdeutlichung bin ich mir nicht sicher, welcher Pfad für die Implementierung von PCI-Passthrough mit Linux KVM richtig ist. In diesem Stadium vermute ich , die richtige Aktion ist zu addieren CONFIG_DMAR, CONFIG_DMAR_DEFAULT_ONund CONFIG_PCI_STUBdie „Bus - Optionen (PCI etc.)“ -Abschnitt der Kernel - Quelle und neu kompilieren.

Ich bin mir jedoch nicht sicher, ob dies eine vollständige Liste der erforderlichen Ergänzungen ist, bevor ich sie erneut zusammenstelle. Oder wenn eine Neukompilierung des Kernels erforderlich ist - vielleicht gibt es eine einfachere Methode?

Von den Handbüchern, auf die ich verwiesen habe, erwähnt nur linux-kvm.org ausdrücklich, dass eine Kompilierung erforderlich 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 primäre Ressource war der Leitfaden unter linux-kvm.org ( http://www.linux-kvm.org/page/How_to_assign_devices_with_VT-d_in_KVM ). Ich habe jedoch andere Ressourcen gefunden, die auf leicht unterschiedliche Methoden hinweisen, die (scheinbar) verteilungsspezifisch sind:

Fedora-- https://docs.fedoraproject.org/en-US/Fedora/13/html/Virtualization_Guide/chap-Virtualization-PCI_passthrough.html

SUSE - "openSUSE: Virtualisierung mit KVM" (Link wegen geringer Relevanz und 2-Link-Limit weggelassen)

Der Fedora-Leitfaden funktioniert bis zur Referenzierung, setsebooldie RedHat-spezifisch zu sein scheint. Das SUSE-Handbuch gibt an, dass die Zuweisung von Grafikkarten von SUSE nicht unterstützt wird. Ich verweise jedoch auch darauf, da darin angegeben ist, dass ich eine CONFIG_DMAR_DEFAULT_ONZeichenfolge in / boot / config-`uname -r` finden sollte. Auf die Website linux-kvm.org wird ebenfalls verwiesen CONFIG_DMAR_DEFAULT_ON, sodass dies eine häufige und notwendige Komponente zu sein scheint.

Hinweis: Ich habe in den Anleitungen für Fedora oder Debian keine Einschränkungen für Grafikkarten gefunden. Das referenzierte SUSE-Dokument ist vom 2006-2013.

Ich kann CONFIG_DMAR_DEFAULT_ONin / boot / config-`uname -r` auf meinem System nicht finden . Weitere Untersuchungen legen nahe, dass CONFIG_DMAR, CONFIG_DMAR_DEFAULT_ONund CONFIG_PCI_STUBLinux-Kernel-Konfigurationselemente sind, die für die Anweisungen auf linux-kvm.org relevant sind . Daher glaube ich, dass ich den Kernel meines Hosts mit diesen 3 (mindestens) Kernel-Konfigurationselementen neu kompilieren muss. Das Booten mit intel_iommu=onals Kernel-Parameter für mein Host-Betriebssystem scheint unzureichend zu sein.

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"

Bestätigung der VT-d / IOMMU / KVM-Unterstützung

Meine Forschung zeigt, dass PCI-Passthrough sowohl CPU- als auch Motherboard-Unterstützung für VT-d erfordert.

VT-d

Ich habe bestätigt, dass mein Prozessor, ein nicht-k INTEL i7-3770 (per ark.intel.com/products/65719), VT-d unterstützt:

Intel® Virtualisierungstechnologie für gerichtete E / A (VT-d) ‡ Ja

Mein Asrock Z77 Extreme4-Motherboard unterstützt auch VT-d (siehe Seite 62 des Benutzerhandbuchs):

VT-d Verwenden Sie diese Option, um die Intel ® VT-d-Technologie (Intel ® Virtualisierungstechnologie für gerichtete E / A) zu aktivieren oder zu deaktivieren. 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 davon kann ich meine Grafikkarte nicht erfolgreich von meinem Host trennen und einer virtuellen Maschine zuweisen .

Gedanken schließen

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 hat 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, dies liegt daran, dass der Host die Kontrolle über die Grafikkarte immer noch nicht aufgibt und wahrscheinlich daran liegt, dass der Kernel nicht mit den entsprechenden Konfigurationselementen kompiliert wird.

Dies ist Neuland für mich, bitte verzeihen Sie meine Unerfahrenheit. Ich würde sehr schätzen jedes Feedback auch immer, auch wenn es nur eine Bestätigung ist , dass ich auf dem richtigen Weg bin. Bitte lassen Sie mich wissen, wenn ich ein grelles Versehen gemacht habe oder überdenke. 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 viel aufgenommen habe!). Gerne helfe ich Ihnen, meine Frage klarer oder leichter zu beantworten.

Danke im Voraus,

Shelladept
quelle
Was passiert, ist, dass Sie die Videokarte überhaupt nicht an den Host anhängen lassen (z. B. booten, ohne diese Videokarte an Ihren Host anzuhängen. Entweder indem Sie keinen Treiber bereitstellen / deaktivieren oder indem Sie einen Kernel-Boot-Parameter verwenden, damit er beim Booten übersprungen wird). ?
Hennes

Antworten:

1

Artikel für PCI-Passthrough erwähnt, ist die Kernel-Konfiguration 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 "*"

Ich konnte diese Optionen jedoch nicht unter "Busoptionen" und stattdessen unter "Gerätetreiber -> IOMMU-Hardwareunterstützung" finden.

Nachdem ich dem erwähnten Artikel gefolgt war, hatte ich immer noch Probleme beim Starten des Gastcomputers und bekam Fehler, dass "Gerät 'pci-assign' konnte nicht initialisiert werden". Ich habe es geschafft, es durch Ausführen zu starten:

 echo 1 > /sys/module/kvm/parameters/allow_unsafe_assigned_interrupts

Lesen Sie den folgenden Artikel, wenn Sie weiterhin Probleme haben: http://spica-and-roid.blogspot.com.au/2012/07/howto-kvm-passthrough.html

supmethods
quelle