Skip to content

Instantly share code, notes, and snippets.

@bbak
Last active February 10, 2023 10:12
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save bbak/44c477a920fe76a047841808073c5c12 to your computer and use it in GitHub Desktop.
Save bbak/44c477a920fe76a047841808073c5c12 to your computer and use it in GitHub Desktop.
Debian 9 / Stretch: Umstellung auf Predictable Network InterfaceNames

Warnung an alle, die dieses Gist finden: Ich habe hier nur dokumentiert, was ich im Rahmen einer Umstellung herausgefunden habe. Es gibt Garantie auf Richtigkeit der Informationen, Zusammenhänge oder ob das unter allen Umständen wie hier beschrieben funktioniert.

Predictable Network InterfaceNames

Debian stellt auf ein anderes System von Namen für Netzwerkinterfaces um. In Debian 9 gehen noch die alten, manuell festgelegten - was der Standard ist, wenn man von Debian 8 aktualisiert.
Ab Debian 10 wird dieses System, welches mit udev und systemd zusammen hängt, zum Standard.

Mit zless /usr/share/doc/udev/README.Debian.gz kann man Debian-spezifische Informationen zu dem Thema finden.
Unter anderem auch, dass (und wie) man diesen Mechanismus in Debian 9 Stretch umgehen kann.

Neue Methode aktivieren und deaktivieren

Die einfachste Methode, mit der man dieses Verhalten umgehen kann, ist der Kernel-Parameter net.ifnames=0 beim Booten.

Die etwas schwierigere Methode, die aber die eigentlich richtige ist, hängt mit systemd und udev zusammen, denn systemd wertet beim Start des Systems udev-Regeln aus.

Grundsätzlich ist es so, dass Systemd Dateien in 2 (eigentlich 3) Ordnern liegen:

  • Unter /lib/systemd liegen die mit der Distrubution mitgelieferten, grundlegenden Dateien.
  • Liegt eine Datei unter /etc/systemd maskiert diese die erste und hat Priorität.

Altes Schema beibehalten

Die Datei /lib/systemd/network/99-default.link implementiert die Predictable Network InterfaceNames. In dieser steht unter anderem die Priorität verschiedener Mechnismen für die Namensfindung: NamePolicy=kernel database onboard slot path. Dies ersten drei dieser Liste liefern bei Stretch kein Ergebnis - und somit wird dann slot verwendet.
Erzeugt man eine leere Datei /etc/systemd/network/99-default.link - oder besser einen Symlink auf /dev/null, wie es offiziell empfohlen wird - dann wird das alte Namensschema verwendet.

Migration auf neues Schema nach einem Upgrade

Einerseits muss man sicher stellen, dass die Datei /etc/systemd/network/99-default.link nicht existiert.

  • Auf echter Hardware stehen in der Datei /etc/udev/rules.d/70-persistent-net.rules die derzeitigen Interface Namen. Außerdem muss man die obige Datei umbenennen; z. B. durch anfügen von ".old". Außerdem kann es sein, dass es die Datei /lib/udev/rules.d/75-persistent-net-generator.rules gibt. Diese erzeugt obige Datei, wenn diese nicht existiert. Um das zu unterbinden, muss man auch diese maskieren mit ln -s /dev/null /etc/udev/rules.d/75-persistent-net-generator.rules
  • Auf virtueller (und auch realer) Hardware kann man diese mit ip link herausfinden. Außerdem kann hier das Script /etc/udev/rules.d/80-net-setup-link.rules existieren, welches ebenfalls verhindert, dass die neuen Namen verwendet werden. Dementsprechend muss auch das gelöscht werden.

Ich gehe nun mal davon aus, dass der 'alte' Name das übliche eth0 ist. Bei mehreren Interfaces muss man das im Folgenden beschriebene entsprechend mehrfach anwenden. Btw.: das loopback device heißt weiterhin lo. :-)

Neuen Namen finden1

# Befehl
udevadm test-builtin net_id /sys/class/net/eth0 | grep '^ID_NET_NAME_'

# Output:
ID_NET_NAME_MAC=enx00505686000e
ID_NET_NAME_PATH=enp3s0
ID_NET_NAME_SLOT=ens160

Unter Ubuntu kann das auch der biosdevname sein: biosdevname -i eth0, was man dann auch u. U. via Kernel Parameter deaktivieren muss2.

Also wird ens160 (höchstwahrscheinlich) neue Interface Name.

Nach der Umstellung kann man z. B. mit diesem Befehl diverse udev Daten zum Device abfragen: udevadm info -e | grep -A 10 ^P.*ens160 - natürlich auch vor der Umstellung mit den passenden Interface Namen.

Konfigurationsdateien ändern

Mit diesem neuen Namen muss man nun freilich alle Vorkommen des alten Interface-Namens in Konfigurationsdateien ändern. Diese kann man so finden:

cd /etc
find . -type f,l -exec grep -in "eth0" {} 2>/dev/null +

Am wichtigsten ist wohl /etc/network/interfaces. In dieser kann man das neue Device auch (temporär) zusätzlich eintragen; wenn das alte nicht da ist, dann wird's halt nicht aktiviert.

Änderungen anwenden

So oder so muss man die initial RAMDisk neu bauen: update-initramfs -u.

Und neu starten: systemctl reboot

Nur das Netzwerk neu starten

Achtung ungetestet!

Das kann entweder über den Systemd NetworkManager oder das Unit File network(ing)?.service passieren. Was davon in Verwendung ist, findet man so heraus:

# entweder
ls /etc/systemd/system/*.wants
# oder
systemctl is-active NetworkManager.service
systemctl is-active networking.service
systemctl is-active network.service

Quellen

Footnotes

  1. https://serverfault.com/questions/856850/predictable-network-interface-names-in-systemd/858313

  2. https://github.com/andsens/bootstrap-vz/issues/245

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment