Comment vous assurez-vous que les interfaces réseau physiques obtiennent toujours le même nom d'interface lors des redémarrages sur un système Linux intégré?

13

Pour un système Linux embarqué, si j'ai deux interfaces réseau ou plus, comment puis-je m'assurer qu'elles obtiennent toujours les mêmes noms d'interface à chaque démarrage

En d'autres termes, je veux, par exemple, que eth0 soit toujours mappé sur un port Ethernet physique, eth1 sur le suivant, etc.

Ma "distribution" Linux est faite maison, et j'utilise devtmpfs pour remplir / dev. J'utilise busybox pour init (et presque tout le reste), ainsi que des scripts d'initialisation personnalisés pour le démarrage et l'arrêt du système.

Je n'ai pas besoin des installations hotplug de mdev ou udev - je fais référence aux ports Ethernet "fixes".

Patrick
la source
J'ai supposé qu'il y aurait un moyen de le spécifier dans le fichier devicetree, mais je n'ai pas pu savoir comment.

Réponses:

7

Cela fonctionne pour moi avec Linux 3.9.0 sur une architecture 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
la source
2
De man nameif: "Ce programme est obsolète. Pour vérifier le remplacement ip link." Notez également que si le système que vous êtes sur le fait utilisation udev, votre stratégie sera sujette à l' échec que /sys/class/net/eth[whatever]ne peut pas exister.
2

Vous avez mentionné que vous n'avez pas besoin d' udev, mais si vous n'êtes pas opposé à son installation, vous pouvez envisager d'utiliser biosdevname . Il existe une excellente page wiki sur freedesktop.org qui traite de ce problème. Comme indiqué sur cette page, si vous utilisez udev version 197 ou supérieure, vous n'avez même pas besoin de biosdevname car udev fera déjà ce dont vous avez besoin.

Olek Wojnar
la source