Skip to Main Content

Breadcrumb

fixe Namen für Netzwerkkarten

In älteren Linux Versionen wurden die Netzwerkkarten einfach eth0, eth1, etc. genannt, wobei die Reihenfolge jene war, wie die Netzwerkkarten während des Bootvorgangs erkannt wurden. Wenn man mehrere Netzwerkkarten verwendet hat, führte dies zeitweise dazu, dass sich die Reihenfolge geändert hat. Die Lösung war, die MAC Adresse in den ifcfg-eth* Files anzugeben und schon die jeweilige Netzwerkkarte immer das gleiche eth* Device.

Dann haben sich die Linux Kernel Entwickler überlegt, dass es doch viel besser ist, wenn man statt den einfachen eth* Namen den "echten" Devicenamen nimmt. Dieser enthält Informationen über welche interne Schnittstelle und auf welchen internen Steckplatz die Netzwerkkarte erreichbar ist. Damit bleibt der Name der Netzwerkkarte immer der gleiche - zumindest war das die Idee.

Leider haben die Kernel Entwickler nicht bedacht, dass man in der Praxis folgende - und vergleichbare - Tätigkeiten durchführt:

  • Umstecken einer Netzwerkkarte in einen anderen PCI Steckplatz oder Slot, weil dies aus verschiedensten Gründen (Einbau anderen Komponenten, Zugänglichkeit der Ports, ...) notwendig ist.
  • Blade Server Lösungen der verschiedensten Hersteller, wo man von Zeit zu Zeit einmal einen Blade Server von einem Chassis in ein andere Chassis übersiedeln muss.
  • Fällt ein Blade Server aus, oder wird dieser durch ein anderes Blade (andere CPU, Memory Ausstattung,...) ersetzt, reicht es bei vielen Herstellern - wie beispielsweise bei Cisco UCS - aus, die System Definition einem anderen Blade zuzuweisen. Sofern man SAN Boot nutzt, geht das mit wenigen Mausklicks und der Server läuft auf einem anderen Blade oder sogar in einem anderem Chassis.

Alle diese - und ähnliche Tätigkeiten - führen dazu, dass die MAC Adresse des Netzwerkinterfaces(ports) gleich bleibt, sich aber mit hoher Wahrscheinlichkeit der Devicenamen ändert.

Solange es nur wichtig ist, dass der Server wieder seine IP Addressen erhält - egal wie die Netzwerkkarte heisst - ist alles OK, aber wenn man eines der folgende nutzt:

  • BONDING ... Zusammenfassen von zwei oder mehreren Netzwerkkarten unter ein virtuelles BONDING Device
  • VLAN ... Zuweisung von VLANs direkt im Server
  • Virtualisierungslösungen ... wie Oracle Linux VM oder Oracle VM einsetzt

funktioniert plötzlich nichts mehr!

Der Grund ist, dass in den jeweiligen Konfigurationsfiles (Bonding, VLAN) die jeweiligen Devicenamen angeführt sind. Ändern sich diese, zeigt die Konfiguration plötzlich ins leere und nichts geht mehr. Bei Virtualisierungslösungen wie Oracle Linux VM - aber auch anderen auf Linux aufsetzenden Lösungen - ist das ganze noch schlimmer. Da die Konfiguration in der Regel auf einem Management Host erfolgt und dann über das Netzwerk an die physischen Server übertragen wird, scheitert an der Erreichbarkeit der physischen Server.

Aus diesem Grund, muss man bei aktuellen RedHat, Oracle Linux oder vergleichbaren Linux Distributionen dafür sorgen, dass die Zuordnung zwischen MAC Adresse und Netzwerkkarten Devicenamen sich nicht ändern kann.

Die korrekte Umsetzung

Es gibt mehrere Wege, wie man das erreichen kann, der korrekte Weg besteht aus drei Schritten.

Device Naming Rules

Hier werden die MAC Adressen wieder auf die Devicenamen gebunden.

cat /etc/udev/rules.d/70-persistent-net.rules
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:17:A3:21:b1:d7", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="enp6s0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:17:A3:21:a1:2b", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="enp7s0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:17:A3:21:b1:d6", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="enp8s0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:17:A3:21:b1:d5", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="enp9s0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:17:A3:21:a1:2a", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="enp15s0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:17:A3:21:b1:d4", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="enp16s0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:17:A3:21:a1:29", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="enp17s0"

Den Devicenamen und die MAC Adresse bekommt man am einfachsten mittels "ip address".

# ip address | grep -iA1 ensp6s0
2: ensp6s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
   link/ether 00:17:A3:21:b1:d7 brd ff:ff:ff:ff:ff:ff
   inet 192.168.0.22/24 brd 192.168.0.255 scope global noprefixroute eth0
      valid_lft forever preferred_lft forever

Anpassungen im der GRUB Konfiguration

Damit die udev Regeln funktionieren, muss man  "net.ifnames" und "biosdevname" in der GRUB Konfiguration deaktivieren, indem man diesen im parameter GRUB_CMDLINE_LINUX auf 0 setzt.

cat /etc/default/grub | grep GRUB_CMDLINE_LINUX
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=ol_amd/root rd.lvm.lv=ol_amd/swap rhgb quiet numa=off transparent_hugepage=never net.ifnames=0 biosdevname=0"

Anschliessend muss man die GRUB Konfiguration neu erzeugen

# grub2-mkconfig -o /boot/grub2/grub.cfg

Server reboot

Erst nach einem Reboot des Servers funktionieren die Änderungen korrekt.

# init 6

Referenzen