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.
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.
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.
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.
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 mitln -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.
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.
So oder so muss man die initial RAMDisk neu bauen: update-initramfs -u
.
Und neu starten: systemctl reboot
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
- Predictable Network Interface Names bei Freedesktop.org
- Predictable Network Interface Names im DEbian Wiki
- Alle man-Pages, die mit Systemd zu tun haben. Diese sind teilweise aktueller, als die, die mit der Distribution kommen.
- Understanding systemd’s predictable network device names.
- How to enable "Predictable Network Interface Names"?
- systemd-networkd - how to force new configuration without reboot?
- Netzwerk Schnittstellen Bezeichnung (Ubuntuusers Wiki)
- Viel Try & Error in einer VM.