linux "scripting" - bloody nub needs help

Shihatsu

Administrator
Mitglied seit
26.09.2001
Beiträge
44.790
Reaktionen
8.239
Also, ich habe mehrere PCIe devices in einem Computer, auf diesem läuft debian.
Eines dieser PCIe devices ist eine Netzwerkkarte. Diese hat eine PCIe BUS id, diese kann ich rausfinden, relativ simpel via lspci.
Ich brauche aber gar nicht die PCIe id, ich brauche die Netzwerkkartenbetzeichnung wie sie auch ein "ip link" anzeigt.
Also, wie komme ich von:
lspci |grep Mellanox |tr '\n' ' ' |cut -d ' ' -f1 --> 06:00.0
zu
enp6s0 (wie in ip link set dev enp6s0)?
 

Shihatsu

Administrator
Mitglied seit
26.09.2001
Beiträge
44.790
Reaktionen
8.239
Ich habe mehrere PCIe devices. Diese haben eine PCIe ID - im Beispiel 06:00.0. Diese kann ich raus finden, auch wenn sie sich ändert (zum Beispiel durch Änderung an den PCIe Busen, was z.B. durch eine hinzugefügte PCIe-Ressource stattfinden kann (Einbau einer neuen Karte in einen freien Slot z.B.).
Ich habe ein Skript, das zu einer vorhandenen Netzwerkkarte anhand ihres Netzwerknamens (das was früher eth0 war, vor systemd) via ip link eine MAC Adresse (genauer: derer 8, sind virtuelle Netzwerkkarten gemappt auf 2 physische Devices mittels SR-IOV, aber eine würde auch erst mal reichen) setzt - von Haus aus booten die nämlich alle mit 00:00:00:00:00:00, was kackkack ist. Im Beispiel ist das enp6s0.
Ich möchte das Skript dynamisch machen, so das nicht drin steht "setze ip link auf enp6s0" sondern "setze IP link auf <finde mir die richtige netzwerkkartenbezeichnung raus>" falls sich diese ändert.
Das Script ist realisiert als systemd service sieht atm so aus:
Bash:
cat /etc/systemd/system/mellanox-vf-mac.service
[Unit]
Description=Script to manually set MACs to VFs
[Service]
Type=oneshot
# Setting static MAC for VFs
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set dev enp6s0 vf 0 mac 02:00:00:00:00:00'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set dev enp6s0 vf 1 mac 02:00:00:00:00:01'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set dev enp6s0 vf 2 mac 02:00:00:00:00:02'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set dev enp6s0 vf 3 mac 02:00:00:00:00:03'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set dev enp6s0 vf 4 mac 02:00:00:00:00:04'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set dev enp6s0 vf 5 mac 02:00:00:00:00:05'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set dev enp6s0 vf 6 mac 02:00:00:00:00:06'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set dev enp6s0 vf 7 mac 02:00:00:00:00:07'
WantedBy=multi-user.target

So deutlicher?
 
Mitglied seit
23.07.2014
Beiträge
4.973
Reaktionen
419
keine ahnung aber das sagt chatgpt
Um von der PCIe-BUS-ID, die du mit `lspci` erhalten hast, zur Netzwerkkartenbezeichnung wie sie von `ip link` angezeigt wird, zu gelangen, kannst du den Befehl `ip` zusammen mit einigen anderen Tools verwenden. Hier ist ein Schritt-für-Schritt-Ansatz, den du befolgen kannst:

1. Verwende den Befehl `lspci -v` (ohne das `grep`), um detaillierte Informationen über die Netzwerkkarte zu erhalten. Suche nach der Zeile, die die Netzwerkkarte identifiziert, und notiere dir die Domain:Bus:Device.Function (DBDF) Adresse. Angenommen, du hast die Adresse `06:00.0` erhalten.

2. Verwende den Befehl `lspci -v -s <DBDF>` mit der DBDF-Adresse, um weitere Informationen über die Netzwerkkarte zu erhalten. Suche nach der Zeile "Kernel driver in use" (z. B. "Kernel driver in use: mlx5_core") und notiere dir den verwendeten Kernel-Treiber. Notiere dir auch den Gerätename (z. B. "DeviceName").

3. Verwende den Befehl `ip link` zusammen mit dem `grep`-Befehl, um die Netzwerkkartenbezeichnung anhand des Gerätenamens zu finden. Führe den folgenden Befehl aus, wobei du "DeviceName" mit dem tatsächlichen Namen ersetzt:

```shell
ip link | grep -B1 "DeviceName" | head -n 1 | awk -F ": " '{print $2}'
```

Dadurch wird die Netzwerkkartenbezeichnung wie sie von `ip link` angezeigt wird (z. B. "enp6s0") ausgegeben.

Zusammengefasst sehen die Schritte so aus:

```shell
# Schritt 1: DBDF-Adresse erhalten
lspci -v

# Schritt 2: Kernel-Treiber und Gerätename ermitteln
lspci -v -s <DBDF>

# Schritt 3: Netzwerkkartenbezeichnung ermitteln
ip link | grep -B1 "DeviceName" | head -n 1 | awk -F ": " '{print $2}'
```

Stelle sicher, dass du "DeviceName" in Schritt 3 mit dem tatsächlichen Gerätenamen ersetzt, den du in Schritt 2 erhalten hast.
 

Benrath

Community-Forum
Mitglied seit
19.05.2003
Beiträge
19.523
Reaktionen
684
keine ahnung aber das sagt chatgpt
Um von der PCIe-BUS-ID, die du mit `lspci` erhalten hast, zur Netzwerkkartenbezeichnung wie sie von `ip link` angezeigt wird, zu gelangen, kannst du den Befehl `ip` zusammen mit einigen anderen Tools verwenden. Hier ist ein Schritt-für-Schritt-Ansatz, den du befolgen kannst:

1. Verwende den Befehl `lspci -v` (ohne das `grep`), um detaillierte Informationen über die Netzwerkkarte zu erhalten. Suche nach der Zeile, die die Netzwerkkarte identifiziert, und notiere dir die Domain:Bus:Device.Function (DBDF) Adresse. Angenommen, du hast die Adresse `06:00.0` erhalten.

2. Verwende den Befehl `lspci -v -s <DBDF>` mit der DBDF-Adresse, um weitere Informationen über die Netzwerkkarte zu erhalten. Suche nach der Zeile "Kernel driver in use" (z. B. "Kernel driver in use: mlx5_core") und notiere dir den verwendeten Kernel-Treiber. Notiere dir auch den Gerätename (z. B. "DeviceName").

3. Verwende den Befehl `ip link` zusammen mit dem `grep`-Befehl, um die Netzwerkkartenbezeichnung anhand des Gerätenamens zu finden. Führe den folgenden Befehl aus, wobei du "DeviceName" mit dem tatsächlichen Namen ersetzt:

```shell
ip link | grep -B1 "DeviceName" | head -n 1 | awk -F ": " '{print $2}'
```

Dadurch wird die Netzwerkkartenbezeichnung wie sie von `ip link` angezeigt wird (z. B. "enp6s0") ausgegeben.

Zusammengefasst sehen die Schritte so aus:

```shell
# Schritt 1: DBDF-Adresse erhalten
lspci -v

# Schritt 2: Kernel-Treiber und Gerätename ermitteln
lspci -v -s <DBDF>

# Schritt 3: Netzwerkkartenbezeichnung ermitteln
ip link | grep -B1 "DeviceName" | head -n 1 | awk -F ": " '{print $2}'
```

Stelle sicher, dass du "DeviceName" in Schritt 3 mit dem tatsächlichen Gerätenamen ersetzt, den du in Schritt 2 erhalten hast.
Lol wie ich auch darüber nachgedacht hatte so zu trollen und war bestimmt nicht der einzige. Dass aber Kritiker der sein würde der es tut. Chapeau
 

Shihatsu

Administrator
Mitglied seit
26.09.2001
Beiträge
44.790
Reaktionen
8.239
Ja, gut für die Lulkz und so, auch schön das wir das jetzt abgehakt haben - mehr davon tut aber nicht not, danke.
 
Mitglied seit
02.09.2002
Beiträge
3.234
Reaktionen
72
Guck mal unter /sys/class/net/* (linkname -> busId) bzw. /sys/devices/pci${bus}/${bus}/net (busId -> linkname)
 

Shihatsu

Administrator
Mitglied seit
26.09.2001
Beiträge
44.790
Reaktionen
8.239
DAfür brauche ich ja die device id - ich hab aber nur die pci bus id?
 
Mitglied seit
02.09.2002
Beiträge
3.234
Reaktionen
72
DAfür brauche ich ja die device id - ich hab aber nur die pci bus id?
mh?
Code:
~ ❯ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 40:8d:5c:0a:68:bc brd ff:ff:ff:ff:ff:ff
    altname enp0s25
3: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0
~ ❯ ls -1 /sys/devices/pci0000:00/0000:(lspci -mm | grep Ether | cut -d' ' -f1)/net/
eno1/
 
Oben