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.
quelle
udev
?udev
kann ein Skript auslösen, wenn ein Gerät gestartet wird. Ihr Skript kann dann die IP zuweisen.udev
Ich glaube, ich habe eine funktionierende Regel eingerichtet, aber ich konnte sie nicht zum Laufen bringen/sbin/ifup eth2
(entweder das oderifup
nur nicht erfolgreich abgeschlossen). Ich werde es trotzdem weiter versuchen, wenn ich am Montag wieder im Büro bin.sleep 10; ifup eth2
zu deinem/etc/rc.local
und das könnte funktionieren.Antworten:
Am Ende habe ich Folgendes hinzugefügt
udev
herrsche zu meinemlocal.rules
Datei:Das Drehbuch (
/home/bin/enableeth2.sh
) enthält Folgendes (und ist so eingestellt, dass es ausführbar ist):Beachten Sie den Verzeichniswechsel zu
/sbin/
bevor Sie anrufenifup
, anstatt nur anzurufen/sbin/ifup eth2
. Dies ist notwendig, da die BusyBoxifup
Anrufeip
(gelegen in/sbin/
) intern, und da der Pfad anscheinend nicht eingerichtet ist, wenn dieudev
regel läuft,ifup
wird eine Fehlermeldung ausgeben, wenn versucht wird, den eigentlichen Adapter einzurichten.quelle
Das Beste ist, die Benutzeroberfläche schneller aufzurufen. Dies wird durch Hinzufügen erhalten
allow-hotplug eth2
gleich nachauto eth2
in der Strophe von/etc/network/interfaces
.Gemäß Debians Handbuch ,
Also sollte es so sein:
Bearbeiten
Möglicherweise brauchen Sie eine
udev
herrschen zuifup
die Schnittstelle, wenn udev es erkennt. Sie könnten möglicherweise eine Regel verwenden wie: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 mitDas sollte es tun.
quelle
allow-hotplug eth2
anstattauto 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".allow-hotplug
"verlegt" werden, wenn es nach dem platziert wurdeauto 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!allow-hotplug
- was ich denke erklärt, warum es nicht funktioniert ...