
Estou trabalhando em uma placa incorporada personalizada com três interfaces Ethernet:
- eth0 e eth1 estão integrados à 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 eth1semum endereço IP (eles são usados para Ethernet industrial) e abrir eth2comum endereço IP (é usado para comunicação de rede padrão).
Meu /etc/network/interfaces
originalmente era 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 à eth2.
Olhando no bootlog recebo a mensagem
ip: não é possível encontrar o dispositivo 'eth2'
...e logo depois disso, uma mensagem do driver smsc95xx informando que ele 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 aparece logo depois).
Se eu fizer isso ifup eth2
depois que a placa for iniciada, o endereço IP será atribuído corretamente e automaticamente.
Eu tentei hackear algumas pre-up
coisas 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 um hack (e também irá travar o sistema se a eth2 nunca aparecer).
Existe uma maneira "correta" de fazer com que a atribuição de IP aguarde até que a interface esteja realmente lá? - ou terei que criar um script personalizado para conseguir isso?
Observe que estou trabalhando em um Linux embarcado (kernel 3.18.9-rt5, construído com PTXDist), executando o BusyBox, portanto, posso não ter acesso a todas as ferramentas sofisticadas disponíveis.
Responder1
O melhor é agilizar a abertura da interface. Isto é obtido adicionando-se allow-hotplug eth2
imediatamente depois auto eth2
na estrofe de /etc/network/interfaces
.
De acordo comManual do Debian,
Interface de inicialização "auto" na inicialização do sistema
"permitir-automático " , ,
Interface de início "allow-hotplug" quando o kernel detecta um evento hotplug da interface
Então, deveria ser assim:
auto eth2
allow-hotplug eth2
iface eth2 inet static
address 10.1.1.10
netmask 255.255.255.0
gateway 10.1.1.20
Editar
Possivelmente, você precisa de uma udev
regra para ifup
a interface quando o udev a detecta. Você poderia usar uma regra como:
KERNEL=="sd*", ATTRS{vendor}=="Yoyodyne", ATTRS{model}=="XYZ42", ATTRS{serial}=="123465789", RUN+="/path/to/my/script"
colocando-o em um arquivo no formato /etc/udev/rules.d
. Isto é para um objeto USB, o fornecedor e o modelo deverão ser corrigidos para o seu caso, o arquivo /path/to/my/script
é umexecutávelarquivo contendo
#!/bin/bash
ifup InterfaceName
Isso deve servir.
Responder2
Acabei adicionando a seguinte udev
regra ao meu local.rules
arquivo:
KERNEL=="eth2", SUBSYSTEM=="net", SUBSYSTEMS=="usb", DRIVERS=="smsc95xx", RUN+="/home/bin/enableeth2.sh"
O script ( /home/bin/enableeth2.sh
) contém o seguinte (e está configurado para ser executável):
#!/bin/bash
cd /sbin/
ifup eth2
Observe a mudança de diretório para /sbin/
antes de chamar ifup
, em vez de apenas ligar /sbin/ifup eth2
. Isso é necessário porque o BusyBox ifup
chama ip
(localizado em /sbin/
) internamente, e como o caminho aparentemente não está configurado quando a udev
regra é executada, ifup
ocorrerá um erro ao tentar fazer a configuração real do adaptador.