问题场景描述
在Linux系统网络配置中,我们经常遇到这样的场景:
auto lo eth0
iface lo inet loopback
iface eth0 inet dhcp
这种标准配置下,当DHCP服务器不可用时,系统启动过程会卡在获取IP地址的环节,导致启动无法完成。这对于需要保证系统高可用的生产环境来说是不可接受的。
解决方案原理
Linux的DHCP客户端实际上提供了超时机制,我们可以通过配置dhclient来实现:
- 设置合理的超时时间
- 配置超时后的回退行为
- 确保网络接口最终能被激活
具体配置方法
修改/etc/dhcp/dhclient.conf文件:
# 设置超时时间为10秒
timeout 10;
# 超时后使用链路本地地址
interface "eth0" {
supersede interface-mtu 1500;
request subnet-mask, broadcast-address, routers, domain-name-servers;
require subnet-mask;
script "/sbin/dhclient-script";
}
同时修改/etc/network/interfaces文件:
auto eth0
iface eth0 inet dhcp
# 设置DHCP超时后使用本地链路地址
post-up /sbin/ifconfig eth0 up || true
post-up /sbin/ip addr add 169.254.0.1/16 dev eth0 || true
进阶配置方案
对于更复杂的场景,可以使用NetworkManager结合自定义脚本:
#!/bin/bash
# /etc/NetworkManager/dispatcher.d/99-dhcp-fallback
IF=$1
STATUS=$2
if [ "$STATUS" = "dhcp4-change" ] || [ "$STATUS" = "up" ]; then
# 检查是否获取到IP
if ! ip addr show dev $IF | grep -q "inet "; then
# 设置本地链路地址
ip addr add 169.254.0.1/16 dev $IF
fi
fi
测试验证方法
可以通过以下命令模拟DHCP服务器不可用的情况:
# 停止网络服务
systemctl stop networking
# 手动触发DHCP请求
dhclient -v eth0
# 查看接口状态
ip addr show eth0
生产环境建议
- 对于关键业务系统,建议配置多网卡绑定
- 考虑使用keepalived实现高可用
- 监控网络状态并设置告警