
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/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) 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-up
und 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 eth2
unmittelbar nach auto eth2
in 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 udev
Regel für ifup
die 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/script
ist eineausführbarDatei mit
#!/bin/bash
ifup InterfaceName
Das sollte reichen.
Antwort2
Schließlich habe ich udev
meiner local.rules
Datei 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 ifup
aufruft ip
(befindet sich in /sbin/
), und da der Pfad anscheinend nicht eingerichtet ist, wenn die udev
Regel ausgeführt wird, ifup
tritt beim Versuch, den eigentlichen Adapter einzurichten, ein Fehler auf.