一、引言现今几乎各行各业内部都建立了自己的服务器,由于服务器的特殊地位,它的可靠性、可用性及其 I/O 速度就显得非常的重要, 保持服务器的高可用性和安全性是企业级IT 环境的重要指标,其中最重要的一点是服务器网络连接的高可用性,
为实现这些要求,现在服务器大都采用多网卡配置,系统大都采用现在非常流行的 linux 作为服务器工作的环境。现在带宽已经不是服务质量提高的瓶颈了,相对的网络设备和服务器的处理能力就渐渐成为新的瓶颈。为提高服务器的网络连接的可用性和可靠性,目前Sun公司的Trunking技术、3Com 公司的 DynamicAccess 技术、Cisco 公司的Etherchannel技术等等都在研究将服务器的多个网卡接口绑定在一起的链路聚集技术,链路聚集技术将多个链路虚拟成一个逻辑链路进而提供了一种廉价、有效的方法扩展网络设备和服务器的带宽,提高网络的灵活性与可用性。
    本文介绍 linux 下的 bonding 技术,linux 2.4.x 的内核中采用了这种技术,利用 bonding 技术可以将多块网卡接口通过绑定虚拟成为一块网卡,在用户看来这个聚合起来的设备好像是一个单独的以太网接口设备,通俗点讲就是多块网卡具有相同的 IP 地址而并行连接聚合成一个逻辑链路工作。现在在关于linux bonding 技术中,有几种算法来实现负载均衡的要求,此文针对这些算法,在此进行简单分析与研究,讨论其不足,并提出另外一种在此基础上改进的一种基于传输协议的负载均衡实现方法。讨论如何实现多个网络接口的分在均衡及其故障接管。
    二、负载均衡技术和高可用技术介绍
    2.1 负载均衡技术负载均衡技术的主要思想就是如何根据某种算法将网络的业务流量平均分配到不同的服务器和网络设备上去,以减轻单台服务器和网络设备的负担,从而提高整个系统的效率。负载均衡既可以由有负载均衡功能的硬件实现,也可以通过一些专用的软件来实现,负载均衡是一种策略,它能让多台服务器或多条链路共同承担一些繁重的计算或者 I/O 任务,从而以较低的成本消除网络瓶颈,提高网络的灵活性和可靠性。
    2.2 高可用技术实现负载均衡首先是基于网络的高可用性提出来的,高可用技术是容错技术的一个分支。实现系统的高可用性最简单的一个办法就是冗余。完整的网络负载均衡和高可用性网络技术有两个方面构成,一是多服务器的绑定和负载均衡,二是一个服务器内部的多网卡绑定的负载均衡,这里主要讨论一个服务器内部的多网卡绑定时的负载均衡。
    三、Linux 的 bonding 技术中负载均衡的简单实现
    3.1  Linux的bonding技术Linux的bonding技术是网卡驱动程序之上、数据链路层之下实现的一个虚拟层,通过这种技术,服务器接在交换机上的多块网卡不仅被绑定为一个 IP,MAC 地址也被设定为同一个,进而构成一个虚拟的网卡,工作站向服务器请求数据,服务器上的网卡接到请求后,网卡根据某种算法智能决定由谁来处理数据的传输。 Bonding技术可以提高主机的网络吞吐量和可用性。
    3.2 Linux的几种发送均衡算法目前 Linux 的发送算法最主要的有三种:轮转算法(Round-Robin) 、备份算法(Active-Backup) 、MAC 地址异或算法(MAC-XOR) .下面对目前这三种主要算法进行简单分析。
    3.2.1 轮转算法该算法是基于公平原则进行的,它为每个将要被发送的数据包选择发送接口,算法的主要思想是首先第一个数据包由一个接口发送,另一个数据包则由另外一个接口发送,下面依次进行循环选择。通过分析我们可以看出这种算法比较比较简单,在发送数据方面也比较公平,能保证网卡发送数据时候的负载均衡,资源利用率很高。但是我们知道如果一个连接或者会话的数据包从不同的接口发出的话,中途再经过不同的链路,在客户端很有可能会出现数据包无序到达的问题,而无序到达的数据包需要重新要求被发送,这样网络的吞吐量就会下降。
    3.2.2  备份算法该算法将多个网卡接口中的一个接口设定为活动状态,其他的接口处于备用状态。当活动接口或者活动链路出现故障时,启动备用链路,由此可见此算法的优点是可以提供高网络连接的可用性,但是它的资源利用率较低,只有一个接口处于工作状态,在有 N 个网络接口的情况下,资源利用率为1/N.
   3.2.3 MAC地址异或算法该算法的主要思想是:由服务器的 MAC 地址和客户端的MAC 地址共同决定每个数据包的发送端口号,由源 MAC 地址和目的 MAC 地址进行异或计算,并将异或结果对接口数求余计算。由于发送到同一个客户端的数据流经过同一个链路,因此数据包能够有序到达客户端。此算法在只有一个客户机访问服务器或者服务器和客户机不在同一子网的情况下,由算法思想得知这种情况下负载不会均衡,在只有一个客户机访问服务器的时候,资源的利用率也是 1/N(N为接口数)。
首先是你要内核支持,如果不支持,请你自己重新编译,在编译的时候把网络设备选项中的Bonding driver support选中就可以了。
简介
=============================
  Linux bonding驱动提供了一种方法,用以把多个网络接口(network interface)组合成一个逻辑的"bonded"接口。Bonded接口的工作方式取决于驱动的模式:不同的模式提供了热备份或负载均衡等不同的服务。此外,驱动还会监控链路的可用性。
  Bonding驱动最早来自Donald Becker针对Linux 2.0内核的beowulf补丁。现在已经有了很多的变化,最早的来自beowulf网站的工具已经不能和现在的驱动一起使用。
  如果你希望得到最新的版本,或者最新的用户工具,或者寻求相关的帮助,请留意本文末尾的链接。
目录
============================
1. Bonding驱动简介
2. Bonding驱动选项
3. 配置Bonding驱动
3.1 通过Sysconfig配置Bonding
3.1.1  通过Sysconfig使用DHCP
3.1.2  通过Sysconfig配置多个Bond
3.2 通过Initscripts配置Bonding
3.2.1  通过Initscripts使用DHCP
3.2.2  通过Initscripts配置多个Bond
3.3 通过Ifenslave手工配置Bonding
3.3.1  手工配置多个Bond
3.4 通过Sysfs手工配置Bonding
4. 查询Bonding配置
4.1 Bonding配置
4.2 网络配置
5. Switch(交换机)配置
6. 802.1q VLAN
7.链路监控
7.1 ARP监控
7.2 配置多个ARP监控目标
7.3 MII监控
8. 可能的问题
8.1 Routing(路由)
8.2 Ethernet设备重命名
8.3 网速变慢或Mii监控无法发现出错的链接
9. SNMP代理
10. Promiscuous(混杂)模式
11. 配置Bonding用于高可靠性
11.1 单一Switch下的高可靠性
11.2 多Switch下的高可靠性
11.2.1  多Switch下的Bonding模式选择
11.2.1  多Switch下的链路监控
12. 配置Bonding用于大吞吐量
12.1 单一Switch下的大吞吐量网络配置
12.1.1  单一Switch下的Bonding模式选择
12.1.2  单一Switch下的链路监控
12.2 多Switch下的大吞吐量网络配置
12.2.1  多Switch下的Bonding模式选择
12.2.1  多Switch下的链路监控
13. Switch的问题
13.1 链路建立和Failover延时
13.2 Incoming包重复
14. 硬件相关
14.1 IBM刀片服务器
15. FAQ
16. 相关资源和链接

1. Bonding驱动简介
=================================
  大多数目前发布的Linux内核都以模块(module)方式带了bonding驱动,ifenslave工具也都已经安装好。如果你的Linux没有,或者你确实需要自己来编译bonding(比如要配置或安装自己的Linux内核),请参考如下步骤:
