Retrasar la asignación de la dirección IP hasta que el dispositivo adaptador de red esté disponible

Retrasar la asignación de la dirección IP hasta que el dispositivo adaptador de red esté disponible

Estoy trabajando en una placa integrada personalizada con tres interfaces Ethernet:

  • eth0 y eth1 están integrados en la CPU (una TI AM3356)
  • eth2 está hecho con un chip LAN9512 integrado (usando el controlador smsc95xx), conectado a través de USB

Al arrancar, quiero que aparezcan eth0 y eth1.sinuna dirección IP (se utilizan para Ethernet industrial) y abra eth2conuna dirección IP (se utiliza para la comunicación de red estándar).

Mi /etc/network/interfacesoriginalmente se veía así:

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                                                                                           

Esto muestra las tres interfaces de red (y el adaptador de bucle invertido), pero no asigna la dirección IP especificada a eth2.

Mirando en el bootlog me sale el mensaje

ip: no puedo encontrar el dispositivo 'eth2'

...y justo después de eso, un mensaje del controlador smsc95xx que ha registrado eth2. Entonces supongo que es porque eth2 no está disponible cuando el script de inicio intenta asignarle la dirección IP (sino que aparece justo después).

Si lo hago ifup eth2una vez que se inicia el tablero, la dirección IP se asigna correctamente de forma automática.

Intenté piratear algunas pre-upcosas y lo siguiente parece funcionar bien:

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;

Pero se parece demasiado a un hack (y también bloqueará el sistema si eth2 nunca aparece).

¿Existe una forma "correcta" de hacer que la asignación de IP espere hasta que la interfaz esté realmente allí? - ¿O tendré que crear un script personalizado para lograrlo?

Tenga en cuenta que estoy trabajando en un Linux integrado (kernel 3.18.9-rt5, construido con PTXDist), ejecutando BusyBox, por lo que es posible que no tenga acceso a todas las herramientas sofisticadas que están disponibles.

Respuesta1

Lo mejor es acelerar el acceso a la interfaz. Esto se obtiene añadiendo allow-hotplug eth2inmediatamente después auto eth2en la estrofa de /etc/network/interfaces.

De acuerdo amanual de debian,

Interfaz de inicio "automático" al iniciar el sistema

"permitir-automático", ,

"allow-hotplug" inicia la interfaz cuando el kernel detecta un evento de conexión en caliente desde la interfaz

Entonces, debería ser así:

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

Posiblemente, necesite una udevregla para ifupla interfaz cuando udev la detecte. Posiblemente podrías usar una regla como:

KERNEL=="sd*", ATTRS{vendor}=="Yoyodyne", ATTRS{model}=="XYZ42", ATTRS{serial}=="123465789", RUN+="/path/to/my/script"   

colocándolo en un archivo en formato /etc/udev/rules.d. Esto es para un objeto USB, el proveedor y el modelo deberán fijarse en su caso, el archivo /path/to/my/scriptes unejecutablearchivo que contiene

#!/bin/bash
ifup InterfaceName

Esto debería bastar.

Respuesta2

Terminé agregando la siguiente udevregla a mi local.rulesarchivo:

KERNEL=="eth2", SUBSYSTEM=="net", SUBSYSTEMS=="usb", DRIVERS=="smsc95xx", RUN+="/home/bin/enableeth2.sh"

El script ( /home/bin/enableeth2.sh) contiene lo siguiente (y está configurado para ser ejecutable):

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

Tenga en cuenta el cambio de directorio /sbin/antes de llamar ifup, en lugar de simplemente llamar /sbin/ifup eth2. Esto es necesario ya que las ifupllamadas BusyBox ip(ubicadas en /sbin/) internamente y dado que la ruta aparentemente no está configurada cuando udevse ejecuta la regla, ifupdará un error al intentar configurar el adaptador real.

información relacionada