Proxmox PCIe Passthrough aktivieren

Aus Thomas-Krenn-Wiki
Zur Navigation springen Zur Suche springen

Die Virtualisierungslösung Proxmox VE (Proxmox Virtual Environment; kurz PVE) erlaubt das Durchreichen von PCIe Geräten an einzelne virtuelle Maschinen (PCIe Passthrough).[1] Eine virtuelle Maschine kann damit exklusiv ein entsprechendes PCIe Gerät, z.B. eine Netzwerkkarte, steuern. Dies hat viele Vorteile gegenüber virtualisierter Hardware, zum Beispiel eine verringerte Latenz. Dieser Artikel zeigt, welche Konfigurationsschritte am Proxmox VE Host und anschließend in der VM erforderlich sind, um eine Netzwerkkarte an die VM anzubinden.

Hardwareanforderungen

Zum Durchreichen von PCIe Geräten müssen sowohl das Mainboard als auch die CPU IOMMU (I/O Memory Management Unit) Interrupt Remapping unterstützen.

In der Regel bieten Intel Systeme mit VT-d und AMD Systeme mit AMD-Vi eine derartige Unterstützung. Die Funktion IOMMU muss gegebenenfalls im BIOS aktiviert werden.

Proxmox VE Konfiguration

Die folgenden Konfigurationsschritte sind erforderlich, um am Proxmox VE die Funktion PCIe Passthrough zu aktivieren. Starten Sie dazu eine SSH Verbindung oder die Shell im Proxmox Webinterface für den Node pve.

Grub Konfiguration

Um PCIe Geräte an VMs durchreichen zu können, ist bei Intel Systemen der Parameter intel_iommu=on bzw. bei AMD Systemen der Parameter amd_iommu=on in der Grub Konfiguration /etc/default/grub des Proxmox VE Systems zu setzen:

Beispiel bei einem Intel System: GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
Beispiel bei einem AMD System: GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on"

Aktualisieren Sie anschließend mit update-grub die Grub Konfiguration:

update-grub

Kernel Module ergänzen

Bearbeiten Sie die Datei /etc/modules als root Benutzer mit Schreibrechten:

root@pve:~# vi /etc/modules

Ergänzen Sie die Kernel Module und speichern Sie die Datei ab:

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

Initramfs aktualisieren

Als letzten Schritt aktualisieren Sie noch das Initramfs:

root@pve:~# update-initramfs -u -k all

Neustart durchführen

Die erforderlichen Konfigurationen per Shell sind nun am Proxmox VE Node abgeschlossen. Starten Sie nun das System neu, um die Änderungen anzuwenden.

root@pve:~# reboot

Funktion prüfen

Nachdem das System wieder gestartet wurde, prüfen Sie nun die dmesg Ausgabe (Kernel Ring Buffer) und die geladenen Module.

In der dmesg Ausgabe muss die Aktivierung der IOMMU ersichtlich sein:

root@pve:~# dmesg |grep -e DMAR -e IOMMU -e AMD-Vi
[...]
[    0.273374] DMAR: IOMMU enabled
[...]
[    1.722014] DMAR: Intel(R) Virtualization Technology for Directed I/O

Prüfen Sie auch, ob die zuvor in /etc/modules ergänzte Kernel Module korrekt geladen wurden:

root@pve:~# lsmod | grep vfio
vfio_pci               49152  0
vfio_virqfd            16384  1 vfio_pci
irqbypass              16384  2 vfio_pci,kvm
vfio_iommu_type1       32768  0
vfio                   32768  2 vfio_iommu_type1,vfio_pci

Konfigurationsbeispiel einer Ethernet Netzwerkkarte

Die generell erforderliche Konfiguration am Proxmox VE System, um eine beliebige PCIe Karte an die VM Gäste durchreichen zu können, wurde nun abgeschlossen. Dieser Abschnitt zeigt nun anhand einer Intel I350 Netzwerkkarte, wie Sie ein PCI Device an eine VM durchreichen können.

Proxmox VE

Starten Sie die Konsole des Proxmox VE Systems oder verbinden Sie sich per SSH.

PCI Geräte anzeigen

Das Kommando lspci gibt alle erkannten PCI Geräte aus, identifiziern Sie die korrekte Netzwerkkarte. In diesem Beispiel wird eine NIC der I350 Netzwerkkarte verwendet. Die Kombination 18:00.0 bedeutet Bus 18, Slot 0 und .0 beschreibt die erste Funktion der I350, in diesem Fall die erste Buchse. Die Adresse 18:00.1 die zweite Funktion bzw. zweite Buchse der Netzwerkkarte.

root@pve:~# lspci | grep Ethernet
18:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
18:00.1 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
19:00.0 Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev 03)
60:00.0 Ethernet controller: Intel Corporation Ethernet Connection X722 for 10GBASE-T (rev 09)
60:00.1 Ethernet controller: Intel Corporation Ethernet Connection X722 for 10GBASE-T (rev 09)

IOMMU Groups anzeigen