1.1 配置并编译支持bonding的内核
---------------------------------
  当前版本的bonding驱动位于Linux内核源码(从http://kernel.org下载)的drivers/net/bonding子目录中。你可以在kerenl.org下载到最新版本的内核源码。
  通过"make menuconfig"(或"make xconfig" "make config")配置内核,在“Network device support”下选择“Bonding driver support”。建议你将bonding驱动配置为模块(module)方式,因为如果你要给驱动传递参数或者希望配置多个bonding驱动,只有通过模块方式。
  编译并安装新的内核和编译出的模块,然后参照下面的步骤安装ifenslave。
1.2 安装ifenslave控制工具
--------------------------------
  ifenslave控制工具也在内核源码中:Documentation/networking/ifenslave.c。一般建议最好使用和内核匹配的 ifenslave(同一份源码中或同一个发布中),然而较老的内核中的ifenslave也应该能够正常工作(较新的一些功能将不能使用),不过更新的内核中的ifenslave将可能不能工作。
  参照如下步骤以安装ifenslave:
# gcc -Wall -O -I/usr/src/linux/include ifenslave.c -o ifenslave
# cp ifenslave /sbin/ifenslave
  如果你的内核源码不在“/usr/src/linux”下,请将上面的“/usr/src/linux/include”替换成相应的正确目录。
  如果希望备份现有的/sbin/ifenslave,或者只是试用一下,你可以把ifenslave文件名加上内核版本信息(比如,/sbin/ifenslave-2.6.10)
重要提示:
  如果你忽略了"-I"参数或者指定了一个不正确的目录,你可能会得到一个和内核不兼容的ifenslave。有些发布(比如Red Hat 7.1之前的版本)没有/usr/include/linux符号链接指向当前内核的include目录。
另一个重要提示:
  如果你打算使用sysfs来配置bonding,你不需要使用ifenslave。
2. Bonding驱动选项
=================================
  Bonding驱动的选项是通过在加载时指定参数来设定的。可以通过insmod或modprobe命令的命令行参数来指定,但通常在/etc /modules.conf或/etc/modprobe.conf配置文件中指定,或其他的配置文件中(下一节将会提及几个具体的细节)
  下面列出可用的bonding驱动参数。如果参数没有指定,驱动会使用缺省参数。刚开始配置bond的时候,建议在一个终端窗口中运行"tail -f /var/log/messages"来观察bonding驱动的错误信息【译注:/var/log/messages一般会打印内核中的调试信息】。
  有些参数必须要正确的设定,比如miimon、arp_interval和arp_ip_target,否则在链接故障时会导致严重的网络性能退化。很少的设备不支持miimon,因此没有任何理由不使用它们。
  有些选项不仅支持文本值的设定,出于兼容性的考虑,也支持数值的设定,比如,"mode=802.3ad"和"mode=4"效果是一样的。
  具体的参数列表:
arp_interval
  指定ARP链路监控频率,单位是毫秒(ms)。如果APR监控工作于以太兼容模式(模式0和模式2)下,需要把switch(交换机)配置为在所有链路上均匀的分发网络包。如果switch(交换机)被配置为以XOR方式分发网络包,所有来自ARP目标的应答将会被同一个链路上的其他设备收到,这将会导致其他设备的失败。ARP监控不应该和miimon同时使用。设定为0将禁止ARP监控。缺省值为0。
arp_ip_target
  指定一组IP地址用于ARP监控的目标,它只在arp_interval > 0时有效。这些IP地址是ARP请求发送的目标,用于判定到目标地址的链路是否工作正常。该设定值为ddd.ddd.ddd.ddd格式。多个IP地址通过逗号分隔。至少指定一个IP地址。最多可以指定16个IP地址。缺省值是没有IP地址。
downdelay
  指定一个时间,用于在发现链路故障后,等待一段时间然后禁止一个slave,单位是毫秒(ms)。该选项只对miimon监控有效。downdelay值应该是miimon值的整数倍,否则它将会被取整到最接近的整数倍。缺省值为0。
lacp_rate
  指定在802.3ad模式下,我们希望的链接对端传输LACPDU包的速率。可能的选项:
  slow 或者 0
    请求对端每30s传输LACPDU
  fast 或者 1
    请求对端每1s传输LACPDU
  缺省值是slow
max_bonds
  为bonding驱动指定创建bonding设备的数量。比如,如果max_bonds为3,而且bonding驱动还没有加载,那么bond0,bond1,bond2将会被创建。缺省值为1。
miimon
  指定MII链路监控频率,单位是毫秒(ms)。这将决定驱动检查每个slave链路状态频率。0表示禁止MII链路监控。100可以作为一个很好的初始参考值。下面的use_carrier选项将会影响如果检测链路状态。更多的信息可以参考“高可靠性”章节。缺省值为0。
mode
  指定bonding的策略。缺省是balance-rr (round robin,循环赛)。可选的mode包括:
  balance-rr 或者 0
    Round-robin(循环赛)策略:按顺序传输数据包,从第一个可用的slave到最后一个可用的slave。该模式提供了负载均衡和容错机制。
  active-backup 或者 1
    Active-backup(激活-备份)策略:只有一个slave是激活的(active)。其他的slave只有在当前激活的slave故障后才会变为激活的(active)。从外面看来,bond的MAC地址是唯一的,以避免switch(交换机)发生混乱。
    在bonding 2.6.2和以后的版本中,如果在active-backup模式下出现failover【译注:指一个slave发生故障,另一个slave变为激活的设备】,bonding将会在新的slave上发出一个或多个ARP请求,其中一个ARP请求针对bonding master接口及它上面配置的每个VLAN接口,从而保证该接口至少配置了一个IP地址。针对VLAN接口的ARP请求将会被打上相应的VLAN id。
----------------------------------------------------------------------------------------
        In bonding version 2.6.2 or later, when a failover
        occurs in active-backup mode, bonding will issue one
        or more gratuitous ARPs on the newly active slave.
        One gratuitous ARP is issued for the bonding master
        interface and each VLAN interfaces configured above
        it, provided that the interface has at least one IP
        address configured.  Gratuitous ARPs issued for VLAN
        interfaces are tagged with the appropriate VLAN id.
----------------------------------------------------------------------------------------
    该模式提供了容错机制。下面的primary选项将会影响该工作模式的行为。
  balance-xor 或者 2
    XOR策略:基于指定的传输HASH策略传输数据包。缺省的策略是:(源MAC地址 XOR 目标MAC地址) % slave数量。其他的传输策略可以通过xmit_hash_policy选项指定,下文将会对之介绍。
    该模式提供了负载均衡和容错机制。
  broadcast 或者 3
    Broadcase(广播)策略:在每个slave接口上传输每个数据包。该模式提供了容错机制。
  802.3ad 或者 4
    IEEE 802.3ad Dynamic link aggregation(动态链接聚合)。创建一个聚合组,它们共享同样的速率和双工设定。根据802.3ad规范将多个slave工作在同一个激活的聚合体下。
    外出流量的slave选举是基于传输hash策略,该策略可以通过xmit_hash_policy选项从缺省的XOR策略改变到其他策略。需要注意的是,并不是所有的传输策略都是802.3ad适应的,尤其考虑到在802.3ad标准43.2.4章节提及的包乱序问题。不同的实现可能会有不同的适应性。
    必要条件:
    1. ethtool支持获取每个slave的速率和双工设定;
    2. switch(交换机)支持IEEE 802.3ad Dynamic link aggregation。
    大多数switch(交换机)需要经过特定配置才能支持802.3ad模式。
  balance-tlb 或者 5
    自适应的传输负载均衡:不需要任何特别的switch(交换机)支持的通道bonding。在每个slave上根据当前的负载(根据速度计算)分配外出流量。如果正在接受数据的slave出故障了,另一个slave接管失败的slave的MAC地址。
    必要条件:
    ethtool支持获取每个slave的速率。
  balance-alb 或者 6
    自适应均衡负载:该模式包含了balance-tlb模式,同时加上针对IPV4流量的接收负载均衡(receive load balance, rlb),而且不需要任何switch(交换机)的支持。接收负载均衡是通过ARP协商实现的。bonding驱动截获本机发送的ARP应答,并把源硬件地址改写为bond中某个slave的唯一硬件地址,从而使得不同的对端使用不同的硬件地址进行通信。
    来自服务器端的接收流量也会被均衡。当本机发送ARP请求时,bonding驱动把对端的IP信息从ARP包中复制并保存下来。当ARP应答从对端到达时,bonding驱动把它的硬件地址提取出来,并发起一个ARP应答给bond中的某个slave。使用ARP协商进行负载均衡的一个问题是:每次广播 ARP请求时都会使用bond的硬件地址,因此对端学习到这个硬件地址后,接收流量将会全部刘翔当前的slave。这个问题通过给所有的对端发送更新(ARP应答)来解决,应答中包含他们独一无二的硬件地址,从而导致流量重新分布。当新的slave加入到bond中时,或者某个未激活的slave重新激活时,接收流量也要重新分布。接收的负载被顺序地分布(round robin)在bond中最高速的slave上。
    当某个链路被重新接上,或者一个新的slave加入到bond中,接收流量在所有当前激活的slave中全部重新分配,通过使用指定的MAC地址给每个 client发起ARP应答。下面介绍的updelay参数必须被设置为某个大于等于switch(交换机)转发延时的值,从而保证发往对端的ARP应答不会被switch(交换机)阻截。
    必要条件:
    1. ethtool支持获取每个slave的速率;
    2. 底层驱动支持设置某个设备的硬件地址,从而使得总是有个slave(curr_active_slave)使用bond的硬件地址,同时保证每个bond 中的slave都有一个唯一的硬件地址。如果curr_active_slave出故障,它的硬件地址将会被新选出来的 curr_active_slave接管。
primary
  指定哪个slave成为主设备(primary device),取值为字符串,如eth0,eth1等。只要指定的设备可用,它将一直是激活的slave。只有在主设备(primary device)断线时才会切换设备。这在希望某个slave设备优先使用的情形下很有用,比如,某个slave设备有更高的吞吐率。
  primary选项只对active-backup模式有效。
updelay
  指定当发现一个链路恢复时,在激活该链路之前的等待时间,以毫秒计算。该选项只对miimon链路侦听有效。updelay应该是miimon值的整数倍,如果不是,它将会被向下取整到最近的整数。缺省值为0。
use_carrier
  指定miimon是否需要使用MII或者ETHTOOL ioctls还是netif_carrier_ok()来判定链路状态。MII或ETHTOOL ioctls更低效一些,而且使用了内核里废弃的旧调用序列;而netif_carrier_ok()依赖于设备驱动来维护状态(判断载波),在本文写作时,大多数但不是全部设备驱动支持这个特性。
  如果bonding总是认为链路是通的,但实际上是断的,这有可能是由于你的网络设备驱动不支持netif_carrier_on/off。因为 netif_carrier的缺省状态是"carrier on",因此如果驱动不支持netif_carrier,则会显示链路永远正常。在这种情况下,把use_carrier设为0,从而让bonding使用MII/ETHTOOL ictl来判定链路状态。
  该选项设为1会使用netif_carrier_ok(),而设为0则会使用废弃的MII/ETHTOOL ioctls,缺省值是1。
xmit_hash_policy
  在balance-xor和802.3ad模式下选择不同的hash模式,以用于slave选举。可能的取值有:
  layer2
    使用硬件MAC地址的XOR来生成hash。公式为:
    (源MAC地址 XOR 目的MAC地址)% slave数目
    该算法会将某个网络对(network peer)上所有的流量全部分配到同一个slave上。
  layer3+4
    该策略在可能的时候使用上层协议的信息来生成hash。这将允许特定网络对(network peer)的流量分摊到多个slave上,尽管同一个连接(connection)不会分摊到多个slave上。
    针对未分片的TCP和UDP包的计算公式为:
    ((源端口 XOR 目的端口) XOR ((源IP XOR 目的IP) AND 0xFFFF) % slave数目
    对于已分片TCP或UDP包,以及其他的IP包,源端口和目的端口的信息被忽略了;对于非IP流量,采用和layer2一样的hash策略。
    该策略期望模仿某些交换机的行为,比如带PFC2的Cisco交换机,以及某些Foundry和IBM的产品。
    该算法不完全适应802.3ad,一个单一的TCP或UDP会话同时包含有分片和未分片的包将会导致包在两个接口上传递,这将会导致投递乱序。大多数流量不会满足这种条件,正如TCP很少分片,而大多数UDP流量不会在长期的会话中存在。其他的802.3ad实现有可能不能容忍这样的不适应性。
  缺省设置是layer2。该选项在bonding 2.6.3加入,在早期版本中,该参数不存在,只只是layer2策略。

3. 配置Bonding设备
=================================
  你可以使用发行包里的网络初始化脚本配置bonding,或者手动通过ifenslave或sysfs配置。发行包通常包含一到两个包来支持网络初始化脚本:initscripts或sysconfig。最近的版本已经支持bonding,而稍早的版本不支持。
  我们将会首先描述使用通过发行包配置bonding的选项,这将通过initscripts和sysconfig的bonding支持来实现,然后,我们会介绍如果在没有网络初始化脚本的情况下(较老版本的initscript或sysconfig)如何使用bonding功能。
  如果你不确定是否你的发行包包含sysconfig或者initscripts,或不确定它们是否足够新,很简单,可以用下面的方法来知道。
  首先,执行命令:
$ rpm -qf /sbin/ifup
  它将会返回一行文本,以"initscripts"或"sysconfig,"开头,后面跟着一串数字。这就是提供网络初始化脚本的包。
  下一步,为了确定你的安装是否支持bonding,执行命令:
$ grep ifenslave /sbin/ifup
  如果返回任何匹配记录,则表示你的initscripts或sysconfig支持bonding。
3.1 使用Sysconfig配置
---------------------------------
  本节只适用于那些发行包里使用sysconfig的用户,而且syconfig要能够支持bonding,比如,SuSE Linux Enterprise Server 9。
  SuSE SLES 9的网络配置系统支持bonding,但是,在写作时,YaST系统配置前端并没有提供任何方法来配置bonding设备,你可以手动的配置bonding设备,如下:
  首先,如果这些设备还没有配置,先把它们配置正确。在SLES 9上,通过运行yast2 sysconfig配置工具你可以很容易地做到。目标是为每一个slave设备创建一个ifcfg-id文件,达到该目标最简单的方法是把设备配置为 DHCP(这只会创建出ifcfg-id文件,下文会提到DHCP的一些问题)。每个设备的配置文件名应该是如下的格式:
ifcfg-id-xx:xx:xx:xx:xx:xx
  这里"xx"部份会使用设备的物理MAC地址里的数字替换掉。
  一旦这组ifcfg-id-xx:xx:xx:xx:xx:xx文件创建成功,现在就可以为slave设备编辑配置文件(通过MAC地址找到对应的slave设备)。在编辑之前,文件里应该已经存在一些内容,看起来如下:
BOOTPROTO='dhcp'
STARTMODE='on'
USERCTL='no'
UNIQUE='XNzu.WeZGOGF+4wE'
_nm_name='bus-pci-0001:61:01.0'
  改变BOOTPROTO和STARTMODE:
BOOTPROTO='none'
STARTMODE='off'
  不要改变UNIQUE和_nm_name的值,把其他行移除掉(USERCTL等)。
  一旦ifcfg-id-xx:xx:xx:xx:xx:xx文件被修改,现在就可以为bonding设备本身创建配置文件了。该文件被命名为ifcfg- bondX,这里X表示创建的bonding设备数量,从0开始。这一个这样的文件名是ifcfg-bond0,第二个是ifcfg-bond1,依此类推。sysconfig网络配置系统会根据该配置正确地启动多个bonding实例。
  ifcfg-bondX文件的内容看起来如下:
BOOTPROTO="static"
BROADCAST="10.0.2.255"
IPADDR="10.0.2.10"
NETMASK="255.255.0.0"
NETWORK="10.0.2.0"
REMOTE_IPADDR=""
STARTMODE="onboot"
BONDING_MASTER="yes"
BONDING_MODULE_OPTS="mode=active-backup miimon=100"
BONDING_SLAVE0="eth0"
BONDING_SLAVE1="bus-pci-0000:06:08.1"
  请根据你网络的正确配置替换该示例里的BROADCAST,IPADDR,NETMASK和NETWORK值。
  STARTMODE参数指定何时设备进入在线状态。可能的取值包括:
  onboot: 设备在开机时启动。如果你不确定它的取值,这可能是你期望的取值。
  manual: 设备只在ifup被手动调用时启动。bonding设备可能会被配置为该模式,如果因为某些原因你不希望他们在开机时启动。
  off or ignore: 设备的配置被忽略。
  BONDING_MASTER='yes'这一行表示该设备时一个bonding主设备。唯一有效的取值为"yes"。
  BONDING_MODULE_OPTS的内容由该设备的bonding模块的实例提供。在这里可以指定bonding模式、链路侦听等等的选项。不要包含max_bonds这个bonding参数,如果你有多个bonding设备,该参数将会使配置系统混乱。
  最后,为每个slave提供一个参数BONDING_SLAVEn="slave device",这里"n"是一个递增的值,每个slave有一个值。"slave device"可以是一个接口名,比如"eth0",或者一个网络设备的设备标志,接口名可能更容易找到,但是"ethN"可能在启动的时候有改动,比如在其中一个设备加载失败时;而设备标志(上例中的bus-pci-0000:06:08.1)指定一个物理的网络设备,除非该设备的总线位置改动(比如从一个PCI插槽移到另一个),否则该标志永远不会改变。上面的例子里出于演示目的各使用一种类型,实际的配置只会选择其中对所有slave某种进行配置。
  当所有配置文件都已经正确地修改或创建后,必须要重启网络来使配置生效。这可以通过执行下面的命令:
# /etc/init.d/network restart
  需要注意的是,网络控制脚本(/sbin/ifdown)将会在断开网络的过程中同时移除bonding模块,因此在模块的参数变化时不需要手工移除。
  另外,在写作时,YaST/YaST2不会管理bonding设备(它们不会把bonding接口显示在它们的网络设备列表里),因此需要手工修改配置文件来改变bonding的配置。
  关于ifcfg文件格式更多的选项和细节可以在ifcfg模版文件示例里找到:
/etc/sysconfig/network/ifcfg.template
  注意这个模版文件里没有把上文提到的不同的BONDING_设置描述清楚,但描述了很多其他的选项。
3.1.1 利用Sysconfig使用DHCP
---------------------------------
  在sysconfig下,把一个设备配置为BOOTPROTO='dhcp'将会导致该设备查询DHCP来获取它的IP地址信息。在写作时,这个功能对于 bonding设备是无效的,脚本会优先尝试从DHCP上获取该设备地址,然后再把slave设备加入,而没有可用的slave设备,DHCP请求也就不能发送到网络上。
3.1.2 利用Sysconfig配置多个Bonds
---------------------------------
  sysconfig网络初始化系统可以处理多个bonding设备。你需要做的只是为每个bonding实例配置正确的ifcfg-bondX配置文件(如上文描述)。不要对任何bonding实例指定"max_bonds"参数,否则将会使sysconfig混淆。如果你需要多个bonding设备有不同的参数,那么你可以创建多个ifcfg-bondX文件。
  因为sysconfig脚本在ifcfg-bondX文件中提供了bonding模块的选项,因此不需要再把它们增加到系统的/etc/modules.conf或者/etc/modprobe.conf配置文件。
3.2 使用Initscripts配置
---------------------------------
  本节针对使用支持bonding的initscripts的发行包,比如Red Hat Linux 9或Red Hat Enterprise Linux version 3或4。在这些系统上,网络初始化脚本拥有bonding的知识,可以配置来控制bonding设备。
  这些发行包不会自动加载网络适配驱动除非ethX驱动配置了IP地址。因为这个限制,用户需要手工为每一个物理的适配器配置网络脚本,如果你希望把它加入bondX链接。网络脚本文件位于如下的目录:
/etc/sysconfig/network-scripts
  文件名必须以"ifcfg-eth"开头,以适配器的物理适配号结尾。比如,针对eth0的脚本名为/etc/sysconfig/network-scripts/ifcfg-eth0,在文件中输入以下文本:
DEVICE=eth0
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none
  "DEVICE="这一行对每个ethX设备会不一样,而且必须和文件名相对应,比如,ifcfg-eth1必须有一行"DEVICE=eth1"。"MASTER="这一行也依赖于你用于bonding的接口名,和其他的网络设备一样,它们一般也从0开始,每个设备加 1,第一个bonding实例是bond0,第二个是bond1,依此类推。
  下一步,创建一个bond网络脚本,脚本文件名应该是/etc/sysconfig/network-scripts/ifcfg-bondX,这里X表示bond的数值。对于bond0文件名是"ifcfg-bond0",对于bond1文件名是"ifcfg-bond1",依此类推。在文件中输入以下内容:
DEVICE=bond0
IPADDR=192.168.1.1
NETMASK=255.255.255.0
NETWORK=192.168.1.0
BROADCAST=192.168.1.255
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
  确保把网络相关行的配置修改掉(IPADDR,NETMASK,NETWORK以及BROADCAST)以满足你的网络配置情况。
  最后,需要编辑/etc/modules.conf(或者是/etc/modprobe.conf,依你的发行包而定),用以在bond0接口启动时以你指定的配置加载bonding模块。在/etc/modules.conf(或者modprobe.conf)输入下面的行将会加载bonding模块,并且选择它的选项:
alias bond0 bonding
options bond0 mode=balance-alb miimon=100
  把示例里的参数替换为对应于你的配置的正确的选项即可。
  最后,以root权限运行"/etc/rc.d/init.d/network restart",这将会重启网络子系统,然后你的bond链接就会被启动并运行。
3.2.1 利用Initscripts使用DHCP
---------------------------------
  最近版本的initscripts(在Fedora Core 3和Red Hat Enterprise Linux 4中的可以工作)可以支持通过DHCP给bonding设备获取IP信息。
  为了配置使用DHCP,需要把bonding照上文描述的那样配置,除了把"BOOTPROTO=none"这一行替换为"BOOTPROTO=dhcp",并且加上一行"TYPE=Bonding",需要注意TYPE的值是大小写敏感的。
3.2.2 利用Initscripts配置多个Bonds
---------------------------------
  本文写作时,initscripts包不直接支持多次加载bonding驱动,因此这里的过程与"手动配置多个Bonds"一节中的描述是一样的。
  注意:某些Red Hat提供的内核不能在加载时对模块进行重命名(通过"-o bond1"部分),尝试传递到 modprobe 该选项将生成一个"Operation not permitted"错误。这已报告在某些Fedora Core内核中,也曾出现在RHEL 4上。在内核出现该问题时,表示我们无法通过不同的参数配置多个bonds。
3.3 通过Ifenslave手动配置Bonding
---------------------------------
  本节适用于某些发行包,它们的网络初始化脚本(sysconfig或initscripts包)没有bonding相关的知识。SuSE Linux Enterprise Server 版本8就是这样的一个发行包。
  对于这些系统一般的方法是,把bonding模块的参数放进/etc/modules.conf或者/etc/modprobe.conf(针对不同的安装发行包),然后在系统的全局初始化脚本里增加modprobe和/或ifenslave命令。对于sysconfig,全局初始化脚本是/etc /init.d/boot.local,而对于initscripts,它是/etc/rc.d/rc.local。
  比如,如果你想要实现一个简单的带两个e100设备(比如eth0和eth1)的bond,而且希望它在重启后还能存在,那么编辑对应的文件(/etc/init.d/boot.local或/etc/rc.d/rc.local),在里面加上:
modprobe bonding mode=balance-alb miimon=100
modprobe e100
ifconfig bond0 192.168.1.1 netmask 255.255.255.0 up
ifenslave bond0 eth0
ifenslave bond0 eth1
  把示例里bonding模块参数以及bond0的网络配置(IP地址,掩码等)修改为你系统的正确配置。
  不幸的是,这个方法不体动对bond设备上的ifup和ifdown脚本支持,为了重新加载bonding配置,你必须运行初始化脚本,比如:
# /etc/init.d/boot.local
  或者
# /etc/rc.d/rc.local
  针对这种情况,理想的做法是,创建一个独立的脚本用于初始化bonding配置,然后在boot.local中调用这个独立的脚本,这样就可以不重启整个全局初始化脚本就打开bonding。
  为了关闭bonding设备,你首先需要把bonding设备标记为正在关闭,然后移除对应的设备驱动模块。针对我们上面的例子,你可以这样关闭:
# ifconfig bond0 down
# rmmod bonding
# rmmod e100
  同样的,方便起见,最好把这些命令创建在一个独立的脚本里。
3.3.1 手动配置多个Bonds
---------------------------------
  本节针对那些网络初始化脚本缺少对多bonds配置支持的系统,这里介绍了通过不同的选项配置多bonding设备的方法。
  如果你需要配置多bonding设备,但所有设备使用同样的选项,你可能希望使用"max_bonds"模块参数,就像上文描述的一样。
  为了创建多个不同选项的bonding设备,需要多次加载bonding驱动。要说明的是,当前版本的sysconfig网络初始化脚本自动处理这些,如果你的发行包这些脚本,你不需要额外的操作,参看上文的"配置Bonding驱动",如果你不确定你的网络初始化脚本是否支持。
  为了加载模块的多个实例,需要为每个实例指定一个不同的名字(模块加载系统需要每个加载的模块有唯一的名字,即便它们是同一个模块的不同实例)。这可以通过在/etc/modprobe.conf中指定多个bonding选项,比如:
alias bond0 bonding
options bond0 -o bond0 mode=balance-rr miimon=100
alias bond1 bonding
options bond1 -o bond1 mode=balance-alb miimon=50
  这将会两次加载bonding模块。第一个实例命名为"bond0",将会以balance-rr模式创建bond0设备,同时使用参数miimon为 100。第二个实例命名为"bond1",将会以balance-alb模式创建bond1设备,同时使用参数miimon为50。
  在某些情况下(通常是较老的发行包),上述参数不能工作,第二个bonding实例不会用到它的选项。在这种情况下,第二个选项可以用如下的选项替换:
install bond1 /sbin/modprobe --ignore-install bonding -o bond1 \
    mode=balance-alb miimon=50
  这些选项可以重复任意次,以指定任意多个bonding实例,只需要为每个依次的实例指定一个唯一的名字,以替换bond1即可。
3.4 通过Sysfs手工配置Bonding
---------------------------------
  从版本3.0开始,Channel Bonding可以通过sysfs接口进行配置。sysfs接口允许在不卸载模块的情况下动态配置所有bonds,它也可以在运行时增加和移处bonds。Ifenslave已经不再需要了,尽管它还被支持。
  使用sysfs接口允许你在不重新加载模块的情况下,对多个bonds使用不同的配置;也允许你使用多个不同配置的bonds,在bonding被编译进内核的时候。
  你必须mount了sysfs文件系统,以配置bonding。本文里的示例假定你标准的sysfs的mount点,即/sys,如果你的sysfs文件系统被mount在其他地方,你需要对应地调整示例里的路径。
创建和销毁Bonds
---------------------------------
增加一个新的bond(foo):
# echo +foo > /sys/class/net/bonding_masters
移除一个已存在的bond(bar):
# echo -bar > /sys/class/net/bonding_masters
显示所有存在的bonds:
# cat /sys/class/net/bonding_masters
注意:由于sysfs文件的4K大小限制,如果你好多bonds,这个列表可能被截断。这在通常的情况下并不常见。
增加和移除Slaves
---------------------------------
  通过使用文件/sys/class/net/<bond>/bonding/slaves,我们可以把网络接口从属于某个bond,这个文件的语义和bonding_masters文件是完全相同的。
把eth0加入bond(bond0):
# ifconfig bond0 up
# echo +eth0 > /sys/class/net/bond0/bonding/slaves
从bond(bond0)里移除eth0:
# echo -eth0 > /sys/class/net/bond0/bonding/slaves
  注意:bond必须在slave加入之前启动,所有slave必须在bond接口断开前移除。
  当一个网络接口加入某个bond,sysfs文件系统里会在两者间创建符号链接,在这时,你可以看到/sys/class/net/bond0 /slave_eth0指向/sys/class/net/eth0,而/sys/class/net/eth0/master指向/sys/class /net/bond0。
  这意味着你可以通过查看master的符号链接很快地知道一个接口有没有被加入。这样的话:
# echo -eth0 > /sys/class/net/eth0/master/bonding/slaves
将会把eth0正确地从它所从属的bond上移除,而不需要指定bond接口的名字。
改变Bond的配置
---------------------------------
  每个bond可以独立地配置,通过操纵位于/sys/class/net/<bond name>/bonding下的文件。
  这些文件的名字直接对应于本文里描述的命令行参数,除了arp_ip_target是个例外,它们总是接受同样的值。你可以直接把对应文件cat出来看当前的设置。
  这里会给出一些例子,对于每个参数特定的使用指南,请参考本文里对应的章节。
把bond0配置为balance-alb模式:
# ifconfig bond0 down
# echo 6 > /sys/class/net/bond0/bonding/mode
- 或者 -
# echo balance-alb > /sys/class/net/bond0/bonding/mode
  注意:在修改模式前,请先断开bond接口。
在bond0上启用MII监控,使用1秒的时间间隔:
# echo 1000 > /sys/class/net/bond0/bonding/miimon
  注意:如果ARP监控被启用,当MII监控启用时它会被禁止,反之亦然。
增加ARP目的地址:
# echo +192.168.0.100 > /sys/class/net/bond0/bonding/arp_ip_target
# echo +192.168.0.101 > /sys/class/net/bond0/bonding/arp_ip_target
  注意:最多可以指定十个目的地址。
移除ARP目的地址:
# echo -192.168.0.100 > /sys/class/net/bond0/bonding/arp_ip_target
配置示例
---------------------
  我们从和3.3节相同的例子开始,但是使用sysfs,而不是ifenslave。
  为了生成一个简单的带两个e100设备(假定为eth0和eth1)的bond,而且希望它在重启后依然存在,你可以编辑对应的文件(/etc/init.d/boot.local or /etc/rc.d/rc.local),加入如下内容:
modprobe bonding
modprobe e100
echo balance-alb > /sys/class/net/bond0/bonding/mode
ifconfig bond0 192.168.1.1 netmask 255.255.255.0 up
echo 100 > /sys/class/net/bond0/bonding/miimon
echo +eth0 > /sys/class/net/bond0/bonding/slaves
echo +eth1 > /sys/class/net/bond0/bonding/slaves
  下面增加第二个bond,带有两个e1000接口,工作于active-backup模式,使用ARP监控,把如下内容加入到你的初始化脚本里:
modprobe e1000
echo +bond1 > /sys/class/net/bonding_masters
echo active-backup > /sys/class/net/bond1/bonding/mode
ifconfig bond1 192.168.2.1 netmask 255.255.255.0 up
echo +192.168.2.100 /sys/class/net/bond1/bonding/arp_ip_target
echo 2000 > /sys/class/net/bond1/bonding/arp_interval
echo +eth2 > /sys/class/net/bond1/bonding/slaves
echo +eth3 > /sys/class/net/bond1/bonding/slaves
4. 查询Bonding配置
=================================
4.1 Bonding配置
---------------------------------
  每个bonding设备对应于一个只读文件,存在于/proc/net/bonding目录,文件内容包括bonding配置的信息,选项以及每个slave的状态。
  例如,在使用参数mode=0,miimon=1000时,加载驱动后,/proc/net/bonding/bond0的内容为:
    Ethernet Channel Bonding Driver: 2.6.1 (October 29, 2004)
        Bonding Mode: load balancing (round-robin)
        Currently Active Slave: eth0
        MII Status: up
        MII Polling Interval (ms): 1000
        Up Delay (ms): 0
        Down Delay (ms): 0
        Slave Interface: eth1
        MII Status: up
        Link Failure Count: 1
        Slave Interface: eth0
        MII Status: up
        Link Failure Count: 1
  根据你配置、状态、以及bonding驱动版本的差异,上述内容的精确格式和内容有可能不同。
4.2 网路配置
---------------------------------
  网络配置可以通过ifconfig命令查看,Bonding设备会设上MASTER标记,slave设备会设上SLAVE标记。ifconfig的输出不包含哪个slave关联于哪个master的关系。
  在上例中,bond0接口是master(MASTER),而eth0和eth0是slave(SLAVE)。注意除了TLB和ALB模式外,所有 bond0的slave和bond0有着同样的MAC地址(HWaddr),TLB和ALB需要每个slave有独立的MAC地址。
# /sbin/ifconfig
bond0     Link encap:Ethernet  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 RUNNING MASTER MULTICAST  MTU:1500  Metric:1
          RX packets:7224794 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3286647 errors:1 dropped:0 overruns:1 carrier:0
          collisions:0 txqueuelen:0
eth0      Link encap:Ethernet  HWaddr 00:C0:F0:1F:37:B4
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:3573025 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1643167 errors:1 dropped:0 overruns:1 carrier:0
          collisions:0 txqueuelen:100
          Interrupt:10 Base address:0x1080
eth1      Link encap:Ethernet  HWaddr 00:C0:F0:1F:37:B4
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:3651769 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1643480 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          Interrupt:9 Base address:0x1400
5. 交换机配置
=================================
  在本节中,"交换机(switch)"指被bond设备直接连接的系统(也就是说,另一端电缆连接着的),这可能是一个专职的交换机设备,也可能是其它的系统(比如,另一个运行Linux的系统)。
  active-backup、balance-tlb和balance-alb模式不需要对交换机做任何的配置。
  802.3ad模式需要交换机有对应的配置为802.3ad聚合的端口,具体的配置方法因交换机类型而异,比如,Cisco 3550系列交换机要求对应的端口首先必须被分组在一个单独的etherchannel实例,然后这个etherchannel设置为"lacp"模式已启用802.3ad(取代标准EtherChannel)。
  balance-rr、balance-xor和broadcast模式通常需要交换机对应的端口被分组在一起,不同的交换机对分组有着不同的命名,可能会被叫做“etherchannel”(比如上文的Cisco示例),或者叫做“trunk group”,或者其他类似的命令。对于这些模式,每个交换机也会有它自己的针对到bond的传输策略的配置选项。典型的选择包括对每个MAC地址或者 IP地址进行XOR操作,两端的传输策略不一定完全一致。对这三种模式,bonding模式会针对一个EtherChannel组选择一种传输策略;所有这三种模式都会和另一个EtherChannel组进行互操作。
----------------------------------------------------------------------------------------
The balance-rr, balance-xor and broadcast modes generally
require that the switch have the appropriate ports grouped together.
The nomenclature for such a group differs between switches, it may be
called an "etherchannel" (as in the Cisco example, above), a "trunk
group" or some other similar variation.  For these modes, each switch
will also have its own configuration options for the switch's transmit
policy to the bond.  Typical choices include XOR of either the MAC or
IP addresses.  The transmit policy of the two peers does not need to
match.  For these three modes, the bonding mode really selects a
transmit policy for an EtherChannel group; all three will interoperate
with another EtherChannel group.
----------------------------------------------------------------------------------------
6. 支持802.1q VLAN
=================================
  我们可以使用8021q驱动在一个bond接口上配置VLAN设备,然而,只有来自8021q设备和经过(pass through)bonding的数据包缺省会被打上VLAN标记。自生成的数据包,比如,bonding的学习包、在ALB模式生成ARP包或者ARP 监测机制的ARP包,这些包都会被bonding自身在内部打上标记。因此,bonding必须要“学习”在它上面的VLAN ID的配置,然后使用这些ID来标记自生成的数据包。
  简单起见,为了支持那些可以使用VLAN hardware acceleration offloading的适配器,bonding接口把它自身声明为一个完全hardware offloading能力的设备,它通过获取add_vid/kill_vid通知来获取必备的信息,然后它把这些动作传播给slave。在混合的适配器类型下,那些打上硬件加速标记的数据包,如果经过一个不支持offloading的适配器,bonding驱动将“un-accelerated”,因此 VLAN标记依然存在正确的位置。
----------------------------------------------------------------------------------------
  For reasons of simplicity, and to support the use of adapters
that can do VLAN hardware acceleration offloading, the bonding
interface declares itself as fully hardware offloading capable, it gets
the add_vid/kill_vid notifications to gather the necessary
information, and it propagates those actions to the slaves.  In case
of mixed adapter types, hardware accelerated tagged packets that
should go through an adapter that is not offloading capable are
"un-accelerated" by the bonding driver so the VLAN tag sits in the
regular location.
----------------------------------------------------------------------------------------
  在从属slave至少有一个的情况下,VLAN接口"必须"被增加在bonding接口的最上面。直到第一个slave加入前,bonding接口的硬件地址将是00:00:00:00:00:00。如果VLAN接口在第一个slave加入前被创建,它会选择一个全0的硬件地址,一旦第一个slave加入到bond,bond设备自己就会选择slave的硬件地址,VLAN设备也将会使用这个地址。
  同时,要注意到如果所有的slave都被从bond移除,而bond上还有一个或多个VLAN接口时,类似的问题也会发生,当新的slave加入,bonding接口将获取第一个slave的硬件地址,而这可能和当前VLAN接口的硬件地址不一样(当前VLAN接口的硬件地址是从之前的 slave上获取的)。
  有两种方法来保证VLAN设备一直使用正确的硬件地址,即使所有slave被从bond接口上移除:
  1. 移除所有VLAN接口,然后重新创建它们
  2. 手动设置bonding接口的硬件地址,使它和VLAN接口的硬件地址一致。
  要注意改变一个VLAN接口的硬件地址将会改变它下面的设备(比如bonding接口)到混杂模式,这有可能不是你期望的结果。
7. 链路监控
=================================
  当前的bonding驱动支持两种模式,来监控slave设备的链路状态:ARP监控和MII监控。
  由于bonding驱动自身的实现限制,现在我们不可能同时启用ARP和MII监控。
7.1 ARP监控操作
---------------------------------
  ARP监控正如其名字所暗示的:它想网络上的对端系统发送ARP请求,并且通过ARP相应作为链路是否可用的标志,这可以保证网络两端的流量确实是通的。
  ARP监控依赖于设备驱动来验证流量是否是通的,进一步,驱动必须保留上次接收时间,dev->last_rx,以及传输起始时间,dev->trans_start。如果这些值不会被驱动更新,则ARP监控立刻会认为对应于该驱动的slave出现了故障,这些slave将会进入断开状态。如果网络监控工具(比如tcpdump)显示ARP请求和相应都正常,那有可能是你的设备驱动没有更新last_rx和 trans_start。
7.2 配置多ARP目的地址
---------------------------------
  尽管ARP监控可以只用一个目的地址来实现,但在高可靠性(High Availability)环境下,如果能够对多个目的地址进行监控也是很有用的。在只有一个目的地址的情况下,如果目标本身被关闭或者遇到问题以致无法响应ARP请求,这时额外的一个目标(或更多)可以增加ARP监控的可靠性。
  多ARP目的地址之间必须以逗号分割,如下:
# 3个目的地址的ARP监控选项示例
alias bond0 bonding
options bond0 arp_interval=60 arp_ip_target=192.168.0.1,192.168.0.3,192.168.0.9
  如果只有一个目的地址,配置也很类似:
# 只有1个目的地址的ARP监控选项示例
alias bond0 bonding
options bond0 arp_interval=60 arp_ip_target=192.168.0.100
7.3 MII监控操作
---------------------------------
  MII监控通过监控本地网络接口的载波状态来实现监控链路状态。可以通过3种方法之一来实现:通过依赖设备驱动来维护载波状态;通过查询设备的MII寄存器;或者通过给设备发送ethtool查询。
  如果模块参数use_carrier被设为1(缺省值),MII监控将会依赖于设备来获取载波状态信息(通过netif_carrier子系统)。正如前文介绍的use_carrier参数信息,如果MII监控不能发现设备的载波消失(比如当电缆被物理拔断时),那有可能时设备不支持 netif_carrier。
  如果use_carrier为0,MII监控首先会查询设备(通过ioctl)的MII寄存器并检查链路状态,如果查询失败(返回载波断开不属于失败),则MII监控会发送一个ethtool ETHOOL_GLINK查询以尝试获取类似的信息,如果两种方法都失败了(设备不支持或者在处理MII寄存器和ethtool查询时发生了错误),那么 MII监控将会假定链路是正常的。
8. 潜在问题缘由
=================================
8.1 路由历险记
---------------------------------
  如果配置了bonding,很重要的一点是slave设备不能拥有传递到master的路由(或者,通常根本没有路由),比如,假定bonding设备bond0有两个slave:eth0和eth1,路由表如下:
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.0.0.0        0.0.0.0         255.255.0.0     U        40 0          0 eth0
10.0.0.0        0.0.0.0         255.255.0.0     U        40 0          0 eth1
10.0.0.0        0.0.0.0         255.255.0.0     U        40 0          0 bond0
127.0.0.0       0.0.0.0         255.0.0.0       U        40 0          0 lo
  路由配置有可能持续更新设备的接收/发送次数(ARP监控需要),但可能旁路了bonding设备(在这个示例里,外出到网络网络10的流量将会在bond0之前使用eth0或者eth1)。
  ARP监控(以及ARP本身)可能会被这个配置所混淆,因为ARP请求(ARP监控生成)会在某个接口(bond0)上发出,但对应的响应在另一个接口上到达(eth0),这个响应将会被视为一个未关联ARP响应(因为ARP通过接口进行匹配)。MII监控不会被路由表状态所影响。
  这里的解决方法是:保证slave没有它们自己的路由,如果由于某些原因它们必须要有,这些路由不要传递到它们的master,通常情况下都是这样的,但某些特别的配置或者错误的操作或者静态添加路由可能会导致问题。
8.2 Ethernet设备重命名
---------------------------------
  有些系统,它的网络配置脚本没有直接把网络接口名和物理设备关联(如果关联的话,同样的物理设备总是有同样的"ethX"名),对于这些系统,可能需要增加一些特别的逻辑到/etc/modules.conf或者/etc/modprobe.conf(由系统中安装的部件决定)。
  比如,某个modules.conf包含如下内容:
alias bond0 bonding
options bond0 mode=some-mode miimon=50
alias eth0 tg3
alias eth1 tg3
alias eth2 e1000
alias eth3 e1000
  如果eth0和eth1都是bond0的slave,则当bond0接口启用时,这两个设备可能被重新排序,这是因为bonding会被首先加载,然后它的slave设备驱动才会加载,既然没有其他驱动被加载,当e1000驱动加载时,它将会把eth0和eth1认为是它的设备,但是bonding配置尝试把eth2和eth3从属过来(而eth2和eth3可能被赋予tg3设备)。
  增加如下内容:
add above bonding e1000 tg3
  这样,当bonding加载时,将会导致modprobe在tg3前加载e1000。该命令在modules.conf手册里有完整的描述。
  对于使用modprobe.conf(或者modprobe.conf.local)的系统,同样的问题也会发生。这时,可以在modprobe.conf(或modprobe.conf.local)加入如下内容(所有内容在同一行,这里清晰起见分行了):
install bonding /sbin/modprobe tg3; /sbin/modprobe e1000;
    /sbin/modprobe --ignore-install bonding
  这将会导致,当加载bonding模块时,除了执行正常的操作,同时还执行指定的命令,该命令以正确的顺序加载设备驱动,然后以--ignore- install来调用modprobe,这将导致随后调用通常的操作。完整的描述在modprobe.conf和modprobe的手册里。
8.3 速度变慢或Miimon无法监测到链路异常
---------------------------------
  缺省地,bonding会启用use_carrier选项,这将使得bonding信任设备来维护载波状态。
  正如在上文选项一节所述,某些驱动不支持netif_carrier_on/_off链路状态跟踪系统,当启用use_carrier,bonding将会永远认为链路是正常的,而不管它们的实际状态。
  而且,某些驱动虽然支持netif_carrier,但并不实时维护它,比如只是以某个固定的间隔轮训。在这种情况下,miimon会检测到链路异常,但是可能在某个很长的时间间隔后,如果发现miimon很慢才能检测到链路异常,尝试着设置use_carrier=0,看看能不能改善。如果可以改善,则很可能是驱动需要一个很长的固定间隔才会检查载波状态,而且没有缓存MII寄存器的值(因此当use_carrier=0时查询寄存器可以正常工作);如果use_carrier=0不能解决问题,则可能是驱动缓存了MII寄存器的值,或者是其它的问题。
  同时,请记住miimon只会检查设备的载波状态,它无法判定设备是否处于打开状态,或对端交换机的状态,或交换机拒绝传输流量,即使载波状态依然正常。
9. SNMP代理
=================================
  如果运行SNMP代理,bonding驱动应该在任何网络驱动参与到bond前被加载,这个要求是由于接口索引(ipAdEntIfIndex)被关联到第一个有着指定IP地址的被发现的接口,也就是说,对每个IP地址只有一个ipAdEntIfIndex,比如,如果eth0和eth1是bond0的 slave,eth0的驱动在bonding驱动前被加载,IP地址的接口将会被关联到eth0接口,配置如下,IP地址192.168.1.1将会使用接口索引2,这将指向ifDescr表(ifDescr.2)中的eth0:
     interfaces.ifTable.ifEntry.ifDescr.1 = lo
     interfaces.ifTable.ifEntry.ifDescr.2 = eth0
     interfaces.ifTable.ifEntry.ifDescr.3 = eth1
     interfaces.ifTable.ifEntry.ifDescr.4 = eth2
     interfaces.ifTable.ifEntry.ifDescr.5 = eth3
     interfaces.ifTable.ifEntry.ifDescr.6 = bond0
     ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.10.10.10.10 = 5
     ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.192.168.1.1 = 2
     ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.10.74.20.94 = 4
     ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.127.0.0.1 = 1
  如果在所有参与到bond的网络驱动加载前加载bonding驱动,我们可以避免这个问题。如下是一个示例,它会首先加载bonding驱动,IP地址192.168.1.1被正确地关联到ifDescr.2:
     interfaces.ifTable.ifEntry.ifDescr.1 = lo
     interfaces.ifTable.ifEntry.ifDescr.2 = bond0
     interfaces.ifTable.ifEntry.ifDescr.3 = eth0
     interfaces.ifTable.ifEntry.ifDescr.4 = eth1
     interfaces.ifTable.ifEntry.ifDescr.5 = eth2
     interfaces.ifTable.ifEntry.ifDescr.6 = eth3
     ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.10.10.10.10 = 6
     ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.192.168.1.1 = 2
     ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.10.74.20.94 = 5
     ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.127.0.0.1 = 1
  当某些发行包没有在ifDescr中报告接口名,IP地址和IfIndex的关联依然保留,而且SNMP功能,比如Interface_Scan_Next将会报告这些关联。
10. 混杂模式
=================================
  当运行网络监控工具,比如tcpdump,经常会要打开设备德混杂模式,这样所有流量都会被发现(不仅仅看到目标为本机的流量)。bonding驱动处理针对bonding主设备的混杂模式(比如bond0),并把设定传播给其他slave设备。
  对于balance-rr,balance-xor,broadcast和802.3ad模式,混杂模式设置会被传播给所有slave。
  对于active-backup,balance-tlb和balance-alb模式,混杂模式设置仅会被传播给激活的slave。
  对于balance-tlb模式,激活的slave是指当前正在接收inbound流量的slave。
  对于balance-alb模式,激活的slave是指用做"primary"的slave,这个slave用于模式相关的控制流量,对于发送到未指定对端或如果流量未做均衡。
----------------------------------------------------------------------------------------
  For balance-alb mode, the active slave is the slave used as a
"primary."  This slave is used for mode-specific control traffic, for
sending to peers that are unassigned or if the load is unbalanced.
----------------------------------------------------------------------------------------
  对于active-backup,balance-tlb和balance-alb模式,当激活的slave改变时(比如由于链路异常),混杂设定会被传播给新的激活slave。
11. 配置Bonding用于高可靠性(High Availability,缩写为HA)
==========================================================
  High Availability指提供最大网络可靠性的配置,通过在主机和其他设备间的冗余或备份设备、链路或交换机,目标是提供最大的网络链接可靠性(要求网络一直可用),尽管其它的配置可能提供更高的吞吐量(性能)。
11.1 单交换机拓扑下的HA
---------------------------------
  如果两个主机(或一个主机和一个交换机)通过多个物理链路直连,想要优化最大带宽就不具有可行性。在这种情况下,只有一个交换机(或对端),如果它坏了,那没有替代的链接来接替。此外,bonding负载均衡模式支持成员的链路监控,因此如果单个链路坏了,负载将会被均衡到剩余的设备。
  参看第12节“配置Bonding用于最大吞吐量”,如果你想配置只有一个对端设备的bonding。
11.2 多交换机拓扑下的HA
---------------------------------
  如果有多个交换机,bonding和网络的配置戏剧性的发生了变化。在多交换机拓扑下,在网络可靠性和可用贷款间存在着平衡。
  如下是一个简单的网络,配置用于最大化网络可靠性:
                |                                     |
                |port3                           port3|
          +-----+----+                          +-----+----+
          |          |port2       ISL      port2|          |
          | switch A +--------------------------+ switch B |
          |          |                          |          |
          +-----+----+                          +-----++---+
                |port1                           port1|
                |             +-------+               |
                +-------------+ host1 +---------------+
                         eth0 +-------+ eth1
  在该配置中,两个交换机间存在着一个链路(交换机间链路,ISL,Inter Switch Link),并存在多个连到外部的端口(每个交换机上的"port3"),从技术角度看,把它扩充到3个或更多交换机没有任何问题。
11.2.1 多交换机拓扑下的HA模式选择
---------------------------------
  在如上例所示的拓扑中,可用于优化可靠性的bonding模式只有active-backup和broadcast模式,其他的模式要求在同一个对端断开的所有链路能够有特定的行为。
active-backup: 通常是推荐的模式,尤其是如果交换机间存在ISL并能一起很好的工作。如果一个交换机被配置为备份交换机(比如,有更低的处理能力,更高的费用等等),则可以使用primary选项来保证期望的链路在它可用时总是用它。
broadcast:该模式是一种特定目的的模式,只在特定的需求下才需要。比如,如果两个交换机没有互联(没有ISL),而且它们连接的网络是完全独立的,在这种情况下,如果需要某些特定的单向流量能够都到达这两个独立的网络,那可能需要broadcast模式。
11.2.2 多交换机拓扑下的HA链路监控选择
---------------------------------
  链路监控的选择根本上是依赖于你的交换机,如果交换机可以在发生异常时可靠地断开端口,则MII或ARP监控都是可以的。比如,在上例中,如果"port3"在远端的链路异常,由于MII监控没有直连所以无法监测到,而ARP监控如果想监测到必须要配置为port3的远端的目标地址,这样如果没有路由器的支持,要想监测这一类错误时不可能的。
  一般来说,在多交换机拓扑下,ARP监控可以在监测端到端连接错误(可能由任何独立部件在传输流量方面的异常导致)方面提供更高层的可靠性。此外,ARP 监控应该被配置为多个目标(至少网络里的每个交换机都有一个),这可以保证不管哪个交换机可用,ARP监控总是有个合适的目标来查询。
12. 配置Bonding用于最大吞吐量(Maximizing Throughput,缩写为MT)
===============================================================
12.1 单交换机拓扑下的最大吞吐量
---------------------------------
  在单交换机配置情况下,最好的最大化吞吐量的方法依赖于应用程序和网络环境,不同的环境下,不同的负载均衡模式由不同的优点和缺点,如下文所述。
  对这些讨论,我们将把拓扑分为两类,根据大部分流量的目的地,我们把拓扑分为“网关”(gatewayed)和“本地”(local)配置。
  在网关型配置下,“交换机”主要时担当一个路由的功能,主要的网络流浪通过这个路由器到达其他网络,如下图所示:

     +----------+                     +----------+
     |          |eth0            port1|          | to other networks
     | Host A   +---------------------+ router   +------------------->
     |          +---------------------+          | Hosts B and C are out
     |          |eth1            port2|          | here somewhere
     +----------+                     +----------+
  路由器可能是一个专用的路由器设备,也可能是其它充当网关的主机。对我们的讨论,重要的一点是:从Host A来的大部分网络流量将会在到达目的地前先通过路由器到其它的网络。
  在路由器网络配置情况下,尽管Host A可能和很多其它系统通信,但所有流量将通过本地网络中的一个对端(路由器)来发送和接收。
  要说明的是:配置bonding的目的,对于两个系统通过多个物理链接直连,和网关型配置其实是一样的,在这种情况下,碰巧所有流量都通向“网关”自身,而不是网关外的其它网络。
  在本地型配置情况下,“交换机”主要充当交换的功能,主要的流量通过这个交换机到达同一个网络上的其它工作站,下图是一个示例:
    +----------+            +----------+       +--------+
    |          |eth0   port1|          +-------+ Host B |
    |  Host A  +------------+  switch  |port3  +--------+
    |          +------------+          |                  +--------+
    |          |eth1   port2|          +------------------+ Host C |
    +----------+            +----------+port4             +--------+

  同样的,交换机可以是一个专用的交换机设备,也可以是其它充当网关的主机。对我们的讨论,重要的一点是:从Host A来的大部分流量将会到达同一本地网络的其它主机(本例中的Host B和Host C)。
  总结一下,在网关型配置下,来自和发自bond设备的流量将会到网络上的同一个对端MAC地址(网关本身,比如路由器),而不管它的最终目的地是什么。在本地型配置下,流量直接来自或发往最终目的地,这样,每个目的地(Host B,Host C)将会通过它们独立的MAC地址被指定。
  网关型和本地型网络配置的差别很重要,是因为很多负载均衡模式使用本地网络源和目的地的MAC地址来做处负载均衡的决定。每种模式的具体行为在下文描述:
12.1.1 单交换机拓扑下的MT Bonding模式选择
-----------------------------------------
  这个配置是最容易配置和理解的,尽管你不得不决定哪种bonding模式对于你的需求最适合。每种模式的折衷如下所示:
balance-rr: 该模式可以允许某个单一的TCP/IP连接在多个接口上分割(stripe)流量,而且该模式是唯一支持该功能的模式。因此它也是唯一的允许单个TCP /IP流利用多于一个的接口来提高吞吐量的模式。然而这导致一定的开销,分割通常导致对端系统接收数据时乱序,从而导致TCP/IP拥堵控制机制发生作用,通常通过重发分段。
  当然也可以调整TCP/IP的拥塞限制,通过修改sysctl的net.ipv4.tcp_reordering参数即可。通常的缺省值时3,最大可用值为127。对于一个四个接口的balance-rr模式的bond,单个TCP/IP流不应期望使用超过大概2.3个接口来提高吞吐量,即使调整过 tcp_reording的值。
  请注意,这里乱序传递只在发送方和接收方都利用多个接口bond时发生。考虑这样的配置,balance-rr模式bond流入单个高容量网络通道(比如,多个100Mb/sec以太网通过具备etherchannel功能的路由器流入一个千兆以太网),这时,来自多个100Mb设备的流量发往连接着千兆设备的目的地时,将意识不到数据包的乱序。然而,来自千兆设备发往多个100Mb设备的流量,可能看到也可能看不到流量乱序,这依赖于交换机的均衡策略。很多交换机不支持分割流量的模式(而是基于IP或MAC级地址来选择一个端口),对于这些设备,从千兆设备流向多个100Mb设备时只会利用一个接口。
  如果你想使用TCP/IP以外的协议,比如UDP,而且你的应用能够容忍乱序投递,那么这种模式可以为单个流数据包提供线性性能增长,随着加入到bond里的接口数量。
  该模式要求交换机有适当的端口配置为“etherchannel”或“trunking”。
active-backup: 对于active-backup模式,在这种网络拓扑下使用并没有什么特别的好处,因为所有的未激活备份设备都作为primary连接到同样的对端。这种情况下,一种负载均衡模式(利用链路监控)将提供同样的网络可靠性,但增加了可用带宽。此外,active-backup模式不要求交换机的任何配置,因此如果当前硬件不支持任何负载均衡模式时,该模式就很有用了。
balance-xor: 该模式将限定流量,以保证到达特定对端的流量总是从同一个接口上发出。既然目的地是通过MAC地址来决定的,因此该模式在“本地”网络配置(上文曾提及)下可以工作得很好。如果所有流量是通过单个路由器(比如上文提及的“网关”型网络配置),那该模式就不是最好的选择。
  和balance-rr一样,交换机端口需要能配置为“etherchannel”或“trunking”。
broadcast: 和active-backup类似,在这种网络拓扑下该模式没有什么特别的优点。
802.3ad: 对于这种网络拓扑,该模式是一个很好的选择。802.3ad模式是IEEE标准,因此所有实现了802.3ad的对端都可以很好的互操作。802.3ad 协议包括聚合的自动配置,因此只需要很少的对交换机的手动配置(要指出的是,只有某些设备才能使用802.3ad)。802.3ad标准也要求帧按顺序(一定程度上)传递,因此通常单个连接不会看到包的乱序。802.3ad也有些缺点:标准要求所有设备在聚合操作时,要在同样的速率和双工模式,而且,和除了balance-rr模式外的其它bonding负载均衡模式一样,任何连接都不能使用多于一个接口的带宽。
  此外,linux bonding的802.3ad实现通过对端来分发流量(通过MAC地址的XOR值),因此在“网关”型配置下,所有外出(Outgoing)流量将使用同一个设备。进入(Incoming)的流量也可能在同一个设备上终止,这依赖于对端802.3ad实现里的均衡策略。在“本地”型配置下,路两将通过 bond里的设备进行分发。
  最后,802.3ad模式要求使用MII监控,因此,ARP监控在该模式下不可用。
balance-tlb: balance-tlb模式通过对端均衡外出(outgoing)流量。既然它是根据MAC地址进行均衡,在“网关”型配置(如上文所述)下,该模式会通过单个设备来发送所有流量,然而,在“本地”型网络配置下,该模式以相对智能的方式(不是balance-xor或802.3ad模式里提及的XOR方式)来均衡多个本地网络对端,因此那些数字不幸的MAC地址(比如XOR得到同样值)不会聚集到同一个接口上。
  不像802.3ad,该模式的接口可以有不同的速率,而且不需要特别的交换机配置。不利的一面在于,该模式下所有进入的(incoming)流量会到达同一个接口;该模式要求slave接口的网络设备驱动有某种ethtool支持;而且ARP监控不可用。
balance-alb: 该模式有着所有balance-tlb有的功能(以及局限性),同时,它还会均衡从本地网络对端进入的(incoming)流量(如上文的Bonding模块选项一节所述)。
  该模式唯一额外的不利在于,网络设备驱动必须支持在设备启动时改变硬件地址。
12.1.2 单交换机拓扑下的MT链路监控
---------------------------------
  链路监控的选择很大程度上依赖于你选择的bond模式。最先进的负载均衡模式不支持ARP监控,因此就只能使用MII监控(而这不能提供如ARP监控那样的高阶端到端确认)。
12.2 多交换机拓扑下的最大吞吐量
---------------------------------
  可能利用多个交换机来优化吞吐量,当它们并行地配置为两个或更多系统中间的一个独立的网络,例如:
                       +-----------+
                       |  Host A   |
                       +-+---+---+-+
                         |   |   |
                +--------+   |   +---------+
                |            |             |
         +------+---+  +-----+----+  +-----+----+
         | Switch A |  | Switch B |  | Switch C |
         +------+---+  +-----+----+  +-----+----+
                |            |             |
                +--------+   |   +---------+
                         |   |   |
                       +-+---+---+-+
                       |  Host B   |
                       +-----------+
  在这种配置情况下,交换机间相互隔离。应用这种拓扑的原因可能是,对于一个有很多主机的独立网络(比如配置为高性能的Cluster系统),使用多个小型交换机可以比使用一个大型交换机要节省费用,比如,在有24个主机的网路里,三个24×××换机会比一个72×××换机的便宜得多。
  如果要访问到这个网络外面,可以使用一个独立的主机,它有一个附加的网路设备连接到外部网络,这个主机可以充当一个网关的作用。
12.2.1 多交换机拓扑下的MT Bonding模式选择
-----------------------------------------
  实际操作时,典型的应用于这种类型的bonding模式时balance-rr。历史上,在这种网络配置下,通常的关于投递数据包乱序的警告可以通过使用某些网络适配器解决,这些适配器不进行任何包组合(通过使用NAPI,或者因为设备本身只在某些数量的包到达后才产生中断)。当使用这个功能时,balance-rr模式允许两个主机间的独立连接有效地利用多于一个接口的带宽。
12.1.2 多交换机拓扑下的MT链路监控
---------------------------------
  同样的,在实际操作中,对于这种配置最常使用MII监控,由于效率相对于可用性更优先。ARP监控在这种拓扑下也可以工作,但由于它的侦测数量随着引入系统的数量而增长(记得网络里的每个主机都需要配置),因此它相对于MII监控的优点就不值一提了。
13. 交换机行为的问题
=================================
13.1 链路建立和故障恢复的延时
---------------------------------
  某些交换机会出现不合适的行为,关于交换机报告的链路启动和关闭的时间。
  首先,当链路启动时,某些交换机可能指示链路已经启动(载波有效),但在一段时间里并没有把流量从这个接口上通过,这个延迟一般是由于某种类型的自协商或路由协议,但也可能在交换机初始化时发生(比如在交换机失败后恢复时),如果你发现这是个问题,给bonding模块的updelay选项指定一个合适的值,用于指定相关接口的延时值。
  其次,某些交换机可能一次或多次“反弹”(bounce)链路状态,当链路改变状态时。这最通常在交换机初始化时发生,同样,一个合适的updelay值可以解决问题。
  要注意的是:当bonding接口没有激活的链路,驱动会立刻重用第一个链路,即使指定了updelay参数(这时updelay被忽略),如果有 slave接口等待updelay超时,第一个进入该状态的接口会立刻被重用,这可以减少网络的断线时间,如果updelay值被设得过大,而且由于这只在没有连接时发生,就算忽略updelay也没有任何问题。
  其它的关于交换机时间的考虑在于,如果交换机需要很长时间进入备份模式,在一个链路断开后不要立刻激活备份接口可能更合适。错误恢复可以通过指定bonding模块的downdelay选项来指定延时。
13.2 Incoming包重复
---------------------------------
  有时你会发现在bonding设备第一次使用时,或在它休眠了一段时间后,会发生短暂的重复数据包爆发。这很容易通过"ping"网络中的其它主机来发现,可以发现ping的输出中有重复标记(通常每个slave重复一个)。
  比如,一个在active-backup模式下的bond,有五个slave都连接到同一个交换机,输出可能如下:
# ping -n 10.0.4.2
PING 10.0.4.2 (10.0.4.2) from 10.0.3.10 : 56(84) bytes of data.
64 bytes from 10.0.4.2: icmp_seq=1 ttl=64 time=13.7 ms
64 bytes from 10.0.4.2: icmp_seq=1 ttl=64 time=13.8 ms (DUP!)
64 bytes from 10.0.4.2: icmp_seq=1 ttl=64 time=13.8 ms (DUP!)
64 bytes from 10.0.4.2: icmp_seq=1 ttl=64 time=13.8 ms (DUP!)
64 bytes from 10.0.4.2: icmp_seq=1 ttl=64 time=13.8 ms (DUP!)
64 bytes from 10.0.4.2: icmp_seq=2 ttl=64 time=0.216 ms
64 bytes from 10.0.4.2: icmp_seq=3 ttl=64 time=0.267 ms
64 bytes from 10.0.4.2: icmp_seq=4 ttl=64 time=0.222 ms
  这不是由于bonding驱动的错误,这是很多交换机在更新它们的MAC转发表的一个副作用。开始的时候,交换机没有关联包里的MAC地址到一个特定的交换机端口,因此它可能把这个包发送给所有的端口,直到MAC转发表被更新。既然bond绑定的接口可能占有一个交换机上的多个端口,当交换机(临时地)给所有端口发送流量时,bond设备就会收到同一个包的多份复制(每个slave设备一份)。
  重复包行为是由交换机决定的,某些交换机有这个问题,而有些没有。如果交换机有这个问题,你可能清楚MAC转发表来发现它(在大多数Cisco交换机上,特权指令“clear mac address-table dynamic”可以清楚)。
14. 硬件相关的考量
=================================
  本节包含一些额外的信息,用于配置特定硬件平台上的bonding,或者针对特别的交换机或其它设备的bonding配置。
14.1 IBM刀片服务器(BladeCenter)
---------------------------------
  适用于JS20和类似的系统。
  在JS20刀片服务器上,bonding驱动只支持balance-rr,active-backup,balance-tlb和balance-alb模式,这主要是由于刀片服务器内部的网络拓扑所决定的,如下文所述。
JS20网络适配器信息
---------------------------------
  所有的JS20系列有两个Broadcom千兆以太网卡集成在planar(IBM这么称呼“主板”)上。在刀片的底盘(chassis)上,所有 JS20刀片的eth0端口被硬连接到#1 I/O模块,类似的,所有eth1端口被连接到#2 I/O模块。一个附加的Broadcom daughter卡可以被安装到JS20上来提供两个或更多千兆以太网卡,这些端口,也就是eth2/eth3等等,相应地被连接到#3和#4 I/O模块。
  每个I/O模块可能包含一个交换机后者一个passthrough模块(它可以让端口直连到外部的交换机)。某些bonding模式要求特定的刀片内部网络拓扑以正常工作,如下文。
  更多的刀片相关的网络信息可以在IBM红宝书上找到(www.ibm.com/redbooks):
"IBM eServer BladeCenter Networking Options"
"IBM eServer BladeCenter Layer 2-7 Network Switching"
刀片网络配置
---------------------------------
  因为刀片可以有非常多的方法进行配置,这里的讨论将主要针对最基本的一些配置情况。
  通常,在1和2 I/O模块会里使用以太交换模块(Ethernet Switch Modules,ESM),这时,JS20的eth0和eth1端口将会连接到不同的内部交换机上(在对应的I/O模块上)。
  passthrough模块(OPM或CPM,指Optical Passthrough Modules或Copper Passthrough Modules)直接连接I/O模块到外部的交换机,通过使用#1和#2 I/O模块里的passthrough模块,JS20的eth0和eth1接口可以被重定向到外部的网络,并连接到一个外部的交换机上。
  依赖于ESM和PM的混合,展现给bonding的网络可能是一个单交换机拓扑(所有都是PM),或者是一个多交换机拓扑(一个或多个ESM,0个或多个PM),也可能把ESM连在一起,产生一个更像上文“多Switch下的高可靠性”一节描述的例子的配置。
特定模式的需求
---------------------------------
  balance-rr模式要求对bond中的设备使用PM,所有设备都连接到外部交换机上,那些交换机在对应的端口必须被配置为“etherchannel”或“trunking”,正如balance-rr通常使用时的要求一样。
  balance-alb和balance-tlb模式可以和ESM或PM(或者混合)一起工作,唯一的要求是:对这些模式,所有的网络接口必须能够到达所有通过bonding设备的流量所对应的目的地址(也就是,网络必须会聚到刀片外部的一点)。
  active-backup模式没有特别的需求。
链路监控的问题
---------------------------------
  当使用ESM时,只有ARP监控能可靠地监测到到外部交换机的链路断开,这一点也不出乎意料,但刀片cabinet考试建议“外部的”网络端口是系统的以太端口,如果这样的话,在这些“外部的”端口和JS20系统的设备间应该存在一个交换机。MII监控只能监测ESM和JS20系统间的链路异常。
----------------------------------------------------------------------------------------
  When an Ethernet Switch Module is in place, only the ARP
monitor will reliably detect link loss to an external switch.  This is
nothing unusual, but examination of the BladeCenter cabinet would
suggest that the "external" network ports are the ethernet ports for
the system, when it fact there is a switch between these "external"
ports and the devices on the JS20 system itself.  The MII monitor is
only able to detect link failures between the ESM and the JS20 system.
----------------------------------------------------------------------------------------
  当使用PM时,MII监控可以监控到“外部”端口的异常,因为这些“外部”端口是直连到JS20系统的。
其它考虑
---------------------------------
  Serial Over LAN(SoL,局域网上的串口连接)链路只能通过主以太(eth0)建立,因此如果eth0链路断开将会导致SoL连接的断开,它不会被通过其它网络流量来恢复,因此SoL系统超出了bonding驱动的控制范围。
  在使用bonding时,有可能需要关闭交换机(内部ESM,或外部交换机)的生成树功能,来避免错误恢复的延迟问题。
15. 常见问题(FAQ)
=================================
1. 它是否是SMP(对称多处理器)安全?
  是的,老的2.0.xx版本的bonding补丁不是SMP安全的,但新的驱动从一开始就被设计为SMP安全的。
2. 它需要哪种类型的网卡?
  任何ethernet类型的网卡都可以(你甚至可以使用混合的网卡:比如一块Intel EtherExpress PRO/100和一块3com 3c905b)。对大多数模式而言,设备并不需要有同样的速度。
3. 我可以创建多少个bonding设备?
  没有限制。
4. 一个bonding设备最多有多少个slave设备?
  这只受限于Linux支持的网络接口的数量和/或系统中可安插的网卡数量。
5. 当slave连接断开时会发生什么?
  如果链路监控被启用,断开的设备将会被禁用,active-backup模式会切换到一个备份的链路,其他模式会忽略掉断开的链路。但这个链路依然会被监控以发现它是否恢复,当链路恢复时它会重新加入bond(不管哪种工作模式),参见“高可靠性”一节以及每种工作模式的文档以获得更多信息。
  链路监控可以通过miimon或者arp_interval参数启用(在上文的模块参数一节中有描述)。通常,miimon通过监控底层网络驱动获得的载波状态来判定网络状态,而arp监控(arp_interval)通过判断本地网络里相邻主机的连通性来判定。
  如果链路监控没有启用,bonding驱动不会监测到链路故障,它会假定链路一直是可用的,这有可能会导致丢包,而且会导致性能的下降,确切的性能下降依赖于bonding的模式和网络的配置。
6. bonding可以被用于"高可用性"(High Availability)吗?
  是的,参看"高可用性"(High Availability)一节。
7. 它可以和哪种交换机/系统一起工作?
  确切的答案依赖于工作的特定模式。
  在基本的balance模式(balance-rr或者balance-xor)下,bonding可以在任何支持etherchannel(也称为trunking)的系统运行。大多数目前的可管理交换机都有支持,很多不可管理的交换机也有支持。
  高级balance模式(balance-tlb和balance-alb)没有特别的交换机需求,但需要设备驱动支持特定功能(在上文的模块参数一节里有描述)。
  在802.3ad模式,bonding可以和支持IEEE 802.3ad动态连接聚合(Dynamic Link Aggregation)的系统一起工作,大多数可管理交换机和很多不可管理交换机都支持802.3ad。
  active-backup模式可以和任何二层(Layer-II)交换机一起工作。
8. bonding设备从什么地方获取它的MAC地址?
  如果没有显式的配置(通过ifconfig或ip link),bonding设备的MAC地址来自它的第一个slave设备,这个MAC地址会被其后的所有slave设备使用,并一直保留(即使第一个slave被移除),除非bonding设备断开或者重新配置。
  如果你想修改MAC地址,可以通过ifconfig或者ip link命令:
# ifconfig bond0 hw ether 00:11:22:33:44:55
# ip link set bond0 address 66:77:88:99:aa:bb
  MAC地址也可以这样修改:首先断开设备,然后修改slave的MAC地址(或者它们的顺序):
# ifconfig bond0 down ; modprobe -r bonding
# ifconfig bond0 .... up
# ifenslave bond0 eth...
  这个方法会自动选用增加的下一个slave的地址。
  为了恢复你的slave的MAC地址,你需要从bond上解除该slave(`ifenslave -d bond0 eth0'),bonding设备会恢复被从属前的MAC地址。
16. 资源和链接
=================================
最近版本的bonding驱动可以在最新的linux内核里找到,网站在http://kernel.org
本文的最新版本可以在最新版的内核源码中找到(名为:Documentation/networking/bonding.txt),或者在bonding的sorceforge网站:
关于bonding驱动的讨论可以在bonding-devel的mail list找到,该mail list位于sourceforge.net。如果你有任何问题或疑问,直接给该mail list发送邮件,地址为:
  订阅或解除订阅的方法可以在下面的地址找到:
Donald Becker的Ethernet驱动和拨号程序可以在这边找到:
 -
http://www.scyld.com/network/
你也可以在www.scyld.com找到很多关于Ethernet、NWay、MII等的很多信息。
 
 
modprobe bonding
ifconfig eth0 down
ifconfig eth1 down
#ifconfig bond0 ipaddress
ifconfig bond0 ip地址 netmask <子网掩码> broadcast <广播地址>
ifenslave bond0 eth0
ifenslave bond0 eth1
现在两块网卡已经象一块一样工作了.这样可以提高集群节点间的数据传输.
其中,可以指定绑定的模式,比如:
modprobe bonding mode=balance-rr miimon=100
其中,mode=balance-rr为负载均衡;mode=active-backup为互备份模式,如果还要使用互备模式,需要加上参数primary=ethx,比如:
modprobe bonding mode=active-backup miimon=100 primary=eth0
   其中eth0,eth1是两块物理网卡。
停止bonding
 
ifenslave -d bond0 eth0
ifenslave -d bond0 eth1
ifconfig bond0 down
modprobe -r bonding
 
绑定多个bonding
如果系统存在多块网卡,eth0,eth1,eth2,eth3,我们现在希望估两两做备份,如果以前的方法加载bonding模块,这样在系统就可以配置
多个bonding了,需要在加载bonding的时候加载一个参数,max_bonds,比如:
 
modprobe bonding max_bonds=2
 
在SUSE中,可以将bonding模块做个别名设置多个bond设备,编辑/etc/modprobe.conf.local文件,加入如下内容:
 
alias bond0 bonding
options bonding mod=blance-rr miimon=100 max_bonds=2
alias bond1 bonding
options bonding mod=active-backup miimon=100 primary=eth2 max_bonds=2