2 votes

Retarder l'attribution de l'adresse IP jusqu'à ce que la carte réseau soit disponible.

Je travaille sur une carte embarquée personnalisée avec trois interfaces Ethernet :

  • eth0 et eth1 sont intégrés au CPU (un TI AM3356)
  • eth2 est réalisé avec une puce LAN9512 intégrée (en utilisant le pilote smsc95xx), connectée par USB.

Au démarrage, je veux faire apparaître eth0 et eth1. sans une adresse IP (ils sont utilisés pour l'Ethernet industriel), et faire apparaître eth2 avec une adresse IP (elle est utilisée pour la communication réseau standard).

Mon /etc/network/interfaces ressemblait à l'origine à ceci :

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                                                                                           

Cela fait apparaître les trois interfaces réseau (et la carte de bouclage), mais n'affecte pas l'adresse IP spécifiée à eth2.

En regardant dans le bootlog, j'obtiens le message

ip : Impossible de trouver le périphérique 'eth2'.

...et juste après, un message du pilote smsc95xx indiquant qu'il a enregistré eth2. Je présume donc que c'est parce que eth2 n'est pas disponible lorsque le script d'init tente de lui attribuer l'adresse IP (mais apparaît juste après).

Si je le fais ifup eth2 une fois que la carte est démarrée, l'adresse IP est correctement attribuée automatiquement.

J'ai essayé de bidouiller avec quelques pre-up et ce qui suit semble fonctionner parfaitement :

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;

Mais cela ressemble trop à un piratage (et bloquera également le système si eth2 n'apparaît jamais).

Existe-t-il un moyen "correct" pour que l'attribution d'IP attende que l'interface soit réellement présente ? - ou dois-je créer un script personnalisé pour y parvenir ?

Notez que je travaille sur un Linux embarqué (noyau 3.18.9-rt5, construit avec PTXDist), en utilisant BusyBox, donc je n'ai peut-être pas accès à tous les outils sophistiqués qui sont disponibles.

1voto

MariusMatutiae Points 45233

La meilleure chose à faire est d'accélérer la mise en place de l'interface. Ceci est obtenu en ajoutant allow-hotplug eth2 immédiatement après auto eth2 dans la strophe de /etc/network/interfaces .

Selon Le manuel de Debian ,

interface de démarrage " automatique " au démarrage du système

"allow-auto" , ,

"allow-hotplug " démarrer l'interface lorsque le noyau détecte un événement hotplug de l'interface.

Donc, ça devrait être comme ça :

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

Il se peut que vous ayez besoin d'un udev règle pour ifup l'interface lorsque udev la détecte. Vous pourriez éventuellement utiliser une règle comme :

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

en le plaçant dans un fichier dans /etc/udev/rules.d . Il s'agit d'un objet USB, le vendeur et le modèle devront être adaptés à votre cas, le fichier /path/to/my/script est un exécutable contenant

#!/bin/bash
ifup InterfaceName

Cela devrait le faire.

1voto

sonicwave Points 131

J'ai fini par ajouter ce qui suit udev règle à mon local.rules fichier :

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

Le script ( /home/bin/enableeth2.sh ) contient les éléments suivants (et est configuré pour être exécutable) :

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

Notez le changement de répertoire en /sbin/ avant d'appeler ifup au lieu de simplement appeler /sbin/ifup eth2 . Ceci est nécessaire puisque le BusyBox ifup appelle ip (situé dans /sbin/ ) en interne, et puisque le chemin d'accès n'est apparemment pas défini lorsque la fonction udev la règle fonctionne, ifup donnera une erreur lors de la configuration de l'adaptateur.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X