RedHat服务器网卡阵列配置攻略

2020-01-30 14:55:49于丽

与之前arp检测方式不同。这两种链路检测方式在各种mode下都是可以使用的,但要注意不能同时使用。
bonding的mii检测实现。首先和arp-monitor一样,mii也是定时器触发

复制代码
if(bond->params.miimon) { /* link checkinterval, in milliseconds. */
init_timer(mii_timer);
mii_timer->expires= jiffies + 1;
mii_timer->data = (unsigned long)bond_dev;
mii_timer->function = (void*)&bond_mii_monitor;
add_timer(mii_timer);
}

bond_mii_monitor函数其本质的原理就是检测网卡的链路状态,bonding定义网卡有4个链路状态:BOND_LINK_UP:
正常状态(处于该状态的网卡是是潜在的发送数据包的候选者)
BOND_LINK_FAIL:网卡出现故障,向状态BOND_LINK_DOWN 切换中
BOND_LINK_DOWN:失效状态
BOND_LINK_BACK:网卡恢复,向状态BOND_LINK_UP切换中
从上到下,表示了网卡链路从正常到失效再到恢复状态。bond_mii_monitor函数就是依次检查网卡的链路状态是否处于这些状态,然后通过标记 do_failover变量来说明当前是否需要切换slave网卡。代码篇幅较大,但逻辑还是很清晰的,故此处不罗列了。
在BOND_MODE_ACTIVEBACKUP模式下,两块网卡其实有一块是不工作的,被设置为IFF_NOARP的状态。同时,bond虚设备,还有 slave设备的MAC地址均一致,所以这张网卡不会被外界察觉存在。交换机也不存在想该端口发包的情况。当bond的mii检测发现当前的active 设备失效了之后,会切换到这个备份设备上。
在bond_change_active_slave函数中

复制代码
if (bond->params.mode ==BOND_MODE_ACTIVEBACKUP) {
if (old_active) {
bond_set_slave_inactive_flags(old_active);
}
if (new_active) {
bond_set_slave_active_flags(new_active);
}
}

这个就是在BOND_MODE_ACTIVEBACKUP模式下的切换逻辑,很简单,需要注意的是,在 bond_set_slave_inactive_flags(old_active)中,需要将接口的状态设置为IFF_NOARP,不然交换机就可能 会把数据包发送到一个错误的端口上。