背景:
业务要求配置一个虚机,使其支持IPV6,且自动获取ipv6/ipv4的地址。
原配置如下:
TYPE=Ethernet
BOOTPROTO=dchp
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=yes
NAME=eth0
DEVICE=eth0
ONBOOT=yes
进入虚机配置了DHCPV6C=yes,IPV6INIT=yes依然不能自动获取IPV6地址,但是在虚机内使用dhclient -6 可以正常获取IPV6地址。
因此,可以排除虚机不支持IPV6,以及必要依赖软件为安装或未使能的情况。
后根据一篇关于DHCPV6C的文章,分析了/etc/sysconfig/network-scripts/内的脚本。
其中 /etc/sysconfig/network-scripts/ifup-eth是关于使用DHCP获取地址的脚本。
根据该脚本可以得出:
①IPV4_FAILURE_FATAL使能后,如果IPV4地址获取失败,结束本网卡获取地址的过程
②虚机内部使能IPV6地址获取的条件
ⅰ,虚机支持IPV6功能
ⅱ,使能DHCPV6C及IPV6INIT
ⅲ,IPV4_FAILURE_FATAL未使能或者IPV4地址正常获取到了
因此,关闭IPV4_FAILURE_FATA配置,即可防止IPV4获取失败导致IPV6地址也获取不到的情况。
// 获取IPV4地址阶段分析
if [ -n "${DYNCONFIG}" ] && [ -x /sbin/dhclient ]; then
if [[ "${PERSISTENT_DHCLIENT}" = [yY1]* ]]; then
ONESHOT="";
else
ONESHOT="-1";
fi;
generate_config_file_name
generate_lease_file_name
// 使用dhclient获取IPV4地址的参数
DHCLIENTARGS="${DHCLIENTARGS} -H ${DHCP_HOSTNAME:-${HOSTNAME%%.*}} ${ONESHOT} -q ${DHCLIENTCONF} -lf ${LEASEFILE} -pf /var/run/dhclient-${DEVICE}.pid"
echo
echo -n $"Determining IP information for ${DEVICE}..."
if [[ "${PERSISTENT_DHCLIENT}" != [yY1]* ]] && check_link_down ${DEVICE}; then
echo $" failed; no link present. Check cable?"
exit 1
fi
ethtool_set
// 使用dhclient 获取IP地址
if /sbin/dhclient ${DHCLIENTARGS} ${DEVICE} ; then
echo $" done."
dhcpipv4="good"
else
// 如果获取ipv4地址失败
echo $" failed."
// 且配置了IPV4_FAILURE_FATAL为Y[es]或y[es]或 1,退出本次地址配置过程。。。。。。不再去执行该网卡去获取IPV6地址的过程
if [[ "${IPV4_FAILURE_FATAL}" = [Yy1]* ]] ; then
exit 1
fi
// 如果获取IPV4失败,且未使能IPV4_FAILURE_FATAL,IPV6INIT也未使能或者DHCPV6C未使能,退出本次地址配置过程 。。。。。。不再去执行该网卡去获取IPV6地址的过程
if [[ "$IPV6INIT" = [nN0]* || "$DHCPV6C" != [yY1]* ]] ; then
exit 1
fi
net_log "Unable to obtain IPv4 DHCP address ${DEVICE}." warning
fi
# end dynamic device configuration
// 获取IPV6地址阶段分析
# IPv6 initialisation?
/etc/sysconfig/network-scripts/ifup-ipv6 ${CONFIG}
// IPV6配置检查的核心DHCPV6C是否开启,且是否有可执行的/sbin/dhclient
if [[ "${DHCPV6C}" = [Yy1]* ]] && [ -x /sbin/dhclient ]; then
generate_config_file_name 6
generate_lease_file_name 6
echo
echo -n $"Determining IPv6 information for ${DEVICE}..."
if /sbin/dhclient -6 -1 ${DHCPV6C_OPTIONS} ${DHCLIENTCONF} -lf ${LEASEFILE} -pf /var/run/dhclient6-${DEVICE}.pid -H ${DHCP_HOSTNAME:-${HOSTNAME%%.*}} ${DEVICE} ; then
echo $" done."
else
echo $" failed."
if [ "${dhcpipv4}" = "good" -o -n "${IPADDR}" ]; then
net_log "Unable to obtain IPv6 DHCP address ${DEVICE}." warning
else
exit 1
fi
fi
fi
版权声明:本文为u011142426原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。