Persistente Interface-Namen mit Linux
Eine Runde Bullshit-Bingo? Nein, keine Angst. ;-) Es geht um das Problem, dass man auf Systemen öfters stabile Interface-Namen haben will/muss. Das gilt nicht nur für externe Geräte wie USB-Sticks und Drucker, sondern durchaus auch für NICs. Praxisbeispiel: mehrere NICs in einem Linux-Gateway, die mit einem iptables-Skript gesteuert werden. Nur weil die NIC mit dem Interface-Namen eth1 ausfällt und eth2 so zu eth1 werden könnte, dürfen Policies aber nicht auf das “neue, aber falsche eth1” angewandt werden. Genau für sowas will man eben auch persistente Interface-Namen haben.
Als erste Variante bietet sich der Weg über modutils bzw. module-init-tools an. modutils ist noch von Kernel 2.2 und 2.4 und man geht dabei über /etc/modutils/. Wer Kernel 2.6 fährt, geht natürlich über /etc/modprobe.d/ der module-init-tools. Bei Debian bitte nicht direkt /etc/modules.conf bearbeiten, sondern brav über /etc/modprobe.d/ und update-modules gehen. In die aliases-Datei trägt man dann die Konfiguration ein:
alias eth0 $module1 alias eth1 $module2
Durch “options” lässt sich das Problem vermeiden, dass bei identischen Netzwerk-Karten der gleiche Treiber mehrfach gebraucht wird. Siehe auch www.linuxhaven.de/dlhp/HOWTO/DE-Netzwerk-HOWTO-5.html.
Als zweite Variante bietet sich interface-Mapping via ifupdown an. Das funktioniert bei Debian über /etc/network/interfaces und z.B. das get-mac-address.sh-Skript:
# cp /usr/share/doc/ifupdown/examples/get-mac-address.sh /etc/network/ # chmod 755 /etc/network/get-mac-address.sh # cat /etc/network/interfaces [...] auto eth0 eth1 mapping eth0 eth1 script /etc/network/get-mac-address.sh map xx:xx:xx:xx:xx:x1 lan map xx:xx:xx:xx:xx:x2 internet
Siehe dazu auch /usr/share/doc/ifupdown/examples/network-interfaces.gz.
Als dritte Variante bietet sich nameif aus den net-tools an. Dabei trägt man in /etc/mactab die MAC-Adressen und die Interface-Namen ein. Nachteile: funktioniert leider nur für Ethernet-Devices und man muss dafür Sorge tragen, dass nameif aufgerufen wird, bevor das Interface “up” ist.
Die vierte Variante geht über udev. Das ist übrigens jene Variante, die ich aktuell bevorzuge, da man sie ohne Reboot und distributionsunabhängig einsetzen kann. Man schreibt dafür einfach seine eigenen Regeln:
# cat /etc/udev/network.rules KERNEL=="eth*", SYSFS{address}=="xx:xx:xx:xx:xx:x1", NAME="lan1" KERNEL=="eth*", SYSFS{address}=="xx:xx:xx:xx:xx:x2", NAME="lan2" KERNEL=="eth*", SYSFS{address}=="xx:xx:xx:xx:xx:x3", NAME="wlan1" # cd /etc/udev/rules.d/ && ln -s ../network.rules z35_network.rules
Die SYSFS-Adresse entspricht dabei natürlich der MAC-Adresse. Bitte auf die Schreibweise achten und am Besten via ‘udevinfo -a -p /sys/class/net/$DEVICE/ | grep address’ auslesen. Nicht vergessen: die Regeln auch via /etc/udev/rules.d/ aktivieren.
Weitere Informationen zu udev gibt es in /usr/share/doc/udev/ und “Writing udev rules” (lokal /usr/share/doc/udev/writing_udev_rules/index.html). Letzteres aber im eventuellen Problemfall bitte mit Vorsicht geniessen: der Guide entspricht nicht 100%ig den aktuellen udev-Features.
Ach ja, wie schaut das dann im Einsatz aus?
# awk '/:/ {print $1}' /proc/net/dev lo: ipw: b44: 1394: sit0: vmnet1: vmnet8: #
Und schon kann man die Interfaces kontrolliert ansprechen. Ein ‘ifup ipw=home’ reicht um das WLAN@home via Interface-Mapping zu aktivieren. Netzwerk via Firewire gibt’s via ‘ifup 1394=dhcp’ und natürlich eignet sich das auch hervorragend für die Systemskripte. Zum Thema Interface-Mapping gibt es aber noch ein anderes Mal mehr…
March 9th, 2006 at 22:07
Sehr interessant, Mika! :)
March 13th, 2006 at 23:10
Viel eleganter geht es übrigens unter Net und FreeBSD :-)
# ifconfig $if name $neuername.
March 14th, 2006 at 08:13
@arved: ja, da muss ich $if aber erst wieder kennen. :)