延遲分配 IP 位址,直到網路適配器設備可用

延遲分配 IP 位址,直到網路適配器設備可用

我正在開發具有三個乙太網路介面的客製化嵌入式板:

  • eth0 和 eth1 內建於 CPU(TI AM3356)
  • eth2採用板載LAN9512晶片(使用smsc95xx驅動),透過USB連接

啟動時,我想啟動 eth0 和 eth1沒有IP 位址(用於工業乙太網路),並啟動 eth2IP 位址(用於標準網路通訊)。

/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                                                                                           

這將開啟所有三個網路介面(以及環回適配器),但不會將指定的 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因此在嘗試設定實際適配器時將給出錯誤。

相關內容