Die Bus Adresse ist wichtig, um die IOMMU Gruppe der NIC feststellen zu können. Mit dem folgenden find-Kommando sieht man, dass die Adresse 18:00.0 der IOMMU Gruppe 23 zugeordnet ist. Wichtig ist, falls Sie mehrere NICs einer VM zuweisen oder NICs einer Netzwerkkarte unterschiedlichen VMs zuweisen möchten, dass diese jeweils in einer dedizierten IOMMU Gruppe liegen. Dies ist erforderlich, damit PCI Passthrough ermöglicht werden kann.

root@pve:~# find /sys/kernel/iommu_groups/ -type l | grep 18
/sys/kernel/iommu_groups/23/devices/0000:18:00.0
/sys/kernel/iommu_groups/18/devices/0000:17:0e.7
/sys/kernel/iommu_groups/18/devices/0000:17:0e.5
/sys/kernel/iommu_groups/18/devices/0000:17:0e.3
/sys/kernel/iommu_groups/18/devices/0000:17:0e.1
/sys/kernel/iommu_groups/18/devices/0000:17:0e.6
/sys/kernel/iommu_groups/18/devices/0000:17:0e.4
/sys/kernel/iommu_groups/18/devices/0000:17:0e.2
/sys/kernel/iommu_groups/18/devices/0000:17:0e.0
/sys/kernel/iommu_groups/24/devices/0000:18:00.1

Konfiguration der virtuellen Maschine

In diesem Beispiel wird nun die NIC, die der IOMMU Gruppe 23 zugeordnet ist, der VM "100 (IntelDCM)" zugewiesen. Stoppen Sie die VM, falls diese läuft.

PCI Device zur VM hinzufügen

Wechseln Sie zur Sektion Hardware der VM Konfiguration im Proxmox Webinterface und befolgen Sie nun den Schritten in den abgebildeten Screenshots.


Netzwerkkarte identifizieren

Starten Sie die VM und verbinden Sie sich per Konsole zur VM.

Die Ausgabe von ip a zeigt nun ein neues Netzwerkinterface ens16 an:

[tk@localhost ~]$ ip a

[...]
3: ens16: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
    link/ether a0:36:9f:5c:df:20 brd ff:ff:ff:ff:ff:ff

Das Kommando lspci gibt die neu verbundene Netzwerkkarte aus:

[tk@localhost ~]$ lspci

[...]
00:10.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
[...]

Ausführliche Ausgabe des lspci -v Kommandos für mehr Details:

[tk@localhost ~]$ lspci -s 00:10.0 -v

00:10.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
	Subsystem: Intel Corporation Ethernet Server Adapter I350-T2
	Physical Slot: 16
	Flags: bus master, fast devsel, latency 0, IRQ 11
	Memory at fea00000 (32-bit, non-prefetchable) [size=1M]
	Memory at feb50000 (32-bit, non-prefetchable) [size=16K]
	Capabilities: <access denied>
	Kernel driver in use: igb
	Kernel modules: igb

Funktion prüfen

Eine Funktionsprüfung zeigt, ob die Netzwerkkarte auch korrekt funktioniert. Dies kann mittels ethtool in Verbindung mit der Bezeichnung des Interfaces kann dies überprüft werden:

Ausgabe von ethtool ens16, abgestecktes Netzwerkkabel:

[tk@localhost ~]$ ethtool ens16

Settings for ens16:
	Supported ports: [ TP ]
	[...]
	Speed: Unknown!
	Duplex: Unknown! (255)
	[...]
	Link detected: no

Ausgabe nachdem das Netzwerkkabel angesteckt wurde, beachten Sie die Ausgabe bei Speed, Duplex und Link detected:

[tk@localhost ~]$ ethtool ens16

Settings for ens16:
	Supported ports: [ TP ]
	[...]
	Speed: 1000Mb/s
	Duplex: Full
	[...]
	Link detected: yes

Konfiguration der Netzwerkverbindung

Die Netzwerkkarte ist nun erfolgreich der VM zugeordnet und der Funktionstest war erfolgreich. Sie können nun das Interface konfigurieren und einsetzen.

Weitere Informationen

Einzelnachweise

  1. PCI(e) Passthrough (pve.proxmox.com)
Foto Thomas Niedermeier.jpg

Autor: Thomas Niedermeier

Thomas Niedermeier arbeitet im Product Management Team von Thomas-Krenn. Er absolvierte an der Hochschule Deggendorf sein Studium zum Bachelor Wirtschaftsinformatik. Seit 2013 ist Thomas bei Thomas-Krenn beschäftigt und kümmert sich unter anderem um OPNsense Firewalls, das Thomas-Krenn-Wiki und Firmware Sicherheitsupdates.

Icon-Twitter.png 

Das könnte Sie auch interessieren

Mellanox ConnectX-4/5/6 Bitfehler ab Linux Kernel 5.13
Terraform mit Proxmox VE Tutorial
Updates (Minor) in Proxmox VE installieren