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

3

Ich arbeite an einem benutzerdefinierten Embedded-Board 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 angeschlossen ist

Beim Booten möchte ich eth0 und eth1 aufrufen ohne eine IP-Adresse (sie werden für Industrial Ethernet verwendet) und rufen eth2 auf mit eine IP-Adresse (wird für die Standard-Netzwerkkommunikation verwendet).

Meine /etc/network/interfaces sah 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) aufgerufen, aber eth2 wird die angegebene IP-Adresse nicht zugewiesen.

Wenn ich in das Bootlog schaue, bekomme ich die Nachricht

ip: Gerät 'eth2' kann nicht gefunden werden

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

Wenn ich mache ifup eth2 Sobald die Karte gestartet ist, wird die IP-Adresse automatisch richtig vergeben.

Ich habe versucht, mit einigen herumzuhacken pre-up Sachen, und die folgenden scheint gut 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 hängen lassen, wenn eth2 nie auftaucht).

Gibt es eine "richtige" Möglichkeit, die IP-Zuweisung warten zu lassen, bis die Schnittstelle tatsächlich vorhanden ist? - oder muss ich ein benutzerdefiniertes Skript erstellen, um dies zu erreichen?

Beachten Sie, dass ich an einem eingebetteten Linux (Kernel 3.18.9-rt5, erstellt mit PTXDist) arbeite, auf dem BusyBox ausgeführt wird, sodass ich möglicherweise nicht auf alle verfügbaren ausgefallenen Tools zugreifen kann.

sonicwave
quelle
Hast du udev?
MariusMatutiae
@MariusMatutiae Ja, das tue ich. Ich habe es jedoch nur zum Einrichten eines benutzerdefinierten Namens für ein USB-Laufwerk verwendet. Wäre es auch zum Einstellen der IP verwendbar?
sonicwave
udev kann ein Skript auslösen, wenn ein Gerät gestartet wird. Ihr Skript kann dann die IP zuweisen.
LawrenceC
@LawrenceC Ich habe versucht, ein bisschen mit zu experimentieren udev Ich glaube, ich habe eine funktionierende Regel eingerichtet, aber ich konnte sie nicht zum Laufen bringen /sbin/ifup eth2 (entweder das oder ifup nur nicht erfolgreich abgeschlossen). Ich werde es trotzdem weiter versuchen, wenn ich am Montag wieder im Büro bin.
sonicwave
Auch da es so klingt, als wären Sie auf Debian, könnten Sie einfach eine hinzufügen sleep 10; ifup eth2 zu deinem /etc/rc.local und das könnte funktionieren.
LawrenceC

Antworten:

2

Am Ende habe ich Folgendes hinzugefügt udev herrsche zu meinem local.rules Datei:

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

Das Drehbuch ( /home/bin/enableeth2.sh ) enthält Folgendes (und ist so eingestellt, dass es ausführbar ist):

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

Beachten Sie den Verzeichniswechsel zu /sbin/ bevor Sie anrufen ifup, anstatt nur anzurufen /sbin/ifup eth2. Dies ist notwendig, da die BusyBox ifup Anrufe ip (gelegen in /sbin/ ) intern, und da der Pfad anscheinend nicht eingerichtet ist, wenn die udev regel läuft, ifup wird eine Fehlermeldung ausgeben, wenn versucht wird, den eigentlichen Adapter einzurichten.

sonicwave
quelle
1

Das Beste ist, die Benutzeroberfläche schneller aufzurufen. Dies wird durch Hinzufügen erhalten allow-hotplug eth2 gleich nach auto eth2 in der Strophe von /etc/network/interfaces.

Gemäß Debians Handbuch ,

"Auto" -Start-Schnittstelle beim Systemstart

"allow-auto",,

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

Also sollte es so sein:

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 brauchen Sie eine udev herrschen zu ifup die Schnittstelle, wenn udev es erkennt. Sie könnten möglicherweise eine Regel verwenden wie:

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

indem Sie es in eine Datei in platzieren /etc/udev/rules.d. Dies ist für ein USB-Objekt, Hersteller und Modell müssen in Ihrem Fall die Datei festgelegt werden /path/to/my/script ist ein ausführbar Datei mit

#!/bin/bash
ifup InterfaceName

Das sollte es tun.

MariusMatutiae
quelle
Danke für den Vorschlag, aber es hilft nicht. Mit allow-hotplug eth2 anstatt auto eth2, eth2 wird beim Booten überhaupt nicht angesprochen. Als Referenz, ifup eth2 funktioniert nach dem Booten immer noch (und weist die angegebene IP zu), und ich erhalte auch nicht mehr die Meldung "IP: Gerät 'eth2' kann nicht gefunden werden".
sonicwave
@sonicwave Ich habe einen Fehler gemacht, bitte sehen Sie meine redigierte Antwort
MariusMatutiae
Hmm - ich bin mir ziemlich sicher, dass ich das schon ausprobiert habe - und dass es sich über das beschwert hat allow-hotplug "verlegt" werden, wenn es nach dem platziert wurde auto eth2 Zeile - und dann nur die Datei vollständig ablehnen. Ich werde es am Montag noch einmal versuchen, wenn ich wieder im Büro bin, um sicherzugehen. Trotzdem vielen Dank!
sonicwave
@sonicwave Sie sehen, das oben Genannte wird im Debian-Handbuch wörtlich vorgeschlagen. Wenn es nicht funktioniert, liegt ein Problem vor. Wir versuchen es vielleicht mit einer Ad-hoc-udev-Regel, aber das ist wieder ein Hack, denn es soll wie oben beschrieben funktionieren, ohne dass weitere Eingriffe erforderlich sind.
MariusMatutiae
Hmm - Ich habe mir kurz den Busybox-Code angesehen, der anscheinend nicht unterstützt wird allow-hotplug - was ich denke erklärt, warum es nicht funktioniert ...
sonicwave