Atrasando a atribuição do endereço IP até que o dispositivo adaptador de rede esteja disponível

Atrasando a atribuição do endereço IP até que o dispositivo adaptador de rede esteja disponível

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/interfacesoriginalmente 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 eth2depois que a placa for iniciada, o endereço IP será atribuído corretamente e automaticamente.

Eu tentei hackear algumas pre-upcoisas 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 eth2imediatamente depois auto eth2na 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 udevregra para ifupa 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 udevregra ao meu local.rulesarquivo:

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 ifupchama ip(localizado em /sbin/) internamente, e como o caminho aparentemente não está configurado quando a udevregra é executada, ifupocorrerá um erro ao tentar fazer a configuração real do adaptador.

informação relacionada