Linux 网卡 Bonding 配置

一、bonding技术

简介

 bonding(绑定)是一种将n个物理网卡在系统内部抽象(绑定)成一个逻辑网卡的技术,能够提升网络吞吐量、实现网络冗余、负载等功能,有很多优势。
 Linux 系统下支持网络 Bonding,也叫 channel Bonding,它允许你将 2 个或者更多的网卡绑定到一起,成为一个新的逻辑网卡,从而实现故障切换或者负载均衡的功能,具体情况要取决于 mode 参数的具体配置。
 Linux系统bonding技术是内核层面实现的,它是一个内核模块(驱动)。使用它需要系统有这个模块, 我们可以modinfo命令查看下这个模块的信息, 一般来说都支持。

modinfo bonding

bonding的七种工作模式

bonding技术提供了七种工作模式,在使用的时候需要指定一种,每种有各自的优缺点.

balance-rr (mode=0) 默认, 有高可用 (容错) 和负载均衡的功能, 需要交换机的配置,每块网卡轮询发包 (流量分发比较均衡).
active-backup (mode=1) 只有高可用 (容错) 功能, 不需要交换机配置, 这种模式只有一块网卡工作, 对外只有一个mac地址。缺点是端口利用率比较低
balance-xor (mode=2) 不常用
broadcast (mode=3) 不常用
802.3ad (mode=4) IEEE 802.3ad 动态链路聚合,需要交换机配置,没用过
balance-tlb (mode=5) 不常用
balance-alb (mode=6) 有高可用 ( 容错 )和负载均衡的功能,不需要交换机配置 (流量分发到每个接口不是特别均衡)

详细说明请参考网络上其他资料,了解每种模式的特点根据自己的选择就行, 一般会用到0、1、4、6这几种模式。

二、RHEL6 下的 Bonding 配置:

在所有的 RHEL 版本下,目前都不支持在 NetworkManager 服务协作下实现 Bonding 配置.所以要么直接关闭 NetworkManager 服务,并取消其开机启动,要么在所有涉及 Bonding 的网卡配置文件中(包含ethx 或者 bondY),显式地添加一行:NM_CONTROLLED=no

要配置网卡 Bonding,你必须在/etc/sysconfig/network-scripts/目录下建立逻辑网卡的配置文件 ifcfg-bondX,一般 X 从 0 开始,依次增加.具体的文件内容根据参与 Bonding 的网卡类型的不同又有所差别,以最最常见的 Ethernet 为例,配置文件大致是这样的:

DEVICE=bond0
IPADDR=192.168.0.1
NETMASK=255.255.255.0
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
BONDING_OPTS="bonding parameters separated by spaces" 
NM_CONTROLLED=no

BONDING_OPTS 这一行填写你需要的 Bonding 模式,比如 BONDING_OPTS=“miimon=100 mode=1” ,下面也会介绍几种常见的配置方式和它代表的意义,这里暂时不展开说明.为了方便称呼,我们把Bongding 后的逻辑网卡 bondX 称为主网卡(Master),参与 Bonding 的物理网卡 ethY 称为子网卡(Slave)。

主网卡配置文件创建完毕以后,子网卡的配置文件也需要做相应的改变,主要是添加 MASTER=和SLAVE=这两项参数,我们假设 2 张子网卡为 eth0 和 eth1,那么他们的配置文件大致的样子会是这样子:

DEVICE=ethX
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USERCTL=no
NM_CONTROLLED=no

像这样,分别修改 ifcfg-eth0 和 ifcfg-eth1 配置文件,DEVICE=ethX 中的 X 用相应的值代替.然后我们重启网络服务。

service network restart

这样子,子网卡为 eth0 和 eth1,主网卡为 bond0,模式为 mode 1 的网络 Bonding 就完成了。

rhel6 bonding 实例展示

系统: rhel6
网卡: eth2、eth3
bond0:10.200.100.90
负载模式: mode1(active-backup) # 这里的负载模式为1,也就是主备模式.

1、关闭和停止NetworkManager服务

