Estou trabalhando em uma placa integrada personalizada com três interfaces Ethernet:
- eth0 e eth1 são embutidos na CPU (uma TI AM3356)
- eth2 é feito com um chip LAN9512 on-board (usando o driver smsc95xx), conectado via USB
Na inicialização, quero trazer eth0 e eth1 sem um endereço IP (eles são usados para Ethernet industrial) e exibir eth2 com um endereço IP. endereço (é usado para comunicação de rede padrão).
Meu /etc/network/interfaces
originalmente ficou assim:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet manual
pre-up ifconfig $IFACE up
post-down ifconfig $IFACE down
auto eth1
iface eth1 inet manual
pre-up ifconfig $IFACE up
post-down ifconfig $IFACE down
auto eth2
iface eth2 inet static
address 10.1.1.10
netmask 255.255.255.0
gateway 10.1.1.20
Isso traz todas as três interfaces de rede (e o adaptador de loopback), mas não atribui o endereço IP especificado a eth2.
Olhando no bootlog, recebo a mensagem
ip: can't find device 'eth2'
... e logo depois disso, uma mensagem do driver smsc95xx que registrou eth2. Então, presumo que seja porque o eth2 não está disponível quando o script de inicialização tenta atribuir o endereço IP a ele (mas, em vez disso, aparece logo depois).
Se eu fizer ifup eth2
quando a placa for iniciada, o endereço IP será atribuído corretamente automaticamente.
Eu tentei hackear algumas coisas com pre-up
, e o seguinte parece funcionar bem:
auto eth2
iface eth2 inet static
address 10.1.1.10
netmask 255.255.255.0
gateway 10.1.1.20
pre-up while [ ! -e /sys/class/net/eth2 ]; do sleep 1; done;
Mas parece muito com um hack (e também irá travar o sistema se o eth2 nunca aparecer).
Existe uma maneira "correta" de fazer com que a atribuição de IP espere até que a interface esteja realmente lá? - ou terei que fazer um script personalizado para conseguir isso?
Note que estou trabalhando em um Linux embarcado (kernel 3.18.9-rt5, construído com o PTXDist), rodando o BusyBox, então talvez eu não tenha acesso a todas as ferramentas sofisticadas que estão disponíveis.