Predictable Network Interface Names: renameN

Ich habe mittlerweile den Ruf, generell alles Neue abzulehnen, einfach, weil es neu ist. Aber ich rante ja nicht gegen systemd oder die angeblich »predictable« Interfacenamen, weil es mir Spaß macht, sondern weil der Scheiß halt einfach nicht wie angepriesen – oder zumindest prinzipiell besser als das, was es vorher gab – funktioniert …

Seit bald rund einem halben Jahrzehnt baue ich ja nun auch an »kommunistischen Frickelnetzen«, wie Kollege Max aus Paderborn die Freifunk-Netze liebevoll nennt. Dabei werden oft gut abgehangene Systeme (5+ Jahre alt, also mehr als einmal abgeschrieben) genutzt, die uns dankenswerterweise gespendet werden, weiteres Zubehör stammt gerne günstig aus der Bucht und ist auch nicht grade taufrisch.

Und in diesem Kontext geht mir derzeit mal wieder der PNIN-Kram auf den Zeiger, denn am Chelsio T320 10GbE Dual Port Adapter verschluckt sich mindestens Ubuntu 16.04 — im aktuellen Setup heißt das eine der beiden Interfaces, welches einen SFP+-Einschub und daran einen Link hat, »renameN«, mit N sich bei jedem Reboot ändernd:

root@chimaera:~# lshw -businfo -C network | awk 'BEGIN{tmpfile=sprintf("/tmp/awk-%d.tmp", systime()); printf("%-10s %-10s %s\n", "Pred. Name", "BIOS Name", "Hardware");} /^pci.*network/ {predname=$2; line=$0; pcistr=$1; devstr=substr($0, index($0, $4)); cmdline=sprintf("biosdevname -i %s >%s\n", predname, tmpfile); system(cmdline); getline <tmpfile ; close(tmpfile); biosname=$1; if(biosname==pcistr) biosname="-"; printf("%-10s %-10s %s\n", predname, biosname, devstr);} END{cmdline=sprintf("/bin/rm %s", tmpfile); system(cmdline);}'
Pred. Name BIOS Name  Hardware
ens2f0     p2p1       NX3031 Multifunction 1/10-Gigabit Server Adapter
ens2f1     p2p2       NX3031 Multifunction 1/10-Gigabit Server Adapter
enp3s0f0   em1        NetXtreme II BCM5709 Gigabit Ethernet
enp3s0f1   em2        NetXtreme II BCM5709 Gigabit Ethernet
enp4s0f0   em3        NetXtreme II BCM5709 Gigabit Ethernet
enp4s0f1   em4        NetXtreme II BCM5709 Gigabit Ethernet
rename6    -          T320 10GbE Dual Port Adapter
ens1       -          Ethernet interface

Spannend dabei ist, daß es nicht einmal seitens des BIOS eine Namenvorgabe gibt — für keines der beiden Interfaces.

Gut, das kann man zum Glück noch per udev-Regeln lösen …

root@chimaera:~# cat /etc/udev/rules.d/10-persistent-network.rules 
ACTION=="add", SUBSYSTEM=="net",ATTR{address}=="00:07:43:00:00:00",NAME="ens1f0"
ACTION=="add", SUBSYSTEM=="net",ATTR{address}=="00:07:43:00:00:01",NAME="ens1f1"

… aber sollten nicht heutzutage die Namen »predictable«, vorhersagbar, sein? »renameX« ist eher ein Zeichen von Hilflosigkeit …

Wie man es dreht und wendet, einmal mehr hat »das Neue« sein Versprechen, alles besser und schöner zu machen, nicht gehalten.


Epilog: Richtig »Spaß« hatte ich, als ich den Server mit 4.15.0-34-generic nach der Installation von »biosdevname« rebootete:

root@chimaera:~# egrep 'Linux version|Command line:' /var/log/syslog
Sep 23 10:34:22 chimaera kernel: [    0.000000] Linux version 4.15.0-34-generic (buildd@lgw01-amd64-037) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10)) #37~16.04.1-Ubuntu SMP Tue Aug 28 10:44:06 UTC 2018 (Ubuntu 4.15.0-34.37~16.04.1-generic 4.15.18)
Sep 23 10:34:22 chimaera kernel: [    0.000000] Command line: BOOT_IMAGE=/vmlinuz-4.15.0-34-generic root=/dev/mapper/chimaera--vg-root ro
root@chimaera:~# lshw -businfo -C network | awk 'BEGIN{tmpfile=sprintf("/tmp/awk-%d.tmp", systime()); printf("%-10s %-10s %s\n", "Pred. Name", "BIOS Name", "Hardware");} /^pci.*network/ {predname=$2; line=$0; pcistr=$1; devstr=substr($0, index($0, $4)); cmdline=sprintf("biosdevname -i %s >%s\n", predname, tmpfile); system(cmdline); getline <tmpfile ; close(tmpfile); biosname=$1; if(biosname==pcistr) biosname="-"; printf("%-10s %-10s %s\n", predname, biosname, devstr);} END{cmdline=sprintf("/bin/rm %s", tmpfile); system(cmdline);}'
Pred. Name BIOS Name  Hardware
p2p1       p2p1       NX3031 Multifunction 1/10-Gigabit Server Adapter
p2p2       p2p2       NX3031 Multifunction 1/10-Gigabit Server Adapter
em1        em1        NetXtreme II BCM5709 Gigabit Ethernet
em2        em2        NetXtreme II BCM5709 Gigabit Ethernet
em3        em3        NetXtreme II BCM5709 Gigabit Ethernet
em4        em4        NetXtreme II BCM5709 Gigabit Ethernet
ens1       -          T320 10GbE Dual Port Adapter
rename6    -          Ethernet interface

»Vorhersagbar« war auch das eher nicht — und im Endeffekt war der Server ohne Netz. Es stellte sich heraus, daß die schiere Installation des »biosdevname«-Packetes dazu führt, daß zwingend die BIOS-Namen verwendet wurde. Ausschlaggebend ist dafür eine Datei, die mitinstalliert wird; kommentiert man dort GOTO="netdevicename_end" aus, …

root@chimaera:~# diff -u 71-biosdevname.rules.dist /lib/udev/rules.d/71-biosdevname.rules
--- 71-biosdevname.rules.dist   2018-09-26 11:56:20.355804576 +0100
+++ /lib/udev/rules.d/71-biosdevname.rules      2018-09-26 11:56:40.132482266 +0100
@@ -12,7 +12,7 @@
 ENV{UDEV_BIOSDEVNAME}=="1", GOTO="netdevicename_start"
 
 # uncomment the next line for biosdevname to be off by default
-# GOTO="netdevicename_end"
+GOTO="netdevicename_end"
 
 LABEL="netdevicename_start"

… und baut die initrd neu (update-initramfs -u), ist nach einem weiteren Reboot die Normalität wiederhergestellt.

Seriously?! Ich installiere ein Package, reboote — und habe kein Netz mehr? Was immer Packager und Maintainer da für Zeug geraucht haben: es war schlecht! Sane defaults your ass? Der Pizzadeckel wurde entsprechend aktualisiert …