service  NetworkManager stop
chkconfig NetworkManager off

ps: 如果有装的话关闭它,如果报错说明没有装这个,那就不用管

2、加载bonding模块

modprobe --first-time bonding

3、创建基于bond0接口的配置文件

[root@rhel6.6 network-scripts]# cat ifcfg-bond0
DEVICE=bond0
BOOTPROTO=none
IPADDR=10.200.100.90
NETMASK=255.255.255.0
ONBOOT=yes
NM_CONTROLLED=no
USERCTL=no
BONDING_OPTS="mode=1 miimon=200"

4、SLAVE网卡的配置文件

两种子网卡的配置文件如下:

[root@rhel6.6 network-scripts]# cat ifcfg-eth2
DEVICE=eth2
#HWADDR=14:58:D0:5A:0F:76
NM_CONTROLLED=no
#UUID=3b718bed-e8d4-4b64-afdb-455c8c3ccf91
ONBOOT=yes
#NM_CONTROLLED=yes
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
USERCTL=no
[root@rhel6.6 network-scripts]# cat ifcfg-eth3
DEVICE=eth3
#HWADDR=14:58:D0:5A:0F:77
NM_CONTROLLED=no
#UUID=988835c2-8bfa-4788-9e8d-e898f68458f0
ONBOOT=yes
#NM_CONTROLLED=yes
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
USERCTL=no

5、bonding信息查看

重启网络服务器后bonding生效

[root@rhel6.6 network-scripts]# ip a
4: eth2: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond0 state UP qlen 1000
    link/ether c4:34:6b:ac:5c:9e brd ff:ff:ff:ff:ff:ff
5: eth3: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond0 state UP qlen 1000
    link/infiniband a0:00:03:00:fe:80:00:00:00:00:00:00:00:02:c9:03:00:0a:6f:ba brd 00:ff:ff:ff:ff:12:40:1b:ff:ff:00:00:00:00:00:00:ff:ff:ff:ff
10: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether c4:34:6b:ac:5c:9e brd ff:ff:ff:ff:ff:ff
    inet 10.200.100.90/24 brd 10.212.225.255 scope global bond0
    inet6 fe80::c634:6bff:feac:5c9e/64 scope link 
       valid_lft forever preferred_lft forever
[root@rhel6.6 network-scripts]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009)

Bonding Mode: fault-tolerance (active-backup)			# bond0接口采用mode1
Primary Slave: None
Currently Active Slave: eth2
MII Status: up
MII Polling Interval (ms): 200
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth2
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: c4:34:6b:ac:5c:9e
Slave queue ID: 0

Slave Interface: eth3
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: c4:34:6b:ac:5c:9f
Slave queue ID: 0

进行高可用测试,拔掉其中的一条网线看丢包和延时情况, 然后在插回网线(模拟故障恢复),再看丢包和延时的情况.

三、RedHat7配置bonding

系统: Red Hat Enterprise Linux Server release 7.6 (Maipo)
网卡: eno3、eno4
bonding:bond0
负载模式: mode1(active-backup)

服务器上两张物理网卡eno3和eno4, 通过绑定成一个逻辑网卡bond0,bonding模式选择mode1

注: ip地址配置在bond0上, 物理网卡不需要配置ip地址.

1、关闭和停止NetworkManager服务

RedHat7默认安装了NetworkManager,在配置前先关掉NetworkManager服务,否则可能会对bonding或造成问题。

systemctl stop NetworkManager.service     # 停止NetworkManager服务
systemctl disable NetworkManager.service  # 禁止开机启动NetworkManager服务

2、加载bonding模块

modprobe --first-time bonding

没有提示说明加载成功, 如果出现modprobe: ERROR: could not insert ‘bonding’: Module already in kernel说明你已经加载了这个模块, 就不用管了

你也可以使用lsmod | grep bonding查看模块是否被加载

lsmod | grep bonding
bonding               152656  0 

3、创建基于bond0接口的配置文件

