Wie stellen Sie sicher, dass physische Netzwerkschnittstellen bei Neustarts auf einem eingebetteten Linux-System immer den gleichen Schnittstellennamen erhalten?

13

Wie stelle ich bei einem eingebetteten Linux-System sicher, dass zwei oder mehr Netzwerkschnittstellen bei jedem Start immer dieselben Schnittstellennamen erhalten

Mit anderen Worten, ich möchte zum Beispiel, dass eth0 immer einem physischen Ethernet-Port, eth1 dem nächsten usw. zugeordnet wird.

Meine Linux- "Distribution" ist aus eigenem Anbau und ich verwende devtmpfs zum Auffüllen von / dev. Ich benutze busybox für init (und fast alles andere), zusammen mit benutzerdefinierten Init-Skripten für den Systemstart und das Herunterfahren.

Ich benötige keine Hotplug-Funktionen von mdev oder udev - ich beziehe mich auf "feste" Ethernet-Ports.

Patrick
quelle
Ich nahm an, dass es eine Möglichkeit geben würde, dies in der Devicetree-Datei anzugeben, aber ich konnte nicht herausfinden, wie.

Antworten:

7

Dies funktioniert für mich mit Linux 3.9.0 auf einer x86_64-Architektur.

#!/bin/sh

# This assumes the interfaces come up with default names of eth*.
# The interface names may not be correct at this point, however.
# This is just a way to get the PCI addresses of all the active
# interfaces.
PCIADDRLIST=
for dir in /sys/class/net/eth* ; do
  [ -e $dir/device ] && {
    PCIADDRLIST="`readlink -f $dir/device` ${PCIADDRLIST}"
  }
done

# Now assign the interface names from an ordered list that maps
# to the PCI addresses of each interface.

# IFNAMES could come from some config file.  "dummy" is needed because of
# my limited tr- and awk-fu.
IFNAMES="eth0 eth1 eth2 dummy"

for dir in `echo ${PCIADDRLIST} | tr " " "\n" | sort` ; do
  [ -e $dir/net/*/address ] && {
    MACADDR=`cat $dir/net/*/address`
    IFNAME=`echo $IFNAMES | awk '{print $1}'`
    IFNAMES=`echo $IFNAMES | awk '{ for (i=2; i<=NF; i++) printf "%s ", $i; }'`
    echo -n "$IFNAME "
    nameif $IFNAME mac=$MACADDR
  }
done
Patrick
quelle
2
Von man nameif: "Dieses Programm ist veraltet. Zur Ersatzprüfung ip link." Beachten Sie auchudev , dass Ihre Strategie , wenn das System, auf dem Sie sich gerade befinden, verwendet wird , /sys/class/net/eth[whatever]möglicherweise nicht funktioniert .
2

Sie haben erwähnt, dass Sie udev nicht benötigen, aber wenn Sie nicht dagegen sind, es zu installieren, sollten Sie die Verwendung von biosdevname in Betracht ziehen . Es gibt eine große Wiki - Seite auf freedesktop.org , die dieses Thema diskutiert. Wie auf dieser Seite erwähnt, benötigen Sie bei Verwendung von udev Version 197 oder höher nicht einmal biosdevname, da udev bereits das tut, was Sie benötigen.

Olek Wojnar
quelle