[前言]
因.为很早前看过.关于bonding的文章,前几天又参与讨论,于是上网找了一下。这篇资料有些内容已经过时了,例如Red.hat7.3已经预先编译好了bonding,但总体上说还算比较完整,参考价值很高。健康
另外需要说明的是,Linux 2.4.18 的 bonding 有些问题,建议使用前把内核升级为. 2.4.20。刚好我手头也有 Inte.l 和 3C.om 的网卡,找一天工作比较不忙的时候动手配一下,做完再跟大家汇报结果。.
[实践]
bas.h-2.05a# uname -srm(广告)
Linux. 2.4.18-3 i686( 游戏 )
b.ash-2.05a# insm.od bonding 鲜花
Using /lib/.modules/2.4..18-3/kernel/drivers/net/bonding.o 外汇
W.arning: /lib/modules/2.4.18-3/kernel/drivers/n.et/bonding.o parameter max_bonds has max < mi.n!域名
bash-2.05a# uname -.srm.
Linux 2.4.20-28.7 i6.86.
bash-2.05a.# insmo.d bonding.
U.sin.g /lib/modules/2.4.20-28.7/kernel/drivers/net/bonding.o 杀毒
[网址]
http://oldsite.linuxaid.com.cn/solution/showsol.jsp?i=342 美容
Linux2.2.18环境下实现多网卡.Bond.ing , Written by ideal健康
[原文]
主.题:Linu.x2.2.18环境下实现多网卡Bonding虚拟主机
作者:ideal AT Li.nux aid.
注:
将多块网卡虚拟成为一块网卡,使其具有相同的IP地址,来实现提升主机的网络吞吐量或者是提高可用性,.这种技术被称作b.onding。这.项技术其实在sun和cisco中已经存在,分别称为Trunking和etherchannel技术,在L.inux中,这种技术称为bonding。 建材
bonding驱动最早来自于Donald Becker的beowulf对kernel.2.0的补丁。但是已经有了很大的改进和变化.,最早来自于extreme-linux和beowulf的工具已经.不适用于现在版本的驱动了。电影
对于新版本的驱动,请参考本文最.后的链结地址。教育
1、安装
1) 编译带有bonding driver.的内核 外汇
对于最新版本的bonding驱动,使用内核2.2.18或以.上版.本(否则需要对内核打补丁)。教育
使用make menuconfig/xconfig/config来编译内核,并在"Network device support"部分选择"Bonding driver s.uppo.rt",这里推荐配置该驱动为模块方式,因为目前这是传递给参数给驱动并配置多个bon.ding设备的唯一方.法。.
编译和安装新的内核和模块:
m.ake dep;make clean;mak.e bzImage;make modules;make modules_install; 电子
2) 获取并安装用户管理工具
这个版本的bonding驱..动需要新的if.enslave程序。来自extreme-linux和beowulf的原始工具程序不能在这里使.用。内核2.2.18及其以上版本在Documentation/network中包含文件ifenslave.c。对于更老的内核,请参考文章最后的资源链结部分的内容。 电子
安装ifenslave.c:
# gcc -O2 -s -o i.fensla.ve ifenslave.c 乙肝
#. cp ifenslave /sbin/ifens.lave.
3) 配置系统
参考下一部分关于模块参数的内.容。首.先需要在/etc/conf.modules中添加如下内容:.
alia.s bond0 bonding.
使用标准的发布技术来定义bond0这个网络接.口,例如在redhat发布中,在/etc/sy.sconfig/network-scripts目.录中添加ifcfg-bond0文件:投资
DEVICE=bond0
IPADDR=192..168.1.1.
NETMASK=255.255.25.5.0--------------彩票
NETW.ORK=192.168.1.0 电子
BROADCAST=.192.168.1.255 汽车
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
(使用适当的值来替代IP地址192.168..1) 外汇
所有属于bond的.接口动必须被定义为SLAVE或MASTER。例如,在Redhat中,如果希望定义eth0和eth1.定义为属于接口bond0的一部分,那么它们的配置文件(ifcfg-.eth0, ifcfg-eth1,等)间如下所示: 乙肝
DEVICE=eth0
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none
(对于eth1.使用DEVICE=eth1;如果定义bond2,那么使用MASTER=bond1).。 杀毒
如果管理工具支持可以重新启动网络子系统或者仅仅启动bonding设备,否则重新启动机器。(对于redhat发布,使用`ifup b.ond0'或`/etc/rc..d/init.d/network restart'.)虚拟主机
如果你的发布提供的管理工具不支持在网络接口配置中定义master/slave,则需要使用下面的命.令手工配置.bonding设备: 乙肝
# /sbin/ifconfig bond0 192.168..1..1 up电脑
# /s.bin/ifenslave. bond0 eth0 女人
# /sbin/.ifensla.ve bond0 eth1虚拟主机
(根据网络实际.情况定义IP地址等参数)服务器
当然也.可以将这些命令定义为一个脚本,以方便执行。投资
4) 模块参数
下面的模块参数可能被传递:
mode=
可能的值为0(默认的轮转模式ro.und robin policy),或者1(热备份模式),参考下面的HA.部分来得到更多的相关信息。<性病>
miimon=
整数值,定义MII链路监测频率(单位为频率)。默认值为0,表示关闭链路监测。如果希望使用链路监测,一个合适的值为100。.参考.HA部分得到更多信息。.
downdelay=
在发现链路故障时,这里规定的整数值定义disab.le一个链路的延迟(单位为毫秒)。必须是miimon.的整数倍。默认值为0。参考HA部分得到更多信息。 婚庆
updelay=
侦测到".link up"状态时,这里规定的整数值定义了enable一个链路的延.迟。必须是miimon的整数倍。默认值为0。参考HA部分得到更多信息。.
如果需要定义多个bonding设备,驱动必须被多次加载.。例如,对于有两个bonding设备的情况,/etc/con.f.modlues必须包含如下内容:.
alias. bond0 bonding 外汇
a.lias bond1 bonding
options bond0. miimon=100外贸
optio.ns bond1 -o bonding.1 miimon=100.
5) 测试配置
可以通过ifconfig命令来.监测配置和传输策略,.例如对于轮转策略,你应该得到如下信息: 美容
[root]# /s.bin/ifconfig电影
bond0 Link e.ncap:Ethernet HWaddr 00:C0:F0:1.F:37:B4 .
inet add.r:XXX.XXX..XXX.YYY Bcast:XXX.XXX.XXX.255 Mask:255.255.252.0.
UP BROADCAST RUNNING MAS.TER MULTICAST M.TU:1500 Metric:1电脑
RX packets:7.224794 errors.:0 dropped:0 overruns:0 frame:0外贸
TX packets:3286647 errors:1 dro.pped:.0 overruns:1 carrier:0 乙肝
collisions:0 txque.uelen:0 ..
eth0 Link encap:Etherne.t H.Waddr 00:C0:F0:1F:37:B4 婚庆
inet addr:XXX.X.XX.XXX.YYY Bcast:XXX.XXX.XXX.255 Mask:.255.255.252.0电脑
UP BROADCAS.T RUN.NING SLAVE MULTICAST MTU:1500 Metric:1学习
RX packets:3573025 erro.rs:0 dropped:0 overruns:0 fr.ame:0.
TX packets:164316.7 errors:.1 dropped:0 overruns:1 carrier:0(广告)
collisions:0 txqu.euelen:100. [成人用品]
Interr.upt:10 Base addres.s:0x1080 .
eth1 Lin.k encap:E.thernet HWaddr 00:C0:F0:1F:37:B4
inet addr:XXX.XXX.XXX.YYY .Bcast:XXX.XXX.XXX.255 Mask:255.255.252..0学习
UP. BROADCAST R.UNNING SLAVE MULTICAST MTU:1500 Metric:1学习
RX packets:36.51769 erro.rs:0 dropped:0 overruns:0 frame:0.
TX packets:1643480 err.ors:0 drop.ped:0 overruns:0 carrier:0.
collisi.o.ns:0 txqueuelen:100 .
Interr.upt:9 Base .address:0x1400 虚拟主机
问题:
1. bonding会不会和.SMP冲突?(广告)
不会,老的2.0.xx版.本配合SMP使用会发生冲突,而新的内核不会发生.问题。--------------彩票
2. 哪种类型的网卡可.以用作bonding?.
任何类型的网卡(甚至可以使用混合类型的网卡-一个Intel的therEx.press PRO/100和a.. 3com 3c905b),甚至可以将两个Gigabit以太网卡bond在一起使用。 外汇
3. 我可以拥有多少个bo.nding设备?健康
对应于.加载的一个模块,就可以拥有一个bonding设备,参考模块参数部分来.了解如何实现。学习
4. 一个bonding设备可以有多少个salv.e.网卡? 外汇
受限于linux可以支持的网卡.数量和系统可以插接的网.卡数量。 鲜花
5. 当一个slave链路出.现故障,.会发生什么问题?--- 印刷
如果你的以太网卡支持MII状态监控,并且MII监测已经在驱动中被使用(参考模块参数部分内容.),那么就不会出现什么.不幸的结果。这个版本的bo.nding驱动能得到MII信息并且根据链路状态来enable或者disable某个slav.e网卡。参考HA部分得到更多信息。<性病>
所有不能报告自己的链路状态的以太.驱.动不能很好地处理这种情况。bonding驱动不能连续发送数据报,而导致.某些数据报丢失。而重传可能会引起严重的性能问题(如果一块网卡丢失,那么可能会对TCP或UDP带来严重的性能影响)。域名
6. bonding能被用作.高可用性项目么? 乙肝
当然可以,如果使用了MII监测,并且你所有的网卡驱.动都支持MII链路状态汇.报。参考HA部分内容。外贸
7. .b.onding能适用于哪种类型的switches/systems?教育
在轮转模式,它和下面支持trun.kin.g的系统能一起工作:.
* Cisc.o 5500 series (参考Et.herChannel支持相关内容)。( 游戏 )
* SunTrunking softwar.e. 美容
* Alteon AceDir.ector switches. / WebOS (使用Trunks).
* BayStack Sw.itches (.trunks必须被配置). 可堆叠的模块(450)能在不同的物理单元的端口中定义(广告)
* Linux bond.ing. 健康
对于热备份模式下,它能和一切二层.交换机工作。 美容
8. 一个bondin.g设备的MAC来自于.哪个网卡?.
如果没有明显使用ifconfig来配置指定,bonding设备的MAC地址从它的第一个slave中得到。这个MA.C地址.随即被传递个所有其他的slave设备,这些其他的slave设备将具有这个MAC,即使.第一个Slave设备被去除。只有bonding设备重起或者down了,MAC地址才会改.变。.
如果希望修改MAC地.址,可以使用ifc.onfig来设置:投资
# ifconfig bond0 ha ether 00:11:22.:33:44.:55.
可..以通过up/down设备,然后修改其slave的顺序来改变bonding设备的MAC地址:电影
# ifconfig bond0 down ; modpr.obe. -r bonding健康
# .ifconfig bond0 .... up 汽车
# ife.nslave bond0 eth... 建材
这个方法将自动从下一个将被.添加的slave中得到地.址。.
为了恢复slave的MAC地址,需要将其从bonding设备中分离出来(`ifenslave -d bond0 eth0'),down掉该设备(`ifconfig eth0 down'),去除模块(`rmmod 3c59x'),然后重载其.以使其从其e.eproms中得到其MAC地.址。若一个驱.动被多个设备所拥有,那.么需要将其全部down掉。另外一种方法是察看启动时该卡的MAC地址(dmesg或 tail /var/log/mes.sages),并使用ifconfig来reset它:外贸
# if.config eth0 down[成人用品]
# ifco.nfig eth0 hw ether 00:20:40:60:8.0:A0.
9. 哪些使用哪些传输模式?
轮转模式:基于slav.e的顺序,依.次轮转通过不同网卡发送数据;--- 印刷
热备份模式:确.保.在同一时刻仅仅通过一个网卡发送数据,另外一个作为该激活卡的热备份,在.激活卡出现故障时数据流马上切换到热备份卡,这种模式常常用于使用交换机的高可用性中(high availability solutions )--------------彩票
高可用性
为了使用b.onding驱动实现高可用性,需要将该驱动编译为模块,因为目前这时传递参数给驱动的唯一方式。以后这种情况可能.会改变。首先需要确保所有的网卡支持MII链路状态报告。在Linux2.2.17及以上版本中,所有的百兆以太网和yellowfin千兆以太网都支持MII.链路状态.报告。如果你的网卡驱动不支持这种技术,那么会将链路状态监测为有故障。( 游戏 )
bonding驱动目前通过监测MII状态注册器来.侦测其所有的slave链路。侦测间隔有模块参数"miimon"来定义。该值为整数值,单位为milliseconds。100ms是一.个合适的.值,因为太小的值可能影响系统性能。也就是说链路发生故障以后在10.0ms秒以内将会被发现。.
例如:
# modpro.be bonding mi.imon=100电脑
或在/.etc/modules.conf.定义如下内容:.
alias bo.nd0 bonding 汽车
o.ptions bond0 miimon=100健康
目前对高可用性有两个策略,.依赖于主机是否
a.). 主机连接到单台主机或支持trunking的交换机 女人
b) 主机连接到多个不同的交换机上,或单个不支持trunkin.g的交换.机电影
1) 在单交.换机或主机上的HA-负载均衡电影
这种模式易.于配置和理解,只需要简单的配置远程设备.(主机或交换机)来将数据流量分散在多个端口(trunk, etherchannel等),并配置bonding接口。如果模块加载.时指定了MII参数,M.II将自动工.作。可以通过去除或恢复不同的链路,然后再log文件中察看驱动设备监测到了哪些信息。在监测时,你也许会遇到这样的问题:如果trunk连接的所有接口都down掉以后,有些具有bug的交换机会长时间地diable trunk。可以通过重新启动交.换机来修正这些问题。 女人
例1:主机和主机间实现倍速:
在每个主机中,运行:
# modprobe bond.ing miimon=100..
# .ifconfig bond0 addr虚拟主机
# ifensla.ve bon.d0 eth0 eth1 域名
例 2:主机连接交换机以实现倍速:. 投资
在主机A中运行:
#. modprobe .bonding miimon=100.
# ifconfig bo.nd0 addr <性病>
# ifenslave. bond0 .eth0 eth1 <性病>
在交换机中:
#对port1和port2设置tru.nking。 .
2). 在多个交换机或主机上.的HA-负载均衡(或不支持trunking技术的单交换机情况) .
这种.模式更可能会出现问题,因为它依赖于这样的事实:虽然有多个端口,但是主机MAC地址只能被一个端口可见以避免混淆交换.机。 服务器
如果需要知道哪个哪个端口是活动的,哪个是备份的,那就使用ifconfig.。所有的备份接口设置有NOAEP标志。为了使用该模式,在加载时传.递"mode=1"给模块: ..
# modprobe bondi.ng miimon=100 m.ode=1(广告)
或者在./.etc/modules.conf中添加如下内容: ( 游戏 )
alias bond0 .bonding<性病>
op.tions bond0 miimo.n=100 mode=1 鲜花
例1:使用多个主机..和多个交换机来创建"无单故障点瓶颈"解决方案: 乙肝
在这种配.置下,这里有一个ISL- 交换机间连接(Inter Switch .Link,可能是一个trunk),多个主机(host1, host2 ...)都同时连接到交换机,并且多个端口连接到外部网络.(port3...),每个主机中同时只有.一个slave是激活的,但是所有的链路仍然被监测(系统能监测到活动链路的故障并启动备份链路)。 电影
如果host1和host2具有同样的功能,并且被用在负载均衡中,那么将host1的活动接口连接到其中一个交换机而host2连接到另外一个交.换.机上是一个非常不错的选择。这种系统在单个主机、交换机或.者线路出问题时仍能保证工作。最糟糕可能情况是,单个交换机出现故障,其中一台主机将不可访问,直到另外一个交换机维护的转发表过期,另外一个主机才会转.换激活接口到正常的.交换机上。 .
例 2:使用多个以太网卡连接到一个交换机,以应付NIC故障的情况,以提高.可用性:. 电子
在主机A中:
# modpr.obe bondi.ng miimon=100 mode=1 建材
# .ifconfig bond0 addr 杀毒
#. ifenslave bond0 eth0 et.h1 外贸
在交换机中:
#. (可选地)最小化转发表过期时间 电子
每.次主机切换其活动接口,它将使用新的接口直到该接口出现故障。在这个例子中,主机.受交换机转发表的过期时间影响很大。 美容
3) 调整交换机的频率
如果交换机转换到备份接口需要花费太长的时.间,一般来说都希望在当前接口发生故障的情况下立即启用备用.接口。可以通过传递模块参数"do.wndelay"来实现减少完全disable一个接口的延迟。 健康
当一个交.换机重启以后,可能出现其端口在端口可用以前报告"link up"状态。这可能使得bonding设备使用还不可用的端口这可能通过传递模块参数"updelay"来延迟活动端口被重新可用的时.间。 ..
当.一个主机.和交换机重新交互以确定一个丢失的链路也会出现同样的问题。 乙肝
在bonding接口丢失了其所有的slave链路的情情况下,则驱动将马上使用第一个up的接口,而不受upd.elay参数的限制。这样可以减少系统down..的时间。 婚庆
例如:
# modprobe bonding miim.on=100 mode=1 downdela.y=2000 updelay=5000投资
# modprobe bonding miimon=100 mode=0 .downdelay=0 up.delay=5000 .
4) 限制
主要限制是:
只有链路状.态被监控,如果交换机本身down掉了,例如不再转发数据但是链路仍然完好。则链路不会被diable。另外一个监测故障链路的方式统计一个沉.重负载主机的接入数据.帧数量。但是对于哪些负载较小的服务器则不大适用。 ( 游戏 )
资源链结
Donald Becker的以太驱.动和dia.g程序可以在下面的到: (广告)
-
http://www.scyld.com/network/域名
-
http://cesdis.gsfc.nasa.gov/linux/drivers/ (seems to be dead now)电脑
-
ftp://cesdis.gsfc.nasa.goc/p.ub/linux/drivers/ (seems .to be dead now)虚拟主机
还可以在
www.scyld..com得到很多关于etherne.t、NWay和MII等信息。Y .
对于新版本的驱动,.牢的内核补丁和更新的用户空间工具.可以在Willy Tarreau的网站中得到: 电影
-
http://wtarreau.free.fr/pub/bonding/投资
-
http://www-miaif.lip6.fr/willy/pub/bonding/域名
为了得到最新的关于L.inux Kerne.l开发信息,请关注: .
http://boudicca.tux.org/hypermail/linux-kernel/latest/ ( 游戏 )
Linux2.4.x内核bondin.g的实现 乙肝
因为.bonding在内核.2.4.x中已经包含了,.只需要在编译的时候把网络设备选项中的Bonding driver support选中就可以了。然后,重新编译核心,重新起动计算机,执行如下命令: [成人用品]
insmod bonding
ifco.nfig eth0 down学习
ifconfig e.th1 down 杀毒
ifconfig bond0 ipadd.ress<性病>
ifenslav.e bond0 eth0 建材
ifen.slave bond0 eth1 婚庆
现在两块网卡已经象一块一样工作了.这样可以提高集.群节点间的数据传.输。你最好把这几句写成一个脚本,再由./etc/rc.d/rc.local调用,以便一开机就生效。 .
bonding对于服务器来是个比.较好的选择,在没有千兆网卡时,用两三块100兆网卡作bo.nding,可大大提高服务器到交换机之间的带宽.但是需要在交换机上设置连接bonding网卡的两个口子映射为同一个虚拟接口(t.runking技术)。 美容
下面是引.自邮件列表的一个信,希望能对出现问题.时有所帮助: .
>.; I have fo.und a solution to another problem with the bonding driver..
>;
>; If you ifconfig down an enslaved eth dev.ice, the bonding driver is n.ot
>; notified and if there is. an attempt to use the devic.e then a crash电影
>; results. I have added a. one line fix to dev_close in net/core/de.v.c 鲜花
>;
>; /* if the device is a slave we should not .touch it*./.
>; if(dev->;..flags&IFF_SLAVE)学习
>; return -EBU.SY;投资
>;
>; I put it after the ch.e.ck to see if the interface is up.健康
>;
>; Th.is may not be. the best solution but it prevents the kernel crashes and外贸
>; as .bond_release .is not implemented there is not much point making the投资
>; devic.e release it`s self..--------------彩票
>;
>; Since I made this change an.d the one. in my last message I have not been.
>; abl.e to produce .a crash..
>;
>; (here i.s a script wh.ich will cause the crash on 2.2.16)( 游戏 )
>; #!/bin/bash
>; ins.mod eepro100.
>; insmod bond.ing( 游戏 )
>.; ifconfig bond0 192.168.1.2 up.教育
>; ifenslave .bond0 eth0.
>; ifconfig eth0. down投资
>; .ifconfig bond0 down学习
>.; .ifconfig bond0 192.168.1.2 up健康
>.; ifconfig bond0 down.
>;
>.; Again, if someone could confirm this fix it would be .good. '.