Come garantire che le interfacce di rete fisiche ottengano sempre lo stesso nome di interfaccia tra i riavvii su un sistema Linux incorporato?


13

Per un sistema Linux incorporato, se ho due o più interfacce di rete, come posso assicurarmi che ottengano sempre gli stessi nomi di interfaccia ad ogni avvio

In altre parole, voglio, ad esempio, eth0 mappare sempre su una porta Ethernet fisica, eth1 alla successiva, ecc.

La mia "distribuzione" Linux è cresciuta in casa e io uso devtmpfs per popolare / dev. Uso busybox per init (e quasi tutto il resto), insieme a script init personalizzati per l'avvio e l'arresto del sistema.

Non ho bisogno di strutture hotplug di mdev o udev - mi riferisco a porte Ethernet "fisse".


Ho pensato che ci sarebbe stato un modo per specificarlo nel file devicetree, ma non sono stato in grado di scoprire come.

Risposte:


7

Questo funziona per me con Linux 3.9.0 su un'architettura 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

2
Da man nameif: "Questo programma è obsoleto. Per controllo di sostituzione ip link." Si noti inoltre che se il sistema si è in fa uso udev, la vostra strategia sarà incline al fallimento come /sys/class/net/eth[whatever]non può esistere.

2

Hai detto che non hai bisogno di udev ma se non ti opponi all'installazione, potresti prendere in considerazione l'uso di biosdevname . C'è una grande pagina wiki su freedesktop.org che discute di questo problema. Come notato in quella pagina, se stai usando udev versione 197 o successiva, non hai nemmeno bisogno di biosdevname perché udev farà già quello che ti serve.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.