PCIe WLAN durchreichen

lenny30

Member
May 26, 2020
62
3
8
39
HI,
wenn ich die PCIe WLAN Karte an eine VM durchreiche, schiert Proxmox ab und trennt sämtliche Netzwerkverbindungen.
Bei einer USB WLAN oder Netzwerkkarte passiert das nicht.

Selbiges ist mir auch aufgefallen, als ich versucht habe, eine onboard NIC an eine VM durchzureichen.

Kennt das jemand oder kann mir helfen?
Danke!
 

gmed

Well-Known Member
Dec 20, 2013
366
44
48
Da passt wohl mit IOMMU was nicht und OS und Bios kommen sich da anscheinend in's Gehege.
Schau dir die IOMMU-Doku nochmal an.
 

lenny30

Member
May 26, 2020
62
3
8
39
das fehlt tatsächlich in der etc/modules
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
kann das der Grud sein?



das sieht ja erstmal gut aus:
root@proxmox:~# dmesg | grep -e DMAR -e IOMMU
[ 0.017241] ACPI: DMAR 0x000000007BB03FF0 0000A8 (v01 00000003 BRXT 0100000D)
[ 0.113528] DMAR: IOMMU enabled
 

gmed

Well-Known Member
Dec 20, 2013
366
44
48
wenn das alles ist, was dmesg für IOMMU raus haut, fehlt da schon was.
Hab aber im Moment keine Hardware zu testen.
Sieht aber aus, als das du auf der richtigen Fährte bist.
 

gmed

Well-Known Member
Dec 20, 2013
366
44
48
Die fehlenden Module sind fest im Kernel, daher ist das erst mal ok.
 

lenny30

Member
May 26, 2020
62
3
8
39
das ist die gesamte Ausgabe:
root@proxmox:~# dmesg | grep -e DMAR -e IOMMU
[ 0.017755] ACPI: DMAR 0x000000007BB03FF0 0000A8 (v01 00000003 BRXT 0100000D)
[ 0.114045] DMAR: IOMMU enabled
[ 0.249123] DMAR: Host address width 39
[ 0.249126] DMAR: DRHD base: 0x000000fed64000 flags: 0x0
[ 0.249142] DMAR: dmar0: reg_base_addr fed64000 ver 1:0 cap 1c0000c40660462 ecap 7e3ff0505e
[ 0.249145] DMAR: DRHD base: 0x000000fed65000 flags: 0x1
[ 0.249157] DMAR: dmar1: reg_base_addr fed65000 ver 1:0 cap d2008c40660462 ecap f050da
[ 0.249161] DMAR: RMRR base: 0x0000007b6a9000 end: 0x0000007b6c8fff
[ 0.249164] DMAR: RMRR base: 0x0000007d800000 end: 0x0000007fffffff
[ 0.249169] DMAR-IR: IOAPIC id 1 under DRHD base 0xfed65000 IOMMU 1
[ 0.249171] DMAR-IR: HPET id 0 under DRHD base 0xfed65000
[ 0.249174] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[ 0.251432] DMAR-IR: Enabled IRQ remapping in x2apic mode
[ 2.311183] DMAR: No ATSR found
[ 2.311289] DMAR: dmar0: Using Queued invalidation
[ 2.311296] DMAR: dmar1: Using Queued invalidation
[ 2.324005] DMAR: Intel(R) Virtualization Technology for Directed I/O
 

gmed

Well-Known Member
Dec 20, 2013
366
44
48
Was gibt "find /sys/kernel/iommu_groups/ -type l" aus?

Hast du auf dem Host die Module der WLAN-Karte in die Blacklist geschrieben, damit der Kernel des Hostes diese nicht für sich beansprucht?
 

lenny30

