¿Cómo se asegura de que las interfaces de red físicas siempre obtengan el mismo nombre de interfaz en los reinicios en un sistema Linux incorporado?

13

Para un sistema Linux incorporado, si tengo dos o más interfaces de red, ¿cómo me aseguro de que siempre obtengan los mismos nombres de interfaz en cada arranque?

En otras palabras, quiero, por ejemplo, eth0 para asignar siempre a un puerto Ethernet físico, eth1 al siguiente, etc.

Mi "distribución" de Linux es de cosecha propia, y uso devtmpfs para rellenar / dev. Uso busybox para init (y casi todo lo demás), junto con scripts de inicio personalizados para el inicio y apagado del sistema.

No necesito instalaciones de conexión en caliente de mdev o udev. Me refiero a los puertos Ethernet "fijos".

Patricio
fuente
Supuse que habría alguna forma de especificar esto en el archivo de dispositivo, pero no he podido averiguar cómo.

Respuestas:

7

Esto funciona para mí con Linux 3.9.0 en una arquitectura 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
Patricio
fuente
2
De man nameif: "Este programa está obsoleto. Para verificación de reemplazo ip link". También nota que si el sistema está en que hace uso udev, su estrategia será propenso al fracaso como /sys/class/net/eth[whatever]puede no existir.
2

Usted mencionó que no necesita udev, pero si no se opone a instalarlo, entonces puede considerar usar biosdevname . Hay una gran página wiki en freedesktop.org que trata este tema. Como se señaló en esa página, si está utilizando udev versión 197 o superior, entonces ni siquiera necesita biosdevname porque udev ya hará lo que necesita.

Olek Wojnar
fuente