该机器运行的是 SuSE 11.2。我使用 YaST2 图形网络界面将其配置为使用 DHCP 进行连接。
当我dhcpcd -k eth0
然后dhcpcd eth0
然后我几乎立即获得租约,一切都很好。但是,如果我ifdown eth0
然后ifup eth0
我大约 20 秒没有获得 IP 地址。查看网络数据包流表明,在 ifdown/up 情况下,dhcp 请求已成功广播,但从未收到任何响应。
编辑:启动期间也会发生同样的事情。在链接变为活动状态之前会发送广播数据包。
/var/log/messages 显示以下内容:
十二月 6 14:21:50 olm ifup: eth0 设备:Broadcom Corporation NetXtreme BCM5721 千兆以太网 PCI Express(修订版 21)
十二月 6 14:21:51 olm 内核:[3389.717366] tg3 0000:02:00.0: PME# 已禁用
十二月 6 14:21:51 olm 内核:[3389.936570] ADDRCONF(NETDEV_UP): eth0: 链接未就绪 十二月
6 14:21:51 olm ifup-dhcp: 在 eth0 上启动 DHCP4 客户端
十二月 6 14:21:51 olm dhcpcd[11807]: eth0: dhcpcd 3.2.3 正在启动
十二月 6 14:21:51 olm dhcpcd[11807]: eth0: 硬件地址 = 00:10:18:30:60:3c
十二月 6 14:21:51 olm dhcpcd[11807]: eth0: 广播租约
十二月 6 14:21:51 olm ifup-dhcp: 。
十二月 6 14:21:53 olm 内核:[3392.126437] tg3: eth0: 链路处于 1000 Mbps 状态,全双工。
十二月 6 14:21:53 olm 内核:[3392.126441] tg3: eth0: TX 和 RX 的流量控制均已打开。
十二月 6 14:21:53 olm 内核:[3392.127000] ADDRCONF(NETDEV_CHANGE):eth0:链接准备就绪
十二月 6 14:21:54 olm ifup-dhcp:。
十二月 6 14:21:55 olm avahi-daemon[3414]:在 eth0 上为 fe80::210:18ff:fe30:603c 注册新的地址记录。*。
十二月 6 14:21:57 olm ifup-dhcp:。
十二月 6 14:21:59 olm ifup-dhcp:
十二月 6 14:21:59 olm ifup-dhcp:eth0 DHCP4 在后台继续
十二月 6 14:22:04 olm 内核:[3403.004015] eth0:没有 IPv6 路由器
十二月 6 14:22:11 olm dhcpcd[11807]:eth0:超时
十二月 6 14:22:11 olm dhcpcd[11807]:eth0:尝试在“/var/lib/dhcpcd/dhcpcd-eth0.info”中使用旧租约 十二月 6 14:22:11 olm dhcpcd[
11807]:eth0:添加 IP 地址 172.26.59.123/26
十二月 6 14:22:11 olm dhcpcd[11807]: eth0: 通过 172.26.59.65 度量 0 添加默认路由
特别值得注意的是,dhcpcd 在 eth0 链路准备就绪之前就广播租约。它永远不会收到响应,因为广播实际上从未到达任何地方。
所以我的问题是,为什么 ifup-dhcp 在链接准备好之前启动 DHCP 进程?以及如何让它正确等待?
答案1
我找到了它在链路准备好之前请求租约的原因。这是因为 ifup-dhcp 确实会尝试等到接口准备好后再调用 dhcpcd,但它使用了is_iface_up
中定义的函数/etc/sysconfig/network/scripts/functions
,而该函数仅检查 eth0 是否存在才返回肯定的结果。
我还发现了一个(稍微)更长期的解决方案。ifup-dhcp 等待 is_iface_up 的肯定结果,然后等待 DHCLIENT_SLEEP 定义的额外秒数,该秒数可在 /etc/sysconfig/network/dhcp 中找到。通过设置 DHCLIENT_SLEEP="3",接口现在有时间在调用 dhcpcd 之前准备就绪,尽管 is_iface_up 返回得太快。这也不太可能被更新破坏。
答案2
如果盒子位于具有生成树的网络上,则可能是链接激活的延迟。这在重新启动期间不应该成为问题,但在停止/启动操作时会成为问题。您始终可以在 ifup 脚本中设置 sleep,但这实际上只是一种 hack。另一种选择是将一些逻辑写入 ifup 脚本以在进行 dhcp 调用之前检查链接状态。可以使用 ethtool 检查链接。或者您可以增加 dhcp 客户端超时。对 ifup 脚本的修改很容易被更新覆盖。