Bond技术原理
Bond 就是将多块网卡虚拟成为一块网卡的技术,通过 bond 技术让多块网卡看起来是一个单独的以太网接口设备并具有相同的 IP 地址。
Bond 的原理是网卡在混杂 (promisc) 模式下运行;在这种模式下,网卡不像在通常情况下,只接收目的硬件地址是自身 Mac 的以太网帧,对于别的数据帧都滤掉,以减轻驱动程序的负担;而是接收网络上所有的数据帧,而且修改了驱动程序中的 mac 地址,将两块网卡的 Mac 地址改成相同,可以接收特定 mac 的数据帧,然后把相应的数据帧传送给 bond 驱动程序处理。
为了实现多块网卡的协同工作,Bond 模式将自己的 MAC 地址复制到各个物理网卡上,让所有的网卡共享同一个 MAC 地址。这个方式就要求所有的网卡都要支持 BIOS,这样才能够让操作系统将 MAC 地址写到网卡上;对于不支持 BIOS 读写的网卡而言,重起以后就恢复到网卡上 MAC 地址,服务器可能无法根据记录的 MAC 地址找到相对应的网卡。
对于单物理网卡的 Bond 网卡而言,Bond 网卡的 MAC 地址和物理网卡的物理地址是一致的;对于多物理网卡的 Bond 网卡而言,其中一块物理网卡会被设置为 Master,其他的网卡都是 Slave,Bond 网卡的 MAC 地址取自标志为 Master 的物理网卡,然后将这个 MAC 地址复制到其他物理网卡上。所以在指定用于安装 Linux 的网卡时,我们需要指定 Bond 网卡,以及 Bond 网卡所对应的标志为 Master 的物理网卡。(如果没有人为干预,一般情况下 Linux 所识别到的第一块网卡会被标志为 Master,也即使 eth0;对于有特殊配置的 Bond 网卡,需要根据具体的 Bond 配置情况来进行指定。)
下图是实验过程中的截图说明bond在工作过程中将驱动程序中的网卡mac改成形同:
bond的几种工作模式:
0或balance-rr 轮转策略,提供负载均衡和耐故障功能,按顺序轮流把包发给包含在bond口内的网口。
1或active-backup 主备策略,提供高耐故障功能,逻辑简单,一个处于激活状态,一个失败,另外一个自动激活。
2或balance-xor XOR策略,提供负载均衡和耐故障功能。
3或broadcast 广播策略,耐故障功能。把数据以广播的方式,发给包含在该bond口内的所有网口。
4或802.3ad IEEE 802.3ad动态链接集合。
5或balance-tlb 自动适应传输负载均衡策略。
6或balance-alb 自动适应负载均衡策略。
下面以实例说明bond的工作原理:
实验拓扑:
实验说明:
在虚拟机中linux系统中配置bond 增加为两块网卡,配置好后用物理机ping linux系统所在主机,过程中将一块网卡断掉测试结果
编辑网卡参数相关文件让网卡公用一个ip:
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth0
BOOTPROTO=dhcp ------ 使eth0自动获得地址
ONBOOT=yes
TYPE=Ethernet
~
~
~
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth1
BOOTPROTO=dhcp -------使eth1自动获得地址
ONBOOT=yes
~
~
~ 配置bond的参数 ,使bond0拥有个ip可供两个网卡使用
~
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-bond0
[root@localhost network-scripts]# cp ifcfg-eth0 ifcfg-bond0
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-bond0
~
DEVICE=bond0
BOOTPROTO=none
APADDR=192.168.2.99 ------给bond0一个静态地址
NETMASK=255.255.255.0
ONBOOT=yes
~
修改模块的配置文件 可以使bond加载驱动
[root@localhost network-scripts]# vim /etc/modprobe.conf
alias eth0 pcnet32
alias bond0 bonding
alias scsi_hostadapter mptbase
alias scsi_hostadapter1 mptspi
alias scsi_hostadapter2 ata_piix
alias snd-card-0 snd-ens1371
options bond0 miimon=100 mode=1 ----给bond0 一定参数 表示网络监视间隔为100ms 模式为1
options snd-card-0 index=0
options snd-ens1371 index=0
remove snd-ens1371 { /usr/sbin/alsactl store 0 >/dev/null 2>&1 || : ; }; /sbin/modprobe -r --ignore-remove snd-ens1371
alias eth1 pcnet32
~
~
修改开机脚本使bond0在开机的时候能够启动
[root@localhost network-scripts]# vim /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
ifenslave bond0 eth0 eth1 ---将bond0 eth0 eth1 绑定 加到开机脚本
~
测试结果:
当把其中的一个网卡关掉的时候 只是丢失了一个包仍是能够通讯
当把mode改为0时仍然具有耐故障功能只是丢了一个包仍能通讯,下面为测试结果:
当把mode改为3时仍然具有耐故障功能丢一个包继续通讯,下面为测试结果: