网络冗余是工业网络的一项保障策略,目的是减轻意外中断的风险,当网络中一条通路(物理链路)发生故障断掉了,还可以通过其他通路(物理链路)传递信息。实现网络冗余可以使用Bonding技术,也叫Truncking和Etherchannel技术,把多个网络接口绑定在一起,形成一个逻辑上网络接口,在用户看来就是一个单独的网络接口。Bonding驱动有7种不同工作模式,根据不同的工作模式,可以提供不同的网络负载均衡服务和网络冗余服务。其7种工作模式如下,常用模式为0,1,6,其中1模式是这里用到的主备模式。
表1 Bonding的7种工作模式:
模式代号 | 模式名称 | 模式方式 | 说明 |
0 | balance-rr | Round-robin policy (循环策略) |
按照设备顺序依次传输数据包,第1个包走eth0,下一个包就走eth1….一直循环下去,直到最后一个传输完毕。这种模式提供负载均衡和容错能力 |
1 | active-backup | Active-backup policy (主备策略) |
只有一个设备处于活动状态。一个宕掉另一个马上由备份转换为主设备。mac地址是外部可见的。此模式提供了容错能力 |
2 | balance-xor | XOR policy (异或策略) |
根据MAC地址异或运算的结果来选择传输设备,提供负载均衡和容错能力 |
3 | broadcast | Broadcast policy (广播策略) |
将所有数据包传输给所有接口,通过全部设备来传输所有数据,提供容错能力 |
4 | 802.3ad | IEEE 802.3ad Dynamic link aggregation (动态链路聚合) |
创建共享相同速率和双工设置的聚合组,利用所有接口传输。需要交换机支持802.3ad模式 |
5 | balance-tlb | Adaptive transmit load balancing (自适应传输负载均衡) |
可以根据当前的负载把发出的数据分给每一个设备,由当前使用的设备处理收到的数据。本策略的通道联合不需要专用的交换机支持,提供负载均衡和容错能力 |
6 | balance-alb | Adaptive load balancing (自适应负载均衡) |
在5的基础上增加接收负载均衡,由ARP协商实现。bonding驱动截获本地发送的ARP应答,用其中一个从设备的MAC替换ARP应答中的源地址,让不同的端具有不通的MAC地址 |
英创Linux工控主板支持Bonding技术,能够实现双网络冗余方案。我们将bonding驱动编译成了.ko文件,以EM9287 + Linux-4.1.14为例,讲述双网络冗余方案的配置过程:
1)加载bonding.ko驱动,执行命令:insmod bonding.ko mode=1 miimon=100。
mode为表1所述的工作模式,miimon指定MII链路监控频率,单位是毫秒(ms),这将决定驱动检查每个slave链路状态频率。miimon=0表示禁止MII链路监控,100可以作为一个很好的初始参考值。bonding.ko还有很多参数,如downdelay、arp_interval,用户都可以通过这种形式传递给驱动程序,更详细的参数、工作模式、配置方式介绍详见linux源码文档Documentation/networking/bonding.txt。
2)加载bonding驱动后,默认创建一个虚拟网卡bond0,需要对bond0进行配置:
设置ip地址:ifconfig bond0 192.168.201.31 netmask 255.255.255.0 up
添加从设备eth0、eth1:ifenslave bond0 eth0 eth1
此时,bond0已经正常工作了,可以通过命令:cat /proc/net/bonding/bond0查看其工作状态,如图1所示。此时,bond0工作在模式1,主备策略,激活设备为eth0。此时拔掉eth0的网线,eth1将成为激活设备,继续保持通信。
图1 bond0工作状态
3)关闭bond0
执行命令ifconfig bond0 down即可关闭bond0,通信中断。此时,eth0和eth1依然处在SLAVE状态,并不能作为正常网络接口通信。
4)释放bond0中的eth0和eth1
释放bond0中eth0和eth1后,关闭bond0时需要释放bond0原来所占用的IP。
ifenslave -d bond0 eth0 eth1 #从bond0中删除eth0,eth1
ifconfig bond0 0.0.0.0 down #关闭bond0,释放ip地址
如需eth0、eth1重新作为单独网卡工作,使用ifconfig eth0 ipaddress重新设定ip地址。
用户可以将2)、4)操作写成两个脚本文件:bonding-up.sh、bonding-release.sh。将它们放在和bonding.ko相同目录下,使用bonding时执行./bonding-up.sh;关闭bonding时执行命令ifconfig bond0 down;释放从设备时,调用./bonding-release.sh即可。
bonding-up.sh内容如下:
ifconfig bond0 192.168.201.31 up
ifenslave bond0 eth0 eth1
bonding-release.sh内容如下:
ifenslave -d bond0 eth0 eth1#bond0 should be up state
ifconfig bond0 0.0.0.0 down
另外,如果用户需要开机直接运行bonding驱动,可以在/mnt/nandflash/user.sh中以绝对路径调用bonding-up.sh文件。
user.sh示例:
insmod /mnt/nandflash/bonding.ko mode=1 miimon=100
/mnt/nandflash/bonding-up.sh