ネットワークアダプタデバイスが利用可能になるまでIPアドレスの割り当てを遅らせる

ネットワークアダプタデバイスが利用可能になるまでIPアドレスの割り当てを遅らせる

私は 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/udevifup

関連情報