Como você garante que as interfaces de rede física sempre obtenham o mesmo nome de interface nas reinicializações de um sistema Linux embarcado?

4

Para um sistema Linux embarcado, se eu tiver duas ou mais interfaces de rede, como garantir que elas sempre obtenham os mesmos nomes de interface em cada inicialização

Em outras palavras, eu quero, por exemplo, eth0 sempre mapear para uma porta Ethernet física, eth1 para a próxima, etc.

Minha "distribuição" Linux é feita em casa, e eu uso o devtmpfs para preencher / dev. Eu uso o busybox para o init (e quase todo o resto), juntamente com scripts init personalizados para inicialização e desligamento do sistema.

Eu não preciso de instalações de hotplug de mdev ou udev - estou me referindo a portas Ethernet "fixas".

    
por Patrick 04.06.2014 / 00:33

1 resposta

1

Isso funciona para mim com o Linux 3.9.0 em uma arquitetura 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
    
por 04.06.2014 / 00:41