PassThru QLogic FC-HBA VPort

antubis

Renowned Member
Apr 20, 2012
19
0
66
Ist es irgendwie möglich, einen einzelnen VPort (eine WWN) eines QLogic Fiber Channel HBA an eine VM durchzureichen? Der HBA unterstützt NPIV und das Anlegen von VPorts funktioniert problemlos.

Wir archivieren für verschieden Kunden große Datenmengen (noch) auf Tape und haben dazu mehrere große TapeLibraries mit jeweils mehreren Laufwerken. Ziel ist dass mehrere VMs den HBA des Hostsystems mit jeweils eigenen dedizierten WWNs nutzen können.
Diese dedizierten WWNs sollen dann sicherstellen (über das Zoning auf dem FC-Switch), dass jede VM nur die ihr explizit zugewiesenen TapeDrives sehen kann.

Falls das so nicht geht, gibt es alternative Lösungen?
 
Der HBA unterstützt NPIV und das Anlegen von VPorts funktioniert problemlos.
Das klingt verdächtig nach SR-IOV.
Ist dir der Unterschied zu komplettem passthrough bekannt?

Schau mal, was du mit lspci bzw. lspci -vv zu dem HBA angezeigt bekommst und ob da Info ablesbar bezüglich VF (virtual functions) ist. Entweder gibt sich der HBA bereits so schon als Mehrfachgerät mit mehreren PCI-IDs bekannt oder es erscheinen dann danach die IDs, wenn du mit dem HBA die virtual functions geschaltet hast (oft kann man das im UEFI-BIOS aktivieren, aber da fehlt mir die Erfahrung). In beiden Fällen dann proxmoxseitig Hardware->PCI passthrough entweder auf eine VF oder auf eine Unter-ID vom HBA. (Siehst du nur den HBA als single-ID ist das noch nicht das, was du willst)
 
Hallo mr44er,

danke für deine Antwort.

Das klingt verdächtig nach SR-IOV.
Ist dir der Unterschied zu komplettem passthrough bekannt?
Wenn du so fragst, dann tatsächlich nicht wirklich. PCI-Passthrough hatte ich bisher garnicht benötigt und seitdem ich jetzt angefangen hab, das zu nutzen hab ich eben einfach das entsprechende Device ausgewählt und gut war.
Dass wir jetzt auf unserem neuen Cluster mit der nun nötigen FC-Fabric quasi "Virtuelle" HBAs benötigen ist was ganz Neues für mich.

Vor dem Anlegen der VPorts:
Code:
# ls -la /sys/class/fc_host/
total 0
drwxr-xr-x  2 root root 0 Dec 20 12:20 .
drwxr-xr-x 80 root root 0 Dec 20 12:20 ..
lrwxrwxrwx  1 root root 0 Jan  8 15:04 host34 -> ../../devices/pci0000:c0/0000:c0:01.1/0000:c1:00.0/host34/fc_host/host34
lrwxrwxrwx  1 root root 0 Jan  8 15:04 host37 -> ../../devices/pci0000:c0/0000:c0:01.1/0000:c1:00.1/host37/fc_host/host37

Nach dem Anlegen der VPorts (hier mal 3 Stück zur Demonstration):
Code:
# ls -la /sys/class/fc_host/
total 0
drwxr-xr-x  2 root root 0 Dec 20 12:20 .
drwxr-xr-x 80 root root 0 Dec 20 12:20 ..
lrwxrwxrwx  1 root root 0 Jan  8 15:04 host34 -> ../../devices/pci0000:c0/0000:c0:01.1/0000:c1:00.0/host34/fc_host/host34
lrwxrwxrwx  1 root root 0 Jan  8 15:04 host37 -> ../../devices/pci0000:c0/0000:c0:01.1/0000:c1:00.1/host37/fc_host/host37
lrwxrwxrwx  1 root root 0 Jan  9 13:48 host38 -> ../../devices/pci0000:c0/0000:c0:01.1/0000:c1:00.1/host37/vport-37:0-1/host38/fc_host/host38
lrwxrwxrwx  1 root root 0 Jan  9 13:48 host39 -> ../../devices/pci0000:c0/0000:c0:01.1/0000:c1:00.1/host37/vport-37:0-2/host39/fc_host/host39
lrwxrwxrwx  1 root root 0 Jan  9 13:48 host40 -> ../../devices/pci0000:c0/0000:c0:01.1/0000:c1:00.1/host37/vport-37:0-3/host40/fc_host/host40

lspci zeigt bisher immer noch nur die 2 physikalischen Ports an:
Code:
c1:00.0 Fibre Channel: QLogic Corp. ISP2722-based 16/32Gb Fibre Channel to PCIe Adapter (rev 01)
c1:00.1 Fibre Channel: QLogic Corp. ISP2722-based 16/32Gb Fibre Channel to PCIe Adapter (rev 01)