Member
May 26, 2020
62
3
8
39
das wäre das:
root@proxmox:~# find /sys/kernel/iommu_groups/ -type l
/sys/kernel/iommu_groups/7/devices/0000:00:15.0
/sys/kernel/iommu_groups/5/devices/0000:03:00.0
/sys/kernel/iommu_groups/5/devices/0000:00:13.2
/sys/kernel/iommu_groups/5/devices/0000:02:00.0
/sys/kernel/iommu_groups/5/devices/0000:00:13.0
/sys/kernel/iommu_groups/5/devices/0000:01:00.0
/sys/kernel/iommu_groups/5/devices/0000:00:13.3
/sys/kernel/iommu_groups/5/devices/0000:00:13.1
/sys/kernel/iommu_groups/3/devices/0000:00:0f.0
/sys/kernel/iommu_groups/1/devices/0000:00:02.0
/sys/kernel/iommu_groups/8/devices/0000:00:1a.0
/sys/kernel/iommu_groups/6/devices/0000:00:14.1
/sys/kernel/iommu_groups/6/devices/0000:00:14.0
/sys/kernel/iommu_groups/4/devices/0000:00:12.0
/sys/kernel/iommu_groups/2/devices/0000:00:0e.0
/sys/kernel/iommu_groups/0/devices/0000:00:00.0
/sys/kernel/iommu_groups/9/devices/0000:00:1f.0
/sys/kernel/iommu_groups/9/devices/0000:00:1f.1



da ich nicht weiß, was du mit Blacklist meinst, sag ich mal, nein :)
wie geht das :)
 

gmed

Well-Known Member
Dec 20, 2013
366
44
48
Gut, dann mal los:

1. Deine Iommu_groups sind Stellvertreter für deine PCI(e) Geräte.

Sprich, du machst ein lspci und erhälst eine Liste der im Host verbauten PCI Geräte.
Jedes Gerät aus der oberen Liste hat eine Hardwareadresse z.B. 0000:00:15.0.
Die vergleichst du nun mit der Ausgabe von lspi und findest so heraus, welche für deine WLAN-Karte passt.

Diese Hardware-Adresse wird dann deiner VM als Gerät durchgereicht.

Das hast du wohl alles soweit schon gemacht.
Mit dem Ergebnis, dass der Host abschmiert.

2. Nun zum Blacklisten:

Über lspci hast du ja die Hardware deiner WLAN-Karte identifiziert.
Nun musst du noch prüfen, welche Module der Host zur Nutzung dieses Gerätes beim booten lädt.

Du nimmst also die Ausgabe von lspci und dann suchst du für die Ausgabe der WLAN-Karte nach den dazu gehörigen Modulbezeichnungen.

Ein Beispiel von mir:

lspci gibt an:

00:19.0 Ethernet controller: Intel Corporation Ethernet Connection I217-V (rev 04)

-> dazu gehört das Modul e1000e

Um nun dem Host dieses PCI-Gerät zu nehmen, lege ich eine Datei an:

"/etc/modprobe.d/e1000e.conf" darin eine einzige Zeile "blacklist e1000e"

Damit diese Änderung greift einmal "depmod -ae" und
damit es beim booten greift "update-initramfs -u"

Nach einem Reboot ist die Netzwerkkarte in meine Beispiel in der Blacklist und wird vom Kernel nicht mehr "erkannt" und kann vom Host nicht mehr genutzt werden. Damit ist diese frei für die Weitergabe zu einer VM.

Dann gibt es keine konkurrierende Zugriffe mehr auf die Hardware und kein Abschmieren des Systemes mehr.
 

lenny30

Member
May 26, 2020
62
3
8
39
Hi, Danke schonmal.
Also lspci WLAN Adapter ist:
01:00.0 Ethernet controller: Intel Corporation I211 Gigabit Network Connection (rev 03)
02:00.0 Ethernet controller: Intel Corporation I211 Gigabit Network Connection (rev 03)
03:00.0 Network controller: Qualcomm Atheros AR928X Wireless Network Adapter (PCI-Express) (rev 01)

03:00.0 wurde auch für die VM ausgewählt.
Passt also.

Unter /etc/modprobe.d/
habe ich eine einzige Datei, pve-blacklist.conf
dort steht was von nvidia drin.
wofür ist dann die blacklist conf? kann diese auch erweitert werden?
welcher Eintrag wäre das für eine Atheros?


in deinem Beispiel habe ich eine Frage. Erkennt es dann genrell das Ethernet nicht mehr?
nehmen wir an, ich möchte eine meiner NICs an eine VM durchreichen. Dann erstelle ich den blacklist eintrag.
ich würde dort jetzt denken, dass beide Netzwerkkarten für den Host nicht mehr funktionieren und man nicht mehr zugreifen kann.
 

gmed

Well-Known Member
Dec 20, 2013
366
44
48
Für deine Qualcomm Atheros AR928X Wireless NIC sollte lsmod ein geladenes Modul ath5k angeben.

