Implementierung von PCI-Passthrough mit Linux-KVM unter Debian

10373
shelladept

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 Verdeutlichung bin ich nicht sicher, was der richtige "Pfad" für die Implementierung von PCI-Passthrough mit Linux KVM 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 erschöpfende Liste notwendiger Ergänzungen ist, bevor die Neukomplikation durchgeführt wird. Oder wenn der Kernel neu kompiliert werden muss - vielleicht gibt es eine einfachere Methode?

Von den Handbüchern, auf die ich verwiesen habe, wird nur ausdrücklich erwähnt, dass das Kompilieren von linux-kvm.org 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 wichtigste 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 etwas abweichende Methoden hinweisen, die (scheinbar) vertriebsspezifisch sind:

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

SUSE - "openSUSE: Virtualisierung mit KVM" (Link wurde wegen niedriger Relevanz und 2-Link-Limits weggelassen)

Der Fedora-Leitfaden funktioniert bis zur Referenzierung, setsebooldie RedHat-spezifisch zu sein scheint. Der SUSE-Leitfaden besagt, dass die Zuweisung von Grafikkarten nicht von SUSE unterstützt wird. Ich CONFIG_DMAR_DEFAULT_ONbeziehe mich jedoch auch darauf, da in diesem Fall eine Zeichenfolge in / boot / config-`uname -r` angezeigt wird. Die Website linux-kvm.org referenziert ebenfalls CONFIG_DMAR_DEFAULT_ON, daher scheint dies eine übliche und notwendige Komponente zu sein.

Hinweis: Ich habe in Grafikanleitungen für Fedora oder Debian keine Einschränkungen für Grafikkarten gefunden. Das referenzierte SUSE-Dokument ist von 2006 bis 2013 datiert.

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

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on" 

VT-d / IOMMU / KVM-Support-Bestätigung

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 direkte E / A (VT-d) ‡ Ja

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

VT-d Verwenden Sie diese Option, um die Intel® VT-d-Technologie (Intel®-Virtualisierungstechnologie für direkte E / A) zu aktivieren oder zu deaktivieren. Der Standardwert dieser Funktion ist [Deaktiviert].

IOMMU

Ich habe bestätigt, dass mein System IOMMU-Unterstützung hat:

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 wird. Daher vermute ich keinen Hardware- / BIOS-Fehler, der die Verwendung von VT-d verhindern würde. Unabhängig davon kann ich meine Grafikkarte nicht erfolgreich von meinem Host trennen und einer virtuellen Maschine zuweisen .

Schlussgedanken

Zum Schluss möchte ich noch erwähnen, dass ich auch getestet habe:

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, die folgende Fehlermeldung angezeigt:

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

Dies ist Neuland für mich, bitte verzeihen Sie meine Unerfahrenheit. Über Rückmeldungen würde ich mich sehr freuen, auch wenn es nur eine Bestätigung ist, dass ich auf dem richtigen Weg bin. Bitte lassen Sie es mich wissen, wenn ich ein scharfes Versehen gemacht habe oder überdenke. Die konstruktive Kritik an meiner Frage ist ebenfalls willkommen. Lassen Sie mich wissen, wenn ich nicht genügend Informationen zur Verfügung gestellt habe, um "Ihnen zu helfen, mir zu helfen" (oder wenn ich zu viel mitgeholfen habe!) Ich würde gerne helfen, meine Frage klarer oder einfacher zu beantworten.

Danke im Voraus,

10
Was passiert, ist, dass Sie die Videokarte nicht selbst mit dem Host verbinden (z. B. booten, ohne diese Videokarte mit Ihrem Host zu verbinden. Entweder indem Sie keinen Treiber bereitstellen oder deaktivieren oder einen Kernel-Boot-Parameter verwenden, der beim Booten übersprungen wird.) ? Hennes vor 9 Jahren 0

1 Antwort auf die Frage

1
supmethods

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

Ich konnte diese Optionen jedoch nicht unter "Busoptionen" und stattdessen unter "Gerätetreiber -> IOMMU Hardware Support" finden.

Nachdem ich dem erwähnten Artikel gefolgt war, hatte ich immer noch Probleme beim Booten des Gastcomputers und es wurden Fehler angezeigt, die besagten, dass das "PCI-Zuweisungsgerät" nicht initialisiert werden konnte. Ich habe es geschafft, es zu booten, indem ich Folgendes ausführte:

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

Wenn Sie immer noch Probleme haben, lesen Sie den folgenden Artikel: http://spica-and-roid.blogspot.com.au/2012/07/howto-kvm-passthrough.html