hier noch der Port mit den VPorts mit lspci -vv:
Code:
c1:00.1 Fibre Channel: QLogic Corp. ISP2722-based 16/32Gb Fibre Channel to PCIe Adapter (rev 01)
        Subsystem: QLogic Corp. QLE2692 Dual Port 16Gb Fibre Channel to PCIe Adapter
        Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr+ Stepping- SERR+ FastB2B- DisINTx-
        Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        Latency: 0, Cache Line Size: 64 bytes
        Interrupt: pin B routed to IRQ 1214
        NUMA node: 0
        IOMMU group: 14
        Region 0: Memory at 20020004000 (64-bit, prefetchable) [size=4K]
        Region 2: Memory at 20020000000 (64-bit, prefetchable) [size=8K]
        Region 4: Memory at 2001fe00000 (64-bit, prefetchable) [size=1M]
        Expansion ROM at b8900000 [disabled] [size=256K]
        Capabilities: [44] Power Management version 3
                Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
                Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
        Capabilities: [4c] Express (v2) Endpoint, MSI 00
                DevCap: MaxPayload 2048 bytes, PhantFunc 0, Latency L0s <4us, L1 <1us
                        ExtTag- AttnBtn- AttnInd- PwrInd- RBE+ FLReset- SlotPowerLimit 75W
                DevCtl: CorrErr+ NonFatalErr+ FatalErr+ UnsupReq+
                        RlxdOrd+ ExtTag- PhantFunc- AuxPwr- NoSnoop+
                        MaxPayload 512 bytes, MaxReadReq 4096 bytes
                DevSta: CorrErr+ NonFatalErr- FatalErr- UnsupReq+ AuxPwr- TransPend-
                LnkCap: Port #0, Speed 8GT/s, Width x8, ASPM L1, Exit Latency L1 <2us
                        ClockPM- Surprise- LLActRep- BwNot- ASPMOptComp+
                LnkCtl: ASPM Disabled; RCB 64 bytes, Disabled- CommClk+
                        ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
                LnkSta: Speed 8GT/s, Width x8
                        TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
                DevCap2: Completion Timeout: Range B, TimeoutDis+ NROPrPrP- LTR-
                         10BitTagComp- 10BitTagReq- OBFF Not Supported, ExtFmt- EETLPPrefix-
                         EmergencyPowerReduction Not Supported, EmergencyPowerReductionInit-
                         FRS- TPHComp- ExtTPHComp-
                         AtomicOpsCap: 32bit- 64bit- 128bitCAS-
                DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis- LTR- 10BitTagReq- OBFF Disabled,
                         AtomicOpsCtl: ReqEn-
                LnkSta2: Current De-emphasis Level: -6dB, EqualizationComplete- EqualizationPhase1-
                         EqualizationPhase2- EqualizationPhase3- LinkEqualizationRequest-
                         Retimer- 2Retimers- CrosslinkRes: unsupported
        Capabilities: [88] Vital Product Data
                Product Name: QLogic 16Gb 2-port FC to PCIe Gen3 x8 Adapter
                Read-only fields:
                        [PN] Part number: QLE2692
                        [SN] Serial number: RFD2341F75826
                        [EC] Engineering changes: BK3210407-05  H
                        [V9] Vendor specific: 010606
                        [RV] Reserved: checksum good, 0 byte(s) reserved
                End
        Capabilities: [90] MSI-X: Enable+ Count=16 Masked-
                Vector table: BAR=2 offset=00000000
                PBA: BAR=2 offset=00001000
        Capabilities: [9c] Vendor Specific Information: Len=0c <?>
        Capabilities: [100 v1] Advanced Error Reporting
                UESta:  DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
                UEMsk:  DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq+ ACSViol-
                UESvrt: DLP+ SDES+ TLP- FCP+ CmpltTO+ CmpltAbrt- UnxCmplt+ RxOF+ MalfTLP+ ECRC+ UnsupReq- ACSViol-
                CESta:  RxErr- BadTLP- BadDLLP- Rollover- Timeout- AdvNonFatalErr-
                CEMsk:  RxErr- BadTLP- BadDLLP- Rollover- Timeout- AdvNonFatalErr-
                AERCap: First Error Pointer: 00, ECRCGenCap+ ECRCGenEn- ECRCChkCap+ ECRCChkEn-
                        MultHdrRecCap- MultHdrRecEn- TLPPfxPres- HdrLogCap-
                HeaderLog: 00000000 00000000 00000000 00000000
        Capabilities: [154 v1] Alternative Routing-ID Interpretation (ARI)
                ARICap: MFVC- ACS-, Next Function: 0
                ARICtl: MFVC- ACS-, Function Group: 0
        Capabilities: [1f4 v1] Vendor Specific Information: ID=0001 Rev=1 Len=014 <?>
        Kernel driver in use: qla2xxx
        Kernel modules: qla2xxx

