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

3

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.

    
por sonicwave 11.12.2015 / 08:59

2 respostas

2

Acabei de adicionar a seguinte regra udev ao meu arquivo local.rules :

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á definido para ser executável):

#!/bin/bash
cd /sbin/
ifup eth2

Observe a alteração do diretório para /sbin/ antes de chamar ifup , em vez de apenas chamar /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 regra udev é executada, ifup causará um erro ao tentar faça o adaptador real configurado.

    
por 14.12.2015 / 11:59
1

A melhor coisa é acelerar a criação da interface. Isso é obtido adicionando allow-hotplug eth2 imediatamente após auto eth2 na sub-rotina de /etc/network/interfaces .

De acordo com Manual do Debian ,

"auto " start interface upon start of the system

"allow-auto " , ,

"allow-hotplug " start interface when the kernel detects a hotplug event from the interface

Então, deve 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 regra udev para ifup da 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 em /etc/udev/rules.d . Isto é para um objeto USB, Vendedor e Modelo terão que ser corrigidos no seu caso, o arquivo /path/to/my/script é um arquivo executável contendo

#!/bin/bash
ifup InterfaceName

Isso deve ser feito.

    
por 11.12.2015 / 13:16