
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/interfaces
originalmente 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 eth2
una vez que se inicia el tablero, la dirección IP se asigna correctamente de forma automática.
Intenté piratear algunas pre-up
cosas 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 eth2
inmediatamente después auto eth2
en 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 udev
regla para ifup
la 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/script
es unejecutablearchivo que contiene
#!/bin/bash
ifup InterfaceName
Esto debería bastar.
Respuesta2
Terminé agregando la siguiente udev
regla a mi local.rules
archivo:
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 ifup
llamadas BusyBox ip
(ubicadas en /sbin/
) internamente y dado que la ruta aparentemente no está configurada cuando udev
se ejecuta la regla, ifup
dará un error al intentar configurar el adaptador real.