在我设置的某些(旧)Linux 嵌入式设备上(但我不再拥有该设备),广播地址显然配置错误,因为它与给定的 IP 地址和网络掩码的预期值不匹配(例如,对于 192.168.70.243/255.255.254.0,它的广播地址为 192.168.70.255,而不是 192.168.71.255)。它运行内核 2.4.31 和 busybox 0.60.5。网络配置只需使用该 shell 代码片段即可完成:
ifconfig eth0 $IPADDR netmask $NETMASK
if [ -n "$GATEWAY" ]; then
route add default gw $GATEWAY
fi
因此,广播地址没有明确配置。问题是:这种不良行为是由什么原因造成的?是 busybox 的 ifconfig 没有正确设置广播地址,还是内核设置不当?
注意:可能它们都不负责,但由于设备运行我不知道的用户特定软件,所以在启动过程中有其他东西妨碍了启动(并对其进行了错误的重新配置)。一旦我得到更多信息,我会跟进。
答案1
开始调查该主题时,我发现strace
更改广播地址会ifconfig
导致补充ioctl()
调用(SIOCSIFBRDADDR
- Set InterFace BRoadcast ADDRess),而当您省略广播参数时,该调用不会出现在正常跟踪中。因此,看起来 ifconfig 在默认情况下不处理广播地址,而是将其留给内核。
答案2
我敢打赌,它不是内核。
如果你有机器的 shell 访问权限,请尝试在 /etc 中递归地 grep 该字符串:
grep -R "192.168.70.255" *
这应该告诉您需要更改的配置在哪里。
答案3
这次真正阅读了这个问题后,我的直觉是,问题可能在于 BusyBox 做出了错误的假设,或者可能存在于某个平行宇宙中,其中有类路由没有消失。您没有说内核或 busybox 有多旧,但如果您可以获得较新版本的 busybox、ip 或机器上的 strace 副本,您可能能够测试哪个有问题。ip 或较新的 busybox 允许您使用已知行为良好的工具设置 ip 和网络掩码。如果仍然错误,则可能是内核的问题。如果正确,则是 busybox 的问题。使用 strace,您可以看到 busybox 正在进行的系统调用。
如果您无法在盒子上获得任何新的二进制文件,那么除了自己将广播设置为正确的值之外,您实际上没有什么可以做的。
答案4
广播是否可能是从 IP/掩码组合动态生成的,而您实际上输入了错误的网络掩码?