我如何稍后启动 DHCP3 服务器,以便它等待桥接接口初始化后再加载?

我如何稍后启动 DHCP3 服务器,以便它等待桥接接口初始化后再加载?

我目前有一台安装了 dhcp3-server 的 Ubuntu 10.04 服务器以及一个用于虚拟机的桥接接口 (br0)。我遇到的问题是,当服务器重新启动时,由于启动桥接接口导致的额外延迟,dhcp3-server 无法加载。

本质上,直到启动周期后期,也就是 DHCP3 服务器尝试加载之后,br0 才具有可供 DHCP3 服务器使用的 IP 地址。

服务器启动后,我就可以毫无问题地运行“/etc/init.d/dhcp3-server start”。

有什么方法可以做到: - 强制 dhcp3-server 等到接口加载完成后再尝试加载? - 在其他所有内容都加载完成后启动 dhcp3-server?

答案1

一个解决方案是告诉 dhcp-server 不要自动启动,然后将以下两行添加到您/etc/network/interfaces的桥接定义文件中

post-up /etc/init.d/dhcp3-server start
pre-down /etc/init.d/dhcp3-server stop

所以最终看起来会像这样

iface br0 inet static
    bridge_ports eth0 eth1
    address 192.168.1.2
    broadcast 192.168.1.255
    netmask 255.255.255.0
    gateway 192.168.1.1
    post-up /etc/init.d/dhcp3-server start
    pre-down /etc/init.d/dhcp3-server stop

这样,网络管理(ifup/ifdown,而不是网络管理器)将在启动网桥后启动 DHCP 服务器,并在移除网桥之前将其关闭。

答案2

您可以修改/etc/init.d/dhcp3-server启动脚本以等待 上的可用 IP 地址br0。例如:(警告:未经测试的代码!)

# wait 5 secs between br0-ready tests
wait_time_between_probes=5
# maximum number of attempts (i.e., timeout)
max_attempts=10

log_progress_msg "Waiting for br0 to get an IP address"
for n in $(seq 1 $max_attempts); do
  if /sbin/ifconfig br0 | egrep -q "inet addr:" ; then
    # IP address ready on br0, exit loop
    break
  else
    sleep $wait_time_between_probes
  fi
done
if [ "$n" = "$max_attempts" ]; then
    log_warning_msg "Maximum number of attempts reached, but br0 has no IP address yet" 
    log_warning_msg "Continuing anyway but DHCP3 server might not start correctly"
fi 

该代码片段应放入启动脚本中,位于case ... start)DHCP3 守护进程启动之前的部分。当然,您应该调整等待时间和尝试次数以匹配您的环境(br0 获取 IP 地址最多需要多长时间?)

相关内容