Dieses ist in die Blacklist aufzunehmen.
Du kannst entweder in /etc/modprobe.d/pve-blacklist.conf einen weiteren Eintrag "blacklist ath5k" einfügen oder eine zweite Datei ath5k.conf mit diesem Inhalt erstellen. Das ist egal; letzteres übersichtlicher, da man anhand der Dateinamen erkennt, um was es geht.

Zu deiner Frage:
Wenn beide Netzwerkschnittstellen das gleiche Kernel-Modul nutzen,
dann wird nach einem Reboot keine der beiden Schnittstellen für den Host nutzbar sein.

Das Blacklisten eines Kernel-Moduls ist nichts anderes, als dem Kernel zu sagen,
dass diese Module (Treiber) nicht geladen werden dürfen.
Somit ist die damit nutzbare Hardware dann "ausser Betrieb" gesetzt.
Zur Weiterleitung an eine VM ist genau das so erwünscht.

Du kannst also nicht bei zwei NIC's, welche das gleiche Kernel-Modul nutzen, nicht eine weiter geben und eine für den Host nutzen,
da du durch das Blacklisten beide dem Host wegnimmst.
 

lenny30

Member
May 26, 2020
62
3
8
39
Super, herzlichen Dank für deine Mühe und ausführliche Antwort.
Werde ich nachher mal testen. (muss erstmal schauen, warum meine Debian CT immer nach einer gewissen Zeit ihr Netzwerkverlieren)
Hört sich aber gut an.
Woher weiß man, welches Modul man in die Blacklist aufnehmen muss?

Zu meiner Frage:
genau das hab ich mir gedacht... Danke!
 

gmed

Well-Known Member
Dec 20, 2013
366
44
48
Um das passende Modul zu finden frag Tante google nach "Linux Kernel "deine Version" "Hardware".
Oder depmod / modinfo auf der Shell
 

gmed

Well-Known Member
Dec 20, 2013
366
44
48
Was gibt lsmod aus?
Ich schrieb bewusst "sollte ath5k ausgeben".
 

lenny30

Member
May 26, 2020
62
3
8
39
root@proxmox:~# lsmod | grep ath
ath9k 151552 0
ath9k_common 36864 1 ath9k
ath9k_hw 475136 2 ath9k_common,ath9k
ath 36864 3 ath9k_common,ath9k,ath9k_hw
mac80211 843776 1 ath9k
cfg80211 704512 4 ath9k_common,ath9k,ath,mac80211
root@proxmox:~#


ath9k sollte auch passen
 

gmed

Well-Known Member
Dec 20, 2013
366
44
48
Wenn lsmod dir das ath9k Modul als geladen anzeigt, stimmt was mit der Blacklist nicht.

Hier nochmal der Link zur Doku:
https://pve.proxmox.com/wiki/PCI(e)_Passthrough

Für dich wichtig ab "Host Device Passthrough"

Das die Doku über ne Grafikkarte spricht ist nicht entscheidend. Wir hatten das für ISDN-Karten realisiert. Nach genau der Doku.
 

lenny30

Member
May 26, 2020
62
3
8
39
Doch doch, wenn die Blacklist ausgefüllt ist, taucht es nicht auf, wenn sie leer ist, ist es jedoch ath9k. Hab ich jedoch auch in die Blacklist eingetragen.
Jedoch nach wie vor verliert Proxmox das Netzwerk wenn die WLAN PCIe der VM zugefügt wird.
 

gmed

Well-Known Member
Dec 20, 2013
366
44
48
Das schein zu klappen, wie du geschrieben hast:
"root@proxmox:~# find /sys/kernel/iommu_groups/ -type l
/sys/kernel/iommu_groups/7/devices/0000:00:15.0
/sys/kernel/iommu_groups/5/devices/0000:03:00.0..."

Die Gruppe 5 mit der ID 03:00.0 sollte deine WLAN-Karte sein.

Ist das ne reine WLAN-Karte oder macht die noch Bluetooth?
Gib mal den genauen Typ.
Evtl. musst du noch weitere Module in die Blacklist mit aufnehmen?
Z.B. das ath-Modul?
 

About

The Proxmox community has been around for many years and offers help and support for Proxmox VE and Proxmox Mail Gateway. We think our community is one of the best thanks to people like you!

Get your subscription!

The Proxmox team works very hard to make sure you are running the best software and getting stable updates and security enhancements, as well as quick enterprise support. Tens of thousands of happy customers have a Proxmox subscription. Get your own in 60 seconds.

Buy now!