我正在开发一个具有三个以太网接口的定制嵌入式主板:
- 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
这将启动所有三个网络接口(和环回适配器),但不会为 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/
),并且由于规则运行时路径显然未设置udev
,ifup
因此在尝试进行实际适配器设置时会出现错误。