HACK#26 bonding驱动程序

本节介绍使用bonding驱动程序将多个物理网络设备绑定方法。

bonding是将多个物理网络设备绑定的驱动程序。绑定bonding说法来自于黏合剂bond。绑定的运行根据模式不同而有所差异。Linux的bonding有7种模式,本节将介绍的是普遍较常使用的激活备份模式。

本节中所举的示例是将物理网络设备eth0和eth1绑定,构成bonding设备bond0的环境(见图4-2)。

HACK#26 bonding驱动程序 - 图1

图 4-2 本节的bonding构成(激活备份模式)

构成bond0的eth0/eth1称为从设备(slave)。bond0称为主设备(master)。激活备份模式时,激活的slave eth0进行通信。eth1为备份,处于待命状态。

使用方法

Linux的bonding有7种模式。下面先简单地介绍各种模式。模式的名称就是直接指定到模块参数的字符串。也可以使用()中的数字来指定模式。


balance-rr(0)


通过轮询(round robin)来分散负载。发送数据时,第一个数据从eth0发送,第二个数据从eth1发送。依次由eth0/eth1发送。


active-backup(1)


多个从设备中的一个运行。这个从设备称为激活的从设备。如果激活从设备出现故障,断开链接(link down)时,则切换为其他从设备。这个模式称为激活备份模式。


balance-xor(2)


通过MAC地址的异或结果(XOR)来决定从设备。从设备由散列队列(hashlist)进行管理,根据使用某计算公式求得的散列值来决定从设备。计算出散列值的方法称为散列策略(hash policy)。balance-xor模式的计算公式为((发送方MAC地址xor接收方MAC地址)/从设备数)。将得到的余数作为散列值。由于使用Ether头的MAC地址,因此将这个策略称为layer2。可以在xmit_hash_policy模块选项中更改散列策略。除layer2以外,还有layer2+3和layer3+4。layer2+3是通过MAC地址和IP地址的组合来计算出散列值。layer3+4是通过MAC地址、IP地址和TCP、UDP的端口号的组合来算出散列值。在这个模式下,只要上述条件不改变,就会使用相同从设备。


broadcast(4)


已连接的所有从设备发送相同数据。即使某个从设备发送失败也不会中断,而是从其他从设备发送数据。

此外还有802.3ad(4)、balance-tlb(5)、balance-alb(6)。详细情况请看参考文献。默认为轮询。使用激活备份模式时需要按下列方法将模块安装到内核中。


modprobe bonding mode=active-backup


或者执行下列命令。


modprobe bonding mode=1


一般在准备其他模块参数时同时准备接口的配置文件。这样在启动时bonding接口就会启用。RHEL6中不是在modprobe.conf中而是在/etc/modprobe.d/*.conf中设置bonding模块的别名(alias)。这里的文件名设置为bond.conf。


cat/etc/modprobe.d/bond.conf

alias bond0 bonding

alias bond1 bonding


接口的配置文件如下。


cat/etc/sysconfg/network-scripts/ifcfg-eth0

DEVICE="eth0"

NM_CONTROLLED="no"

ONBOOT=no

HWADDR=AA:AA:AA:AA:AA:AA

TYPE=Ethernet

BOOTPROTO=none

MASTER=bond0

SLAVE=yes

cat/etc/sysconfg/network-scripts/ifcfg-eth1

DEVICE="eth1"

NM_CONTROLLED="no"

ONBOOT=no

HWADDR=BB:BB:BB:BB:BB:BB

TYPE=Ethernet

BOOTPROTO=none

MASTER=bond0

SLAVE=yes

cat/etc/sysconfg/network-scripts/ifcfg-bond0

DEVICE=bond0

ONBOOT=yes

BOOTPROTO=static

IPADDR=192.168.0.10

NETMASK=255.255.255.0

NETWORK=192.168.0.0

BROADCAST=192.168.0.255

BONDING_OPTS="mode=1 miimon=100 primary=eth0"


上例是在ifcfg-bond0中记载的BONDING_OPT。这是用来设置模块选项的。通过写入ifcfg-bond0文件,对每个bonding接口设置选项。因此在RHEL6并不推荐在/etc/modprobe.d/bond.conf下使用option来记载bonding模块的选项。在配置文件里记载后,就可以使用ifup bond0来启动bonding设备。成为从设备的接口可以使用ifconfig命令确认。


ifconfg eth0

eth0 Link encap:Ethernet HWaddr 00:1B:21:0F:91:8F

UP BROADCAST SLAVE MULTICAST MTU:1500 Metric:1有SLAVE

RX packets:0 errors:0 dropped:0 overruns:0 frame:0

TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:0(0.0 b)TX bytes:0(0.0 b)

Interrupt:16 Memory:efbc0000-efbe0000


bonding接口的设置内容可以在下列proc文件系统中确认。


cat/proc/net/bonding/bond0

Ethernet Channel Bonding Driver:v3.7.0(June 2,2010)

Bonding Mode:fault-tolerance(active-backup)

Primary Slave:eth2(primary_reselect always)

Currently Active Slave:eth0激活slave

MII Status:down

MII Polling Interval(ms):100

Up Delay(ms):0

Down Delay(ms):0

Slave Interface:eth0

MII Status:down

Speed:100 Mbps

Duplex:full

Link Failure Count:0

Permanent HW addr:aa:aa:aa:aa:aa:aa原始的MAC地址

Slave queue ID:0

Slave Interface:eth1

MII Status:down

Speed:100 Mbps

Duplex:full

Link Failure Count:0

Permanent HW addr:bb:bb:bb:bb:bb:bb

Slave queue ID:0