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

13

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

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

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

Não preciso de instalações de hotplug do mdev ou do udev - estou me referindo às portas Ethernet "fixas".

Patrick
fonte
Presumi que haveria alguma maneira de especificar isso no arquivo devicetree, mas não consegui descobrir como.

Respostas:

7

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
Patrick
fonte
2
De man nameif: "Este programa está obsoleto. Para verificação de substituição ip link." Também nota que se o sistema estiver em faz uso udev, sua estratégia será propensos a falhas como /sys/class/net/eth[whatever]pode não existir.
2

Você mencionou que não precisa do udev, mas se não se opuser a instalá-lo, considere usar o biosdevname . Há uma excelente página wiki no freedesktop.org que discute esse problema. Conforme observado nessa página, se você estiver usando o udev versão 197 ou superior, não precisará do nome do biosdev porque o udev já fará o que você precisa.

Olek Wojnar
fonte