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.
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 oder ifup
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.
udev
?