Linux网卡绑定探析
2013-08-20 15:39:31
现在很多服务器都自带双千兆网口,利用网卡绑定既能增加网络带宽,同时又能做相应的冗余,目前应用于很多的场景。linux操作系统下自带的网卡绑定模式,Linux bonding驱动提供了一个把多个网络接口设备捆绑为单个网络接口设置来使用,用于网络负载均衡及网络冗余。当然现在网卡产商也会出一些针对windows操作系统网卡管理软件来做网卡绑定(windows操作系统没有网卡绑定功能 需要第三方支持)。
我们公司是做分布式文件系统的,很多项目都用到网卡绑定来提高性能。在网络找了很多资料,也做了大量的测试,下面就网卡绑定谈一下自己的看法。
一、 Bonding的应用
1、 网络负载均衡
对于bonding的网络负载均衡是我们在文件服务器中常用到的,比如把三块网卡,当做一块来用,解决一个IP地址,流量过大,服务器网络压力过大的问题。如果在内网中,文件服务器为了管理和应用上的方便,大多是用同一个IP地址。对于一个百M的本地网络来说,文件服务器在多个用户同时使用的情况下,网络压力是极大的,为了解决同一个IP地址,突破流量的限制,毕竟网线和网卡对数据的吞吐量是有限制的。如果在有限的资源的情况下,实现网络负载均衡,最好的办法就是bonding 。
2、 网络冗余
对于服务器来说,网络设备的稳定也是比较重要的,特别是网卡。大多通过硬件设备的冗余来提供服务器的可靠性和安全性,比如电源。bonding 也能为网卡提供冗余的支持。把网个网卡绑定到一个IP地址,当一块网卡发生物理性损坏的情况下,另一块网卡也能提供正常的服务。
二、 Bonding的原理
什么是bonding需要从网卡的混杂(promisc)模式说起。我们知道,在正常情况下,网卡只接收目的硬件地址(MAC Address)是自身Mac的以太网帧,对于别的数据帧都滤掉,以减轻驱动程序的负担。但是网卡也支持另外一种被称为混杂promisc的模式,可以接 收网络上所有的帧,比如说tcpdump,就是运行在这个模式下。bonding也运行在这个模式下,而且修改了驱动程序中的mac地址,将两块网卡的 Mac地址改成相同,可以接收特定mac的数据帧。然后把相应的数据帧传送给bond驱动程序处理。
三、 Bonding的模式
linux有七种网卡绑定模式:
模式代号 |
模式名称 |
模式方式 |
说明 |
0 |
(balance-rr) Round-robin policy |
轮询策略 |
该策略是按照设备顺序依次传输数据包,直到最后一个设备。这种模式提供负载均衡和容错能力。 |
1 |
(active-backup) Active-backup policy |
主备策略 |
该策略只有一个设备处于活动状态。 一个宕掉另一个马上由备份转换为主设备。mac地址是外部可见的。 此模式提供了容错能力。 |
2 |
(balance-xor) XOR policy |
异或策略 |
该策略是根据MAC地址异或运算的结果来选择传输设备,提供负载均衡和容错能力。 |
3 |
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 |
适配器负载均衡 |
该策略在IPV4情况下包含适配器传输负载均衡策略,由ARP协商完成接收的负载,通道联合驱动程序截获ARP在本地系统发送出的请求,用其中一个设备的硬件地址覆盖从属设备的原地址。 |
1.编辑虚拟网卡band0的配置文件ifcfg-bond0,加入以下内容:
2、编辑各个网卡的配置文件,这里用eth1和eth2。
3、修改/etc/modprobe.conf 文件,加入以下内容:
注:
(1)、miimon 是链路监测的时间间隔单位是毫秒,miimon=100的意思就是,每100毫秒检测网卡和交换机之间是否连通,如不通则使用另外的链路。
(2)、mode=0 表示负载均衡方式,两块网卡都工作,需要交换机作支持。
mode=1 表示冗余方式,网卡只有一个工作,一个出问题启用另外的。
mode=6 表示负载均衡方式,两块网卡都工作,不需要交换机作支持。
4、重启网络:
5、查看bond0的工作状态:
6、查看绑定后的结果:
总之,网卡绑定就是多张网卡逻辑上作为一张网卡用。可分为,负载均衡绑定和冗余绑定两种。
Redhat Linux网卡配置与绑定
Redhat Linux的网络配置,基本上是通过修改几个配置文件来实现的,虽然也可以用ifconfig来设置IP,用route来配置默认网关,用hostname来配置主机名,但是重启后会丢失。
相关的配置文件
/ect/hosts 配置主机名和IP地址的对应
/etc/sysconfig/network 配置主机名和网关
/etc/sysconfig/network-scripts/ifcfg-eth0 eth0配置文件,eth1则文件名为ifcfg-eth1,以此类推
一、网卡配置
假设我们要配置主机名为test,eth0的IP地址192.168.168.1/24,网关地址192.168.168.250
则/etc/sysconfig/network文件内容如下:
NETWORKING=yes
HOSTNAME=test
GATEWAY=192.168.168.250
eth0对应的配置文件/etc/sysconfig/network-scripts/ifcfg-eth0内容如下:
DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.168.1
NETMASK=255.255.255.0
TYPE=Ethernet
ONBOOT=yes
二、单网卡绑定多个IP
有时,我们需要在一块网卡上配置多个IP,例如,在上面的例子中,我们还需要为eth0配置IP 192.168.168.2和192.168.168.3。那么需要再在/etc/sysconfig/network-scripts下新建两个配置文件:
ifcfg-eth0:0内容如下:
DEVICE=eth0:0
BOOTPROTO=static
IPADDR=192.168.168.2
NETMASK=255.255.255.0
ONBOOT=yes
ifcfg-eth0:1内容如下:
DEVICE=eth0:1
BOOTPROTO=static
IPADDR=192.168.168.3
NETMASK=255.255.255.0
ONBOOT=yes
三、多个网卡绑定成一块虚拟网卡
为了提供网络的高可用性,我们可能需要将多块网卡绑定成一块虚拟网卡对外提供服务,这样即使其中的一块物理网卡出现故障,也不会导致连接中断。比如我们可以将eth0和eth1绑定成虚拟网卡bond0
首先在/etc/sysconfig/network-scripts/下创建虚拟网卡bond0的配置文件ifcfg-bond0,内容如下
DEVICE=bond0
BOOTPROTO=none
BROADCAST=192.168.168.255
IPADDR=192.168.168.1
NETMASK=255.255.255.0
NETWORK=192.168.168.0
ONBOOT=yes
TYPE=Ethernet
GATEWAY=192.168.168.250
USERCTL=no
然后分别修改eth0和eth1的配置文件
ifcfg-eth0内容:
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
MASTER=bond0
SLAVE=yes
ifcfg-eth1内容
DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
MASTER=bond0
SLAVE=yes
因为linux的虚拟网卡是在内核模块中实现的,所以需要安装的时候已经装好该module。在/etc/modules.conf文件中添加如下内容(如果没有该文件,则新建一个):
alias bond0 bonding
options bond0 miimon=100 mode=1 primary=eth0
其中miimon=100表示每100ms检查一次链路连接状态,如果不通则会切换物理网卡
mode=1表示主备模式,也就是只有一块网卡是active的,只提供失效保护。如果mode=0则是负载均衡模式的,所有的网卡都是active,还有其他一些模式很少用到
primary=eth0表示主备模式下eth0为默认的active网卡
最后,在/etc/rc.local中加入
modprobe bonding miimon=100 mode=1
重启机器后可以看到虚拟网卡已经生效,可以通过插拔两个物理网卡的网线来进行测试,不过linux中网卡接管的时间好象比较长
Linux系统下双网卡bonding的配置方法
进入 /etc/sysconfig/network-scripts 目录下创建一个文件 ifcfg-bond0或cp ifcfg-eth0 ifcfg-bond0
Vi ifcfg-bond0 编辑内容如下
DEVICE=bond0
BOOTPROTO=static
IPADDR=192.168.10.1
NETMASK=255.255.255.0
GATEWAY=192.168.10.254
ONBOOT=yes
TYPE=Ethernet
VI ifcfg-eth0 编辑内容如下
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
MASTER=bond0
SLAVE=yes
VI ifcfg-eth1 编辑内容如下
DEVICE=eth1
BOOTPROTO=static
ONBOOT=yes
MASTER=bond0
SLAVE=yes
编辑 vi /etc/ modprobe.conf
在最后面加入
alias bond0 bonding
options bond0 miimon=100 mode=0
说明:miimon是用来进行链路监测的。 比如:miimon=100,那么系统每100ms监测一次链路连接状态,如果有一条线路不通就转入另一条线路;mode的值表示工作模式,他共有0,1,2,3四种模式,常用的为0,1两种。mode=0表示load balancing (round-robin)为负载均衡方式,两块网卡都工作。mode=1表示fault-tolerance (active-backup)提供冗余功能,工作方式是主备的工作方式,也就是说默认情况下只有一块网卡工作,另一块做备份. bonding只能提供链路监测,即从主机到交换机的链路是否接通。如果只是交换机对外的链路down掉了,而交换机本身并没有故障,那么bonding会认为链路没有问题而继续使用,Bond配置完成
重启网络即可 service network restart
查看 /proc/net/bonding/目录下bond0文件,能看到双网卡的运行状态
-----------------------------------------------------
linux双网卡绑定概念以及介绍:
linux设置bond网卡绑定
Linux双网卡绑定实现就是使用两块网卡虚拟成为一块网卡;linux设置bond网卡绑定---有些用。 通过查看bond0的工作状态查询能详细的掌握bonding的工作状态 双网卡邦定的拓朴图 vi /etc/sysconfig/ network-scripts/ ifcfg-bond0 2、#vi ifcfg-bond0 # cat ifcfg-bond0 这里要主意,不要指定单个网卡的IP 地址、子网掩码或网卡 ID。将上述信息指定到虚拟适配器(bonding)中即可。 [root@rhas-13 network-scripts]# cat ifcfg-eth0 3、# vi /etc/modules.conf alias bond0 bonding
|
CentOS6.2网卡绑定配置
下面主要介绍在CentOS6.2下使用系统自带的bonding进行网卡绑定的详细步骤,在此之前你可以看一下Linux网卡绑定探析,你也可以使用网卡绑定的脚本进行网卡绑定操作。
注意:请在配置前关闭NetworkManager服务
[root@h63 ~]# service NetworkManager status && service NetworkManager start
网卡绑定一次可以绑定多个网卡,你可以使用ifconfig -a查看你的网卡信息,例如:
[root@h63 ~]# ifconfig -a
em1 Link encap:Ethernet HWaddr 78:2B:CB:30:08:03
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:48236002 errors:0 dropped:0 overruns:0 frame:0
TX packets:16156472 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4838973371 (4.5 GiB) TX bytes:1301118550 (1.2 GiB)
Interrupt:36 Memory:d6000000-d6012800
em2 Link encap:Ethernet HWaddr 78:2B:CB:30:08:05
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:42385720 errors:0 dropped:0 overruns:0 frame:0
TX packets:7283526 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4307780986 (4.0 GiB) TX bytes:466840625 (445.2 MiB)
Interrupt:48 Memory:d8000000-d8012800
em3 Link encap:Ethernet HWaddr 78:2B:CB:30:08:07
BROADCAST MULTICAST MTU:1500 Metric:1
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:32 Memory:da000000-da012800
em4 Link encap:Ethernet HWaddr 78:2B:CB:30:08:09
BROADCAST MULTICAST MTU:1500 Metric:1
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:42 Memory:dc000000-dc012800
这里有4个网卡,分别是em1、em2、em3和em4,我们把em1和em2做一个绑定,绑定模式为6(关于网卡绑定模式的介绍请看Linux网卡绑定探析),首先我给给网卡绑定后的设备起个名字bond0(名称可以自定义),并创建:
[root@h63 ~]# vim /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0 #设备名称
BOOTPROTO=static #静态IP
ONBOOT=yes #自动启动
IPADDR=172.16.16.63 #设备绑定的IP
GATEWAY=172.16.23.254 #设备绑定的网关
NETMASK=255.255.248.0 #设备绑定的掩码
TYPE=Ethernet #设备绑定的类型
编辑需要绑定的网卡:
[root@h63 ~]# vim /etc/sysconfig/network-scripts/ifcfg-em1
DEVICE=em1
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0 #绑定后的设备名称
SLAVE=yes
TYPE=Ethernet
[root@h63 ~]# vim /etc/sysconfig/network-scripts/ifcfg-em2
DEVICE=em2
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0 #绑定后的设备名称
SLAVE=yes
TYPE=Ethernet
说明:配置网卡时不要填写IP地址和MAC地址
配置加载模式设置:
[root@h63 ~]# vim /etc/modprobe.conf
alias bond0 bonding
options bond0 miimon=100 mode=6
说明:mode是网卡绑定的模式,此处是模式6
也可以在/etc/modprobe.d/下创建一个文件:
[root@h63 ~]# vim /etc/modprobe.d/bond
alias bond0 bonding
options bond0 miimon=100 mode=6
绑定配置完成,重启网络服务
[root@h63 ~]#service network restart
查看网卡绑定的情况:
[root@h63 ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009)
Bonding Mode: adaptive load balancing
Primary Slave: None
Currently Active Slave: em1
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: em1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 78:2b:cb:30:08:03
Slave queue ID: 0
Slave Interface: em2
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 78:2b:cb:30:08:05
Slave queue ID: 0
至此,网卡绑定就完成了。
修改三类文件:
/etc/sysconfig/network-scripts/下的ifcfg-*文件
/etc/modprobe.conf文件
/etc/init.d/rc.local文件
设置方法:
1. 环境:windows xp+vmware, centos 5.3, 4块网卡,做两组绑定。
当前网卡:eth0-3
绑定后虚拟网卡:bond0-1
eth0、eth2绑定为bond0,eth1、eth3绑定为bond1,不同网段。
2. 修改ifcfg-*文件
增加ifcfg-bond0、ifcfg-bond1两个文件:
文件内容:
[root@localhost network-scripts]# cat ifcfg-bond0
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=bond0
BOOTPROTO=none
IPADDR=192.168.100.101
NETMASK=255.255.255.0
NETWORK=192.168.100.0
ONBOOT=yes
USERCTL=no
TYPE=Ethernet
GATEWAY=192.168.100.101
[root@localhost network-scripts]# cat ifcfg-bond1
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=bond1
BOOTPROTO=none
IPADDR=172.16.0.1
NETMASK=255.255.255.0
NETWORK=172.16.0.0
ONBOOT=yes
USERCTL=no
#TYPE=Ethernet
TYPE=Ethernet
修改ifcfg-eth0、ifcfg-eth1、ifcfg-eth2、ifcfg-eth3四个网卡配置文件:
内容:
[root@localhost network-scripts]# cat ifcfg-eth0
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
MASTER=bond0
SLAVE=yes
TYPE=Ethernet
[root@localhost network-scripts]# cat ifcfg-eth1
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
MASTER=bond1
SLAVE=yes
TYPE=Ethernet
[root@localhost network-scripts]# cat ifcfg-eth2
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth2
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
MASTER=bond0
SLAVE=yes
TYPE=Ethernet
[root@localhost network-scripts]# cat ifcfg-eth3
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth3
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
MASTER=bond1
SLAVE=yes
TYPE=Ethernet
3. 修改/etc/modprobe.conf文件
[root@localhost network-scripts]# cat /etc/modprobe.conf
alias eth0 pcnet32
alias eth1 pcnet32
alias scsi_hostadapter mptbase
alias scsi_hostadapter1 mptspi
alias scsi_hostadapter2 ata_piix
alias eth2 pcnet32
alias eth3 pcnet32
alias bond0 bonding
options bond0 miimon=100 mode=0
alias bond1 bonding
options bond1 miimon=100 mode=0
4. 修改/etc/rc.d/rc.local文件
[root@localhost network-scripts]# cat /etc/rc.d/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
modprobe bonding miimon=100 mode=0
5. 测试
方法1:检查网络配置是否正常,是否可启动
/etc/init.d/network restart
方法2:检查系统启动时虚拟网卡是否正常启动
reboot
方法3:检查绑定网卡是负载均衡模式,还是主备冗余模式
cat /proc/net/bonding/bond0
cat /proc/net/bonding/bond1
6. 说明
如果是主备冗余模式,需将
options bond0 miimon=100 mode=0中
mode 改为1
其它改为
options bond0 miimon=100 mode=1 primary=eth0
primary=eth0表示当前主网卡为eth0
其它在/etc/rc.d/rc.local中也修改
modprobe bonding miimon=100 mode=1
Linux双网卡绑定——理论与实践(实践篇)
Linux双网卡绑定的主要实现步骤为:
1. 配置一个虚拟的网卡bond0
2. 配置eth0,eth1为slave模式
3. 加载bonding模块
4. 重启系统
下面将详细介绍每个步骤
一. 配置虚拟网卡bond0
新建/etc/sysconfig/network-scripts/ifcfg-bond0文件,内容如下:
#bond0配置文件
DEVICE=bond0
BOOTPROTO=static
IPADDR=192.168.0.100
NETMASK=255.255.255.0
BROADCAST=192.168.0.255
GATEWAY=192.168.0.1
ONBOOT=yes
TYPE=Ethernet
二. 配置eth0,eth1为slave模式
更改配置文件/etc/sysconfig/network-scripts/ifcfg-eth0
#eth0配置文件
DEVICE=eth0
BOOTPROTO=none
SLAVE=yes
MASTER=bond0
USERCTL=yes
更改配置文件/etc/sysconfig/network-scripts/ifcfg-eth1
#eth1配置文件
DEVICE=eth1
BOOTPROTO=none
SLAVE=yes
MASTER=bond0
USERCTL=yes
三. 加载bonding模块
修改模块配置文件/etc/modprobe.conf,在最后加入以下内容:
alias bond0 bonding
options bond0 miimon=100 mode=0
四. 重启系统
重启之后,测试bonding是否正常运行,运行ifconfig命令,结果如下
[root@linux ~]# ifconfig
bond0 Link encap:Ethernet HWaddr 00:0C:29:45:B4:D1
inet addr:192.168.0.100 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe45:b4d1/64 Scope:Link
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
RX packets:100 errors:0 dropped:0 overruns:0 frame:0
TX packets:130 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:17527 (17.1 KiB) TX bytes:20937 (20.4 KiB) eth0 Link encap:Ethernet HWaddr 00:0C:29:45:B4:D1
inet addr:192.168.0.100 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:65 errors:0 dropped:0 overruns:0 frame:0
TX packets:99 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:10340 (10.0 KiB) TX bytes:15317 (14.9 KiB)
Interrupt:18 Base address:0x1080 eth1 Link encap:Ethernet HWaddr 00:0C:29:45:B4:D1
inet addr:192.168.0.100 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:40 errors:0 dropped:0 overruns:0 frame:0
TX packets:40 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:7487 (7.3 KiB) TX bytes:7022 (6.8 KiB)
Interrupt:19 Base address:0x1400
运行cat /proc/net/bonding/bond0,结果如下:
[root@linux ~]# cat /proc/net/bonding/bond0 Ethernet Channel Bonding Driver: v3.3.0 (June 10, 2008)
Bonding Mode: load balancing (round-robin)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: eth0
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:0c:29:45:b4:d1 Slave Interface: eth1
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:0c:29:45:b4:db