延迟分配 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                                                                                           

这将启动所有三个网络接口(和环回适配器),但不会为 eth2 分配指定的 IP 地址。

查看启动日志,我收到消息

ip:找不到设备‘eth2’

... 紧接着,smsc95xx 驱动程序发出一条消息,表示已注册 eth2。因此,我推测这是因为当 init 脚本尝试为 eth2 分配 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因此在尝试进行实际适配器设置时会出现错误。

相关内容