
私は 3 つのイーサネット インターフェイスを備えたカスタム組み込みボードを開発中です。
- eth0とeth1はCPU(TI AM3356)に組み込まれています。
- eth2はオンボードLAN9512チップ(smsc95xxドライバを使用)で作られており、USB経由で接続されています。
起動時にeth0とeth1を起動したいそれなしIPアドレス(産業用イーサネットに使用)を設定し、eth2を起動します。とIP アドレス (標準のネットワーク通信に使用されます)。
私の/etc/network/interfaces
元々の姿は次のようになりました:
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
これにより、3 つのネットワーク インターフェイス (およびループバック アダプター) がすべて起動しますが、指定された IP アドレスは eth2 に割り当てられません。
ブートログを見ると、メッセージが表示される
ip: デバイス 'eth2' が見つかりません
...そしてその直後に、smsc95xx ドライバーから eth2 が登録されたというメッセージが表示されます。したがって、init スクリプトが IP アドレスを割り当てようとしたときに eth2 が利用できない (代わりに直後に起動する) ためだと推測します。
ボードを起動したらifup eth2
、IP アドレスが自動的に正しく割り当てられます。
いくつか試してみたところpre-up
、次のものがうまく動作するようです:
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;
しかし、それはあまりにもハックのように感じられます (また、eth2 が表示されない場合はシステムがハングします)。
インターフェイスが実際に存在するまで IP 割り当てを待機させる「正しい」方法はありますか? - または、これを実現するにはカスタム スクリプトを作成する必要がありますか?
なお、私は BusyBox を実行している組み込み Linux (カーネル 3.18.9-rt5、PTXDist でビルド) で作業しているため、利用可能なすべての高度なツールにアクセスできない可能性があります。
答え1
最も良い方法は、インターフェースの起動を高速化することです。これは、のスタンザのallow-hotplug eth2
直後に を追加することで実現されます。auto eth2
/etc/network/interfaces
によるとDebianのマニュアル、
システムの起動時に「自動」起動インターフェース
「自動許可」、、
「allow-hotplug」は、カーネルがインターフェースからホットプラグイベントを検出したときにインターフェースを起動します。
つまり、次のようになります。
auto eth2
allow-hotplug eth2
iface eth2 inet static
address 10.1.1.10
netmask 255.255.255.0
gateway 10.1.1.20
編集
おそらく、udev がそれを検出したときにインターフェースudev
に対するルールが必要になります。次のようなルールを使用できます。ifup
KERNEL=="sd*", ATTRS{vendor}=="Yoyodyne", ATTRS{model}=="XYZ42", ATTRS{serial}=="123465789", RUN+="/path/to/my/script"
のファイルに配置することによって/etc/udev/rules.d
。これはUSBオブジェクト用であり、ベンダーとモデルはケースに合わせて修正する必要があります。ファイル/path/to/my/script
は実行可能ファイルを含む
#!/bin/bash
ifup InterfaceName
これで大丈夫でしょう。
答え2
udev
最終的に、ファイルに次のルールを追加しましたlocal.rules
。
KERNEL=="eth2", SUBSYSTEM=="net", SUBSYSTEMS=="usb", DRIVERS=="smsc95xx", RUN+="/home/bin/enableeth2.sh"
スクリプト ( /home/bin/enableeth2.sh
) には次の内容が含まれています (実行可能に設定されています)。
#!/bin/bash
cd /sbin/
ifup eth2
/sbin/
を呼び出す前にifup
、単に を呼び出すのではなく、ディレクトリを に変更することに注意してください/sbin/ifup eth2
。BusyBox は( にあります) を内部的にifup
呼び出しますが、ルールの実行時にパスが設定されていないように見えるため、実際のアダプタ設定を行おうとするとエラーが発生します。ip
/sbin/
udev
ifup