W jaki sposób zapewniasz, że fizyczne interfejsy sieciowe zawsze otrzymują tę samą nazwę interfejsu podczas ponownego uruchamiania we wbudowanym systemie Linux?

13

W przypadku wbudowanego systemu Linux, jeśli mam dwa lub więcej interfejsów sieciowych, jak zapewnić, aby zawsze otrzymywały te same nazwy interfejsów przy każdym uruchomieniu

Innymi słowy, chcę na przykład, aby eth0 zawsze mapował na jeden fizyczny port Ethernet, eth1 na następny itp.

Moja „dystrybucja” Linuksa jest domowa i używam devtmpfs do zapełniania / dev. Używam busybox do init (i większości innych rzeczy), a także niestandardowych skryptów init do uruchamiania i zamykania systemu.

Nie potrzebuję funkcji hotplug mdev ani udev - mam na myśli „stałe” porty Ethernet.

Patrick
źródło
Zakładałem, że będzie jakiś sposób na określenie tego w pliku Devicetree, ale nie byłem w stanie dowiedzieć się, jak to zrobić.

Odpowiedzi:

7

Działa to dla mnie w Linuksie 3.9.0 na architekturze x86_64.

#!/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
źródło
2
From man nameif: „Ten program jest przestarzały. Do sprawdzenia wymiany ip link.” Należy również pamiętać, że jeśli system jesteś na nie stosowanie udev, strategia będzie podatne na uszkodzenia, jak /sys/class/net/eth[whatever]nie może istnieć.
2

Wspomniałeś, że nie potrzebujesz udev, ale jeśli nie sprzeciwisz się jego instalacji, możesz rozważyć użycie biosdevname . Istnieje duża strona wiki na freedesktop.org który omawia ten problem. Jak wspomniano na tej stronie, jeśli używasz udev w wersji 197 lub wyższej, to nawet nie potrzebujesz nazwy biosdevname, ponieważ udev już zrobi to, czego potrzebujesz.

Olek Wojnar
źródło