[root@ReHat7.6 network-scripts]# cat ifcfg-bond0
DEVICE=bond0
IPADDR=10.211.100.10
NETMASK=255.255.255.0
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
NM_CONTROLLED=no
BONDING_OPTS="mode=1 miimon=200"

上面的BONDING_OPTS=“mode=1 miimon=200” 表示这里配置的工作模式是mode1, miimon表示监视网络链接的频度 (毫秒), 我们设置的是100毫秒, 根据你的需求也可以指定mode成其它的负载模式。

4、修改eno3、eno4子接口的配置文件

[root@ReHat7.6 ]# cat ifcfg-eno3
NAME=eno3
DEVICE=eno3
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
UESCTL=no
NM_CONTROLLED=no
[root@ReHat7.6 ]# cat ifcfg-eno4
NAME=eno4
DEVICE=eno4
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
UESCTL=no
NM_CONTROLLED=no

5、查看bonding信息

重启网络服务

systemctl restart network

查看bond0的接口状态信息 ( 如果报错说明没做成功,很有可能是bond0接口没起来)

[root@ReHat7.6 network-scripts]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup)		// 绑定模式: 主备模式(mode 1)
Primary Slave: None
Currently Active Slave: eno4			// 当前活动接口
MII Status: up							// 接口状态: up(MII是Media Independent Interface简称, 接口的意思)
MII Polling Interval (ms): 200		 	// 接口轮询的时间隔(这里是200ms)
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eno3					// Slave 接口,也就是受bond管控的接口
MII Status: up							// 接口状态: up(MII是Media Independent Interface简称, 接口的意思)
Speed: 1000 Mbps                         // 端口的速率是1000 Mpbs
Duplex: full							// 全双工
Link Failure Count: 0					// 链接失败次数: 0
Permanent HW addr: 74:46:a0:f4:9f:c2     // 永久的MAC地址
Slave queue ID: 0

Slave Interface: eno4
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 74:46:a0:f4:9f:c3
Slave queue ID: 0
[root@ReHat7.6 ~]# ip a
1: eno3: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond0 state UP group default qlen 1000
    link/ether 74:46:a0:f4:9f:c2 brd ff:ff:ff:ff:ff:ff
2: eno4: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond0 state UP group default qlen 1000
    link/ether 74:46:a0:f4:9f:c2 brd ff:ff:ff:ff:ff:ff
3: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 74:46:a0:f4:9f:c2 brd ff:ff:ff:ff:ff:ff
    inet 10.211.100.10/24 brd 10.211.139.255 scope global bond0
       valid_lft forever preferred_lft forever

四、Bonding命令行管理工具 ifenslave

ifslave 可以绑定、分离和切换活动网卡,同样ifslave的使用需要内核支持bonding。

 modprobe bonding      // 加载内核模块  
 ifenslave bond0 eth0 eth1      // 绑定网卡
 ifconfig bond0 192.168.0.1 netmask 255.255.0.0    // 配置IP
 ifenslave -c bond0 eth1      // 切换活动网卡到eth1
 ifenslave -d bond0 eth1     // 从bond0中移除eth1

高可用测试中(插拔网线)发现:在mode=6模式下丢包1个, 恢复网络时( 网络插回去 ) 丢包在5-6个左右,说明高可用功能正常但恢复的时候丢包会比较多
测试mode=1模式下丢包1个,恢复网络时( 网线插回去 ) 基本上没有丢包,说明高可用功能和恢复的时候都正常
mode6这种负载模式除了故障恢复的时候有丢包之外其它都挺好的,如果能够忽略这点的话可以这种模式;而mode1故障的切换和恢复都很快,基本没丢包和延时。但端口利用率比较低,因为这种主备的模式只有一张网卡在工作。

参考:
http://blog.chinaunix.net/uid-31410005-id-5818605.html
https://www.cnblogs.com/dkblog/p/3613407.html
https://www.cnblogs.com/huangweimin/articles/6527058.html
https://www.cnblogs.com/dkblog/p/3613407.htmlLinux