Verzögern der Zuweisung der IP-Adresse, bis das Netzwerkadaptergerät verfügbar ist

Verzögern der Zuweisung der IP-Adresse, bis das Netzwerkadaptergerät verfügbar ist

Ich arbeite an einer benutzerdefinierten eingebetteten Platine mit drei Ethernet-Schnittstellen:

  • eth0 und eth1 sind in die CPU integriert (ein TI AM3356)
  • eth2 wird mit einem integrierten LAN9512-Chip (unter Verwendung des smsc95xx-Treibers) hergestellt, der über USB verbunden ist

Beim Booten möchte ich eth0 und eth1 aufrufenohneeine IP-Adresse (sie werden für industrielles Ethernet verwendet) und rufen Sie eth2 aufmiteine IP-Adresse (wird für die Standardnetzwerkkommunikation verwendet).

Meines /etc/network/interfacessah ursprünglich so aus:

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                                                                                           

Dadurch werden alle drei Netzwerkschnittstellen (und der Loopback-Adapter) aktiviert, die angegebene IP-Adresse wird jedoch nicht eth2 zugewiesen.

Beim Blick ins Bootlog erhalte ich die Meldung

IP: Gerät „eth2“ kann nicht gefunden werden

...und gleich danach eine Meldung vom smsc95xx-Treiber, dass er eth2 registriert hat. Ich gehe also davon aus, dass es daran liegt, dass eth2 nicht verfügbar ist, wenn das Init-Skript versucht, ihm die IP-Adresse zuzuweisen (sondern direkt danach erscheint).

Wenn ich dies mache ifup eth2, wird die IP-Adresse nach dem Start des Boards automatisch korrekt zugewiesen.

Ich habe ein paar Dinge ausprobiert pre-upund das Folgende scheint prima zu funktionieren:

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;

Aber es fühlt sich einfach zu sehr wie ein Hack an (und wird das System auch aufhängen, wenn eth2 nie angezeigt wird).

Gibt es eine „richtige“ Möglichkeit, mit der IP-Zuweisung zu warten, bis die Schnittstelle tatsächlich vorhanden ist? – oder muss ich hierfür ein benutzerdefiniertes Skript erstellen?

Beachten Sie, dass ich an einem eingebetteten Linux (Kernel 3.18.9-rt5, erstellt mit PTXDist) arbeite und BusyBox ausführe, sodass ich möglicherweise nicht auf alle verfügbaren tollen Tools zugreifen kann.

Antwort1

Am besten lässt sich das Aufrufen der Schnittstelle beschleunigen. Dies erreichen Sie, indem Sie allow-hotplug eth2unmittelbar nach auto eth2in der Strophe von hinzufügen /etc/network/interfaces.

EntsprechendDebians Handbuch,

"Auto" Startschnittstelle beim Systemstart

"Erlauben-Auto " , ,

"allow-hotplug" startet die Schnittstelle, wenn der Kernel ein Hotplug-Ereignis von der Schnittstelle erkennt

Es sollte also so aussehen:

auto eth2
allow-hotplug eth2
iface eth2 inet static                                                                                              
address 10.1.1.10                                                                                           
netmask 255.255.255.0                                                                                           
gateway 10.1.1.20 

Bearbeiten

Möglicherweise benötigen Sie eine udevRegel für ifupdie Schnittstelle, wenn Udev sie erkennt. Sie könnten beispielsweise eine Regel wie die folgende verwenden:

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

indem Sie es in eine Datei im /etc/udev/rules.d. Dies ist für ein USB-Objekt, Hersteller und Modell müssen an Ihren Fall angepasst werden, die Datei /path/to/my/scriptist eineausführbarDatei mit

#!/bin/bash
ifup InterfaceName

Das sollte reichen.

Antwort2

Schließlich habe ich udevmeiner local.rulesDatei die folgende Regel hinzugefügt:

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

Das Skript ( /home/bin/enableeth2.sh) enthält Folgendes (und ist auf ausführbar eingestellt):

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

Beachten Sie die Änderung des Verzeichnisses /sbin/vor dem Aufruf von ifup, anstatt nur aufzurufen /sbin/ifup eth2. Dies ist notwendig, da die BusyBox intern ifupaufruft ip(befindet sich in /sbin/), und da der Pfad anscheinend nicht eingerichtet ist, wenn die udevRegel ausgeführt wird, ifuptritt beim Versuch, den eigentlichen Adapter einzurichten, ein Fehler auf.

verwandte Informationen