zum Prüfen/Anpassen der UEFI-BIOS-Settings brauch ich noch ne Downtime, das kann ich vmtl. morgen machen.
 
Wenn du so fragst, dann tatsächlich nicht wirklich. PCI-Passthrough hatte ich bisher garnicht benötigt und seitdem ich jetzt angefangen hab, das zu nutzen hab ich eben einfach das entsprechende Device ausgewählt und gut war.
Komplettes passthrough heißt wortwörtlich, dass das ganze Gerät vom Host verschwindet, in der VM auftaucht und auch von dort aus gesteuert wird. Flapsig ausgedrückt: die Karte wird in die VM gesteckt. ;)
Jetzt kommt dir die Karte noch entgegen und meldet sich mit 2 IDs. Das heißt, du könntest sogar einen der Ports getrennt komplett durchreichen (und vom Host verschwinden lassen) oder je einen Port in unterschiedliche VMs. Je nach Anwendungszweck kann das schon ausreichen und auf jeden Fall ist das komplette passthrough die performanteste Variante. (was nicht heißt, dass SR-IOV schnarchig ist)

Bei SR-IOV verbleibt die Karte auf dem Host (und da auch die Kontrolle), die virtual functions sind dann virtuelle Geräte, die man auf die gleiche Art durchreicht. Wie man die dann von außen verbindet oder mit IPs erreicht, weiß ich nicht. Da muss wer anders was dazu sagen, mir fehlt da die Erfahrung. (wahrscheinlich ähnlich eines vlans, nur eben am Host vorbei?)

Nach dem Anlegen der VPorts (hier mal 3 Stück zur Demonstration):
Ah, schau an, das ist das und die müsstest du eigentlich auch jetzt bei lspci sehen. So sind die "greifbar" fürs Durchreichen. Wenn du das live machen kannst, dann weißt du mehr als ich und brauchst dann nicht extra ins BIOS. Es kann aber nicht schaden, dass du da trotzdem beim nächsten geplanten reboot mal reinschaust.
 
Jetzt kommt dir die Karte noch entgegen und meldet sich mit 2 IDs. Das heißt, du könntest sogar einen der Ports getrennt komplett durchreichen (und vom Host verschwinden lassen) oder je einen Port in unterschiedliche VMs
naja... es sind ja auch zwei physikalische Ports auf der Karte. aber die reichen eben nicht aus für unsere Zwecke, sonst hätte ich ja kein Problem ;-)
(abgesehen davon, dass jeder genutzte Hardwareport mehr Verkabelung bedeutet)

Ah, schau an, das ist das und die müsstest du eigentlich auch jetzt bei lspci sehen. So sind die "greifbar" fürs Durchreichen. Wenn du das live machen kannst, dann weißt du mehr als ich und brauchst dann nicht extra ins BIOS. Es kann aber nicht schaden, dass du da trotzdem beim nächsten geplanten reboot mal reinschaust.
Das war auch genau das was ich gehofft hatte, aber ich bekomme eben keine neuen PCI-IDs mit den VPorts, die ich einer VM zuweisen könnte:
Code:
# ls -la /sys/class/fc_host/
total 0
drwxr-xr-x  2 root root 0 Jan 10 07:41 .
drwxr-xr-x 80 root root 0 Jan 10 07:41 ..
lrwxrwxrwx  1 root root 0 Jan 10 07:42 host34 -> ../../devices/pci0000:c0/0000:c0:01.1/0000:c1:00.0/host34/fc_host/host34
lrwxrwxrwx  1 root root 0 Jan 10 07:42 host37 -> ../../devices/pci0000:c0/0000:c0:01.1/0000:c1:00.1/host37/fc_host/host37
lrwxrwxrwx  1 root root 0 Jan 10 07:49 host38 -> ../../devices/pci0000:c0/0000:c0:01.1/0000:c1:00.1/host37/vport-37:0-0/host38/fc_host/host38
lrwxrwxrwx  1 root root 0 Jan 10 07:49 host39 -> ../../devices/pci0000:c0/0000:c0:01.1/0000:c1:00.1/host37/vport-37:0-1/host39/fc_host/host39
lrwxrwxrwx  1 root root 0 Jan 10 07:49 host40 -> ../../devices/pci0000:c0/0000:c0:01.1/0000:c1:00.1/host37/vport-37:0-2/host40/fc_host/host40
# lspci |grep -i qlogic
c1:00.0 Fibre Channel: QLogic Corp. ISP2722-based 16/32Gb Fibre Channel to PCIe Adapter (rev 01)
c1:00.1 Fibre Channel: QLogic Corp. ISP2722-based 16/32Gb Fibre Channel to PCIe Adapter (rev 01)
# ls -la /sys/bus/pci/devices/0000\:c1*
lrwxrwxrwx 1 root root 0 Jan 10 07:41 /sys/bus/pci/devices/0000:c1:00.0 -> ../../../devices/pci0000:c0/0000:c0:01.1/0000:c1:00.0
lrwxrwxrwx 1 root root 0 Jan 10 07:41 /sys/bus/pci/devices/0000:c1:00.1 -> ../../../devices/pci0000:c0/0000:c0:01.1/0000:c1:00.1


