admin管理员组

文章数量:1618719

背景:

业务要求配置一个虚机,使其支持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

 

本文标签: IPV4FAILUREFATALDHCP