Im BIOS ist SR-IOV aktiviert:
2025-01-10_07-39.png
 
Tauchen die als mdev (mediated devices) oder mapped auf, wenn du in einer VM auf add->PCI device klickst?
Möglicherweise muss man im BIOS noch dieses ARI (Alternative Routing-ID Interpretation) durchkonfigurieren, aber bis hierher wars das mit meinen Ideen.
 
Tauchen die als mdev (mediated devices) oder mapped auf, wenn du in einer VM auf add->PCI device klickst?
Nein, leider nicht.

Ich hab jetzt nochmal n bisschen rumprobiert und auch mal ne VM mit nem Device mit VPorts gestartet. Das bringt leider garnichts. So wie ich das verstehe sind die VPorts nur extra WWNs (so ne Art MAC-Adressen im FC-Fabric), die der Treiber des HBA im Fabric für sich announced.

Sobald man aber die VM mit dem durchgereichten HBA startet, läuft das Device aber nicht mehr über den Herstellertreiber qla2xxx, sondern über vfio-pci und die vorher angelegten VPorts sind mit dem "unbind" des Herstellertreibers wieder weg.
Meinem aktuellen Verständnis nach (und dank deiner Erklärung) würde ich sagen, es findet hier kein SR-IOV statt und das Device wird komplett in die VM geschoben (wo dann ggfs. wieder der qla2xxx-Treiber läuft).

Ich finde im sysfs-Eintrag des Devices auch keine der in den SR-IOV-Dokus angegebenen Configmöglichkeiten (e.g. sriov_numvfs), ich glaube also nicht, dass der HBA das unterstützt.

In Vmware gibt es wohl Möglichkeiten FC-HBAs zu virtualisieren (über eine Art FC-vSwitch) und nur einzelne WWNs statt dem ganzen Controller an die VMs zu geben (zumindest gibt es einige Dokus in die Richtung), scheinbar gibt es die in der Form in Proxmox bzw. allgemein KVM wohl nicht?!
 
Sobald man aber die VM mit dem durchgereichten HBA startet, läuft das Device aber nicht mehr über den Herstellertreiber qla2xxx, sondern über vfio-pci und die vorher angelegten VPorts sind mit dem "unbind" des Herstellertreibers wieder weg.
Meinem aktuellen Verständnis nach (und dank deiner Erklärung) würde ich sagen, es findet hier kein SR-IOV statt und das Device wird komplett in die VM geschoben (wo dann ggfs. wieder der qla2xxx-Treiber läuft).
Genau, das ist das komplette passthrough (wenn du die oberste PCI-ID "Eltern-ID" nimmst). Dass es überhaupt zwei sind und nicht eine, ist übrigens Luxus, der nicht immer gegeben sein muss. Bei SAS-HBAs kenne ich es so, dass es nur eine ID gibt und du kannst da nicht einen der beiden Ports wählen, das ist alles oder nichts. Die SR-IOV Ableger wären dann zwar auch unter den IDs verordnet, aber eben vorhanden und wählbar. Bei Intel-NICs dann 4 echte Ports jeweils + 32 VFs auswählbar.

ich glaube also nicht, dass der HBA das unterstützt.
Du hast vollkommen Recht. NPIV ist was komplett anderes https://datei.wiki/definition/n-port-id-virtualisierung-npiv-ein-umfassender-leitfaden/

Und wahrscheinlich siehts schlecht aus, wenn das veraltete Info aber noch aktuell sein sollte: https://forum.proxmox.com/threads/npiv-vhba-on-proxmox.47839/
 
Hi, das hat tatsächlich nichts mir PCI zu tun. Es werden virtuelle SCSI Devices gebaut. Wenn ich mir die Doku von Redhat anschaue, dann sollte das theoretisch auch mit Proxmox gehen. Dazu müsste man die virtuellen SCSI Devices der VM irgendwie per CLI oder direkt über die Konfigurationsdatei hinzufügen.