Linux 以太网绑定驱动程序 HOWTO

最新更新:2011 年 4 月 27 日

初始版本:Thomas Davis <tadavis at lbl.gov>

更正,HA 扩展:2000/10/03-15

  • Willy Tarreau <willy at meta-x.org>

  • Constantine Gavrilov <const-g at xpert.com>

  • Chad N. Tindel <ctindel at ieee dot org>

  • Janice Girouard <girouard at us dot ibm dot com>

  • Jay Vosburgh <fubar at us dot ibm dot com>

2005 年 2 月由 Jay Vosburgh 重组和更新 添加 Sysfs 信息:2006/04/24

  • Mitch Williams <mitch.a.williams at intel.com>

简介

Linux 绑定驱动程序提供了一种将多个网络接口聚合到单个逻辑“绑定”接口中的方法。绑定接口的行为取决于模式;一般来说,模式提供热备或负载平衡服务。此外,还可以执行链路完整性监控。

绑定驱动程序最初来自 Donald Becker 的 beowulf 补丁,用于内核 2.0。自那以后,它发生了很大变化,来自 extreme-linux 和 beowulf 站点的原始工具将无法与此版本的驱动程序一起使用。

有关驱动程序的新版本、更新的用户空间工具以及向谁寻求帮助,请关注本文档末尾的链接。

1. 绑定驱动程序安装

大多数流行的发行版内核都附带了绑定驱动程序,它已经作为一个模块可用。如果你的发行版没有,或者你需要从源代码编译绑定(例如,从 kernel.org 配置和安装主线内核),你需要执行以下步骤

1.1 配置并构建带有绑定的内核

当前版本的绑定驱动程序位于最新内核源代码的 drivers/net/bonding 子目录中(可在 https://linuxkernel.org.cn 上获得)。大多数“自己动手”的用户都希望使用来自 kernel.org 的最新内核。

使用“make menuconfig”(或“make xconfig”或“make config”)配置内核,然后在“网络设备支持”部分选择“绑定驱动程序支持”。建议将驱动程序配置为模块,因为它是目前将参数传递给驱动程序或配置多个绑定设备的唯一方法。

构建并安装新的内核和模块。

1.2 绑定控制实用程序

建议通过 iproute2 (netlink) 或 sysfs 配置绑定,旧的 ifenslave 控制实用程序已过时。

2. 绑定驱动程序选项

绑定驱动程序的选项在加载时作为参数提供给绑定模块,或者通过 sysfs 指定。

模块选项可以作为命令行参数传递给 insmod 或 modprobe 命令,但通常在 /etc/modprobe.d/*.conf 配置文件中指定,或者在特定于发行版的配置文件中指定(其中一些将在下一节中详细介绍)。

有关 sysfs 的绑定支持的详细信息,请参见下面的“通过 Sysfs 手动配置绑定”部分。

下面列出了可用的绑定驱动程序参数。如果未指定参数,则使用默认值。在最初配置绑定时,建议在单独的窗口中运行“tail -f /var/log/messages”以监视绑定驱动程序错误消息。

至关重要的是,必须指定 miimon 或 arp_interval 和 arp_ip_target 参数,否则在链路故障期间会发生严重的网络降级。很少有设备不支持至少 miimon,因此实际上没有理由不使用它。

具有文本值的选项将接受文本名称或(为了向后兼容)选项值。例如,“mode=802.3ad”和“mode=4”设置相同的模式。

参数如下

active_slave

指定支持它的模式的新活动从设备(active-backup、balance-alb 和 balance-tlb)。可能的值是任何当前已从属接口的名称,或空字符串。如果给出了名称,则从设备及其链路必须处于 up 状态才能被选为新的活动从设备。如果指定了空字符串,则当前活动从设备将被清除,并且会自动选择新的活动从设备。

请注意,这只能通过 sysfs 接口获得。不存在以此名称命名的模块参数。

此选项的正常值是当前活动从设备的名称,如果没有活动从设备或当前模式不使用活动从设备,则为空字符串。

ad_actor_sys_prio

在 AD 系统中,这指定了系统优先级。允许的范围是 1 - 65535。如果未指定该值,则默认值为 65535。

此参数仅在 802.3ad 模式下有效,并且可以通过 SysFs 接口获得。

ad_actor_system

在 AD 系统中,这指定了协议数据包交换 (LACPDUs) 中参与者的 mac 地址。该值不能是多播地址。如果指定了全零 MAC,则绑定将在内部使用绑定本身的 MAC。最好为此 mac 设置本地管理位,但驱动程序不强制执行。如果未给出该值,则系统默认使用主服务器的 mac 地址作为参与者的系统地址。

此参数仅在 802.3ad 模式下有效,并且可以通过 SysFs 接口获得。

ad_select

指定要使用的 802.3ad 聚合选择逻辑。可能的值及其效果是

stable 或 0

活动聚合器由最大聚合带宽选择。

只有当活动聚合器的所有从设备都关闭或活动聚合器没有从设备时,才会重新选择活动聚合器。

这是默认值。

bandwidth 或 1

活动聚合器由最大聚合带宽选择。如果发生以下情况,则会发生重新选择

  • 从设备已添加到绑定或从绑定中删除

  • 任何从设备的链路状态更改

  • 任何从设备的 802.3ad 关联状态更改

  • 绑定的管理状态更改为 up

count 或 2

活动聚合器由最大端口(从设备)数选择。重新选择的发生方式与上面的“带宽”设置下描述的相同。

带宽和计数选择策略允许在活动聚合器发生部分故障时进行 802.3ad 聚合的故障转移。这使得具有最高可用性(在带宽或端口数方面)的聚合器始终处于活动状态。

此选项已添加到绑定版本 3.4.0 中。

ad_user_port_key

在 AD 系统中,端口密钥有三个部分,如下所示 -

用途

00

双工

01-05

速度

06-15

用户定义

这定义了端口密钥的最高 10 位。这些值可以从 0 到 1023。如果未给出,则系统默认为 0。

此参数仅在 802.3ad 模式下有效,并且可以通过 SysFs 接口获得。

all_slaves_active

指定是否应删除(0)或传递(1)重复帧(在非活动端口上接收)。

通常,绑定将删除重复帧(在非活动端口上接收),这对于大多数用户来说是理想的。但有时允许传递重复帧是很好的。

默认值为 0(删除在非活动端口上接收的重复帧)。

arp_interval

指定 ARP 链路监控频率(以毫秒为单位)。

ARP 监控的工作原理是定期检查从设备,以确定它们最近是否已发送或接收流量(精确的标准取决于绑定模式和从设备的状态)。常规流量是通过为 arp_ip_target 选项指定的地址发出的 ARP 探测生成的。

此行为可以通过下面的 arp_validate 选项修改。

如果在以太通道兼容模式(模式 0 和 2)中使用 ARP 监控,则应将交换机配置为以均匀的方式跨所有链路分配数据包的模式。如果交换机配置为以 XOR 方式分配数据包,则来自 ARP 目标的所有回复将在同一链路上接收,这可能会导致其他组成员失败。ARP 监控不应与 miimon 结合使用。值为 0 会禁用 ARP 监控。默认值为 0。

arp_ip_target

当 arp_interval > 0 时,指定要用作 ARP 监控对等方的 IP 地址。这些是要发送的 ARP 请求的目标,用于确定到目标的链路的运行状况。以 ddd.ddd.ddd.ddd 格式指定这些值。多个 IP 地址必须用逗号分隔。必须至少给出一个 IP 地址才能使 ARP 监控正常工作。可以指定的最大目标数为 16。默认值为没有 IP 地址。

ns_ip6_target

当 arp_interval > 0 时,指定要用作 IPv6 监控对等方的 IPv6 地址。这些是要发送的 NS 请求的目标,用于确定到目标的链路的运行状况。以 ffff:ffff::ffff:ffff 格式指定这些值。多个 IPv6 地址必须用逗号分隔。必须至少给出一个 IPv6 地址才能使 NS/NA 监控正常工作。可以指定的最大目标数为 16。默认值为没有 IPv6 地址。

arp_validate

指定是否应在支持 arp 监控的任何模式下验证 ARP 探测和回复,或者是否应过滤(忽略)非 ARP 流量以进行链路监控。

可能的值是

none 或 0

不执行验证或过滤。

active 或 1

仅对活动从设备执行验证。

backup 或 2

仅对备份从设备执行验证。

all 或 3

对所有从设备执行验证。

filter 或 4

过滤应用于所有从设备。不执行验证。

filter_active 或 5

过滤应用于所有从设备,验证仅对活动从设备执行。

filter_backup 或 6

过滤应用于所有从设备,验证仅对备份从设备执行。

验证

启用验证会导致 ARP 监控检查传入的 ARP 请求和回复,并且仅当从设备接收到相应的 ARP 流量时才认为从设备处于 up 状态。

对于活动从设备,验证会检查 ARP 回复以确认它们是由 arp_ip_target 生成的。由于备份从设备通常不会接收这些回复,因此对备份从设备执行的验证是在通过活动从设备发送的广播 ARP 请求上进行的。某些交换机或网络配置可能会导致备份从设备未收到 ARP 请求的情况;在这种情况下,必须禁用备份从设备的验证。

备份从设备上 ARP 请求的验证主要帮助绑定确定哪些从设备在活动从设备发生故障时更有可能工作,它实际上并不能保证备份从设备在被选为下一个活动从设备时会工作。

验证在多个绑定主机同时向公共交换机之外的一个或多个目标发出 ARP 的网络配置中很有用。如果交换机和目标之间的链路发生故障(但交换机本身没有发生故障),则多个绑定实例生成的探测流量将欺骗标准 ARP 监控认为链路仍然处于 up 状态。使用验证可以解决此问题,因为 ARP 监控只会考虑与其自身绑定实例关联的 ARP 请求和回复。

过滤

启用过滤会导致 ARP 监控仅使用传入的 ARP 数据包来确定链路可用性。到达的不是 ARP 的数据包将正常传递,但在确定从设备是否可用时不计数。

过滤的工作原理是仅考虑接收 ARP 数据包(任何 ARP 数据包,无论源或目标如何)来确定从设备是否已接收到流量以用于链路可用性目的。

过滤在大量第三方广播流量会欺骗标准 ARP 监控认为链路仍然处于 up 状态的网络配置中很有用。使用过滤可以解决此问题,因为仅考虑 ARP 流量用于链路可用性目的。

此选项已添加到绑定版本 3.1.0 中。

arp_all_targets

指定为了使 ARP 监控认为从设备处于 up 状态,必须可访问的 arp_ip_targets 的数量。此选项仅影响启用 arp_validation 的从设备的 active-backup 模式。

可能的值是

any 或 0

仅当任何 arp_ip_targets 可访问时才认为从设备处于 up 状态

all 或 1

仅当所有 arp_ip_targets 都可访问时才认为从设备处于 up 状态

arp_missed_max

指定为了使接口被 ARP 监控标记为 down 状态,必须失败的 arp_interval 监控检查的数量。

为了提供有序的故障转移语义,允许备份接口进行额外的监控检查(即,在被标记为 down 状态之前,它们必须失败 arp_missed_max + 1 次)。

默认值为 2,允许的范围为 1 - 255。

coupled_control

指定 LACP 状态机的 MUX 在 802.3ad 模式下是否应具有单独的收集和分发状态。

这是通过除了现有的耦合控制状态机之外,还根据 IEEE 802.1AX-2008 5.4.15 实现独立的控制状态机来实现的。

默认值为 1。此设置不分离收集和分发状态,从而将绑定保持在耦合控制状态。

downdelay

指定检测到链路故障后等待禁用从设备的时间(以毫秒为单位)。此选项仅对 miimon 链路监控有效。downdelay 值应为 miimon 值的倍数;如果不是,它将被向下舍入到最接近的倍数。默认值为 0。

fail_over_mac

指定 active-backup 模式是否应在从属时将所有从设备设置为相同的 MAC 地址(传统行为),或者,在启用时,根据所选策略执行对绑定 MAC 地址的特殊处理。

可能的值是

none 或 0

none 或 0

active 或 1

“active”fail_over_mac 策略指示绑定的 MAC 地址应始终是当前活动从设备的 MAC 地址。从设备的 MAC 地址不会更改;相反,绑定的 MAC 地址在故障转移期间会更改。

此策略对于永远无法更改其 MAC 地址的设备,或者对于拒绝传入具有其自身源 MAC 的广播(这会干扰 ARP 监控)的设备很有用。

此策略的缺点是,网络上的每个设备都必须通过 gratuitous ARP 进行更新,而不是仅更新交换机或一组交换机(如果交换机通过侦听传入流量来更新其表,则通常对任何流量(而不仅仅是 ARP 流量)进行此操作),从而采用传统方法。如果 gratuitous ARP 丢失,则通信可能会中断。

当此策略与 mii 监控器结合使用时,在能够实际发送和接收之前声明链路 up 状态的设备特别容易丢失 gratuitous ARP,并且可能需要适当的 updelay 设置。

follow 或 2

“follow”fail_over_mac 策略会导致正常选择绑定的 MAC 地址(通常是添加到绑定的第一个从设备的 MAC 地址)。但是,当从设备处于备份角色时,不会将第二个和后续从设备设置为此 MAC 地址;从设备在故障转移时(以及以前活动的从设备接收新活动从设备的 MAC 地址)使用绑定的 MAC 地址进行编程。

此策略对于多端口设备很有用,这些设备在多个端口使用相同的 MAC 地址编程时会变得混乱或导致性能下降。

默认策略为 none,除非第一个从设备无法更改其 MAC 地址,在这种情况下,默认情况下会选择 active 策略。

仅当绑定中不存在从设备时,才能通过 sysfs 修改此选项。

此选项已添加到绑定版本 3.2.0 中。“follow”策略已添加到绑定版本 3.3.0 中。

lacp_active

指定是否定期发送 LACPDU 帧的选项。

off 或 0

LACPDU 帧充当“在被告知时说话”。

on 或 1

LACPDU 帧定期沿配置的链路发送。有关更多详细信息,请参见 lacp_rate。

默认值为 on。

lacp_rate

指定我们要求链路合作伙伴以 802.3ad 模式传输 LACPDU 数据包的速率的选项。可能的值是

slow 或 0

请求合作伙伴每 30 秒传输一次 LACPDUs

fast 或 1

请求合作伙伴每 1 秒传输一次 LACPDUs

默认值为 slow。

max_bonds

指定为此绑定驱动程序实例创建的绑定设备数。例如,如果 max_bonds 为 3,并且尚未加载绑定驱动程序,则将创建 bond0、bond1 和 bond2。默认值为 1。指定值 0 将加载绑定,但不会创建任何设备。

miimon

指定 MII 链路监控频率(以毫秒为单位)。这确定了检查每个从设备的链路状态以查找链路故障的频率。值为零会禁用 MII 链路监控。值 100 是一个好的起点。下面的 use_carrier 选项会影响链路状态的确定方式。有关更多信息,请参见高可用性部分。如果未设置 arp_interval,则默认值为 100。

min_links

指定在声明载波之前必须处于活动状态的最小链路数。它类似于 Cisco EtherChannel min-links 功能。这允许设置必须处于 up 状态(链路 up 状态)的最小成员端口数,然后才能将绑定设备标记为 up 状态(载波 on)。这对于更高级别的服务(如群集)希望确保在切换之前至少有最低数量的低带宽链路处于活动状态的情况很有用。此选项仅影响 802.3ad 模式。

默认值为 0。这将导致在存在活动聚合器时(对于 802.3ad 模式)声明载波,而不管该聚合器中可用链路的数量如何。请注意,由于聚合器在没有至少一条可用链路的情况下无法处于活动状态,因此将此选项设置为 0 或 1 具有完全相同的效果。

mode

指定绑定策略之一。默认值为 balance-rr(循环)。可能的值是

balance-rr 或 0

循环策略:按顺序从第一个可用从设备到最后一个可用从设备传输数据包。此模式提供负载平衡和容错。

active-backup 或 1

活动-备份策略:绑定中只有一个从设备处于活动状态。只有在活动从设备发生故障时,另一个从设备才会变为活动状态。绑定的 MAC 地址仅在一个端口(网络适配器)上外部可见,以避免混淆交换机。

在绑定版本 2.6.2 或更高版本中,当在 active-backup 模式下发生故障转移时,绑定将在新活动的从设备上发出一个或多个 gratuitous ARP。为绑定主接口和配置在其上的每个 VLAN 接口发出一个 gratuitous ARP,前提是该接口配置了至少一个 IP 地址。为 VLAN 接口发出的 Gratuitous ARP 带有适当的 VLAN id 标记。

此模式提供容错。下面记录的 primary 选项会影响此模式的行为。

balance-xor 或 2

XOR 策略:基于所选的传输哈希策略进行传输。默认策略是一个简单的 [(源 MAC 地址 XOR 目标 MAC 地址 XOR 数据包类型 ID) 模从设备计数]。可以通过下面描述的 xmit_hash_policy 选项选择备用传输策略。

此模式提供负载平衡和容错。

broadcast 或 3

广播策略:在所有从属接口上传输所有内容。此模式提供容错。

802.3ad 或 4

IEEE 802.3ad 动态链路聚合。创建共享相同速度和双工设置的聚合组。根据 802.3ad 规范利用活动聚合器中的所有从设备。

传出流量的从设备选择是根据传输哈希策略完成的,可以通过下面记录的 xmit_hash_policy 选项从默认的简单 XOR 策略进行更改。请注意,并非所有传输策略都符合 802.3ad,尤其是在 802.3ad 标准的 43.2.4 节中关于数据包错误排序要求方面。不同的对等实现对不合规性的容忍度各不相同。

先决条件

1. 用于检索每个从设备的速度和双工的基本驱动程序中的 Ethtool 支持。

2. 支持 IEEE 802.3ad 动态链路聚合的交换机。

大多数交换机都需要某种类型的配置才能启用 802.3ad 模式。

balance-tlb 或 5

自适应传输负载平衡:不需要任何特殊交换机支持的通道绑定。

在 tlb_dynamic_lb=1 模式下;传出流量根据每个从设备上的当前负载(相对于速度计算)进行分配。

在 tlb_dynamic_lb=0 模式下;基于当前负载的负载平衡被禁用,负载仅使用哈希分布进行分配。

传入流量由当前从设备接收。如果接收从设备发生故障,则另一个从设备会接管发生故障的接收从设备的 MAC 地址。

先决条件

基本驱动程序中的 Ethtool 支持,用于检索每个从设备的速度。

balance-alb 或 6

自适应负载平衡:包括 balance-tlb 加上用于 IPV4 流量的接收负载平衡 (rlb),并且不需要任何特殊交换机支持。接收负载平衡是通过 ARP 协商实现的。绑定驱动程序会拦截本地系统发出的 ARP 回复,并在其传输出去时使用绑定中其中一个从设备的唯一硬件地址覆盖源硬件地址,以便不同的对等方为服务器使用不同的硬件地址。

来自服务器创建的连接的接收流量也会进行平衡。当本地系统发送 ARP 请求时,绑定驱动程序会复制并保存 ARP 数据包中的对等方 IP 信息。当 ARP 回复从对等方到达时,将检索其硬件地址,并且绑定驱动程序会启动对该对等方的 ARP 回复,将其分配给绑定中的其中一个从设备。使用 ARP 协商进行平衡的一个有问题的结果是,每次广播 ARP 请求时,它都会使用绑定的硬件地址。因此,对等方会学习绑定的硬件地址,并且接收流量的平衡会崩溃到当前从设备。这可以通过向所有对等方发送更新(ARP 回复)以及它们各自分配的硬件地址来处理,以便重新分配流量。当向绑定添加新的从设备以及重新激活非活动从设备时,也会重新分配接收流量。接收负载在绑定中速度最高的从设备组中按顺序(循环)分配。

当链路重新连接或新的从设备加入绑定时,通过启动带有选定 MAC 地址的 ARP 回复给每个客户端,从而在绑定中的所有活动从设备之间重新分配接收流量。updelay 参数(下面详细介绍)必须设置为等于或大于交换机的转发延迟的值,以便发送给对等方的 ARP 回复不会被交换机阻止。

先决条件

1. 基本驱动程序中的 Ethtool 支持,用于检索每个从设备的速度。

2. 基本驱动程序支持在设备打开时设置设备的硬件地址。这是必需的,以便始终有一个团队中的从设备使用绑定硬件地址(curr_active_slave),同时为绑定中的每个从设备提供唯一的硬件地址。如果 curr_active_slave 发生故障,其硬件地址将与选择的新 curr_active_slave 交换。

num_grat_arp, num_unsol_na

指定在故障转移事件后要发出的对等方通知(gratuitous ARP 和 unsolicited IPv6 Neighbor Advertisements)的数量。一旦新从设备上的链路启动(可能立即),就会在绑定设备和每个 VLAN 子设备上发送对等方通知。如果数字大于 1,则以 peer_notif_delay 指定的速率重复此操作。

有效范围为 0 - 255;默认值为 1。这些选项仅影响 active-backup 模式。这些选项分别针对绑定版本 3.3.0 和 3.4.0 添加。

从 Linux 3.0 和绑定版本 3.7.1 开始,这些通知由 ipv4 和 ipv6 代码生成,并且重复次数无法独立设置。

packets_per_slave

指定在移动到下一个从设备之前要通过从设备传输的数据包数。设置为 0 时,将随机选择一个从设备。

有效范围为 0 - 65535;默认值为 1。此选项仅在 balance-rr 模式下有效。

peer_notif_delay

指定在故障转移事件后发出每个对等方通知(gratuitous ARP 和 unsolicited IPv6 Neighbor Advertisements)之间的延迟(以毫秒为单位)。此延迟应为 MII 链路监控间隔 (miimon) 的倍数。

有效范围为 0 - 300000。默认值为 0,这意味着与 MII 链路监控间隔的值匹配。

prio

从设备优先级。数字越大表示优先级越高。主从设备具有最高优先级。此选项也遵循 primary_reselect 规则。

此选项只能通过 netlink 进行配置,并且仅对 active-backup(1)、balance-tlb (5) 和 balance-alb (6) 模式有效。有效值范围是有符号的 32 位整数。

默认值为 0。

primary

一个字符串(eth0、eth2 等),指定哪个从设备是主设备。指定的设备只要可用,就将始终是活动从设备。只有当主设备脱机时才会使用备用设备。当一个从设备优于另一个从设备时,这很有用,例如,当一个从设备比另一个从设备具有更高的吞吐量时。

primary 选项仅对 active-backup(1)、balance-tlb (5) 和 balance-alb (6) 模式有效。

primary_reselect

指定主从设备的重新选择策略。这会影响在活动从设备发生故障或主从设备恢复时如何选择主从设备成为活动从设备。此选项旨在防止主从设备和其他从设备之间出现来回切换。可能的值是

always 或 0(默认)

主从设备在恢复联机时成为活动从设备。

better 或 1

如果主从设备的速度和双工优于当前活动从设备的速度和双工,则主从设备在恢复联机时成为活动从设备。

failure 或 2

仅当当前活动从设备发生故障且主从设备处于联机状态时,主从设备才会成为活动从设备。

在以下两种情况下,primary_reselect 设置将被忽略

如果没有从设备处于活动状态,则第一个恢复的从设备将成为活动从设备。

最初从属时,主从设备始终成为活动从设备。

通过 sysfs 更改 primary_reselect 策略将导致根据新策略立即选择最佳活动从设备。根据情况,这可能会或可能不会导致活动从设备的更改。

此选项已添加到绑定版本 3.6.0 中。

tlb_dynamic_lb

指定是否在 tlb 或 alb 模式下启用流的动态混排。该值对任何其他模式均无效。

tlb 模式的默认行为是在该间隔内基于负载在从设备之间混排活动流。这提供了良好的 lb 特性,但可能会导致数据包重新排序。如果重新排序是一个问题,请使用此变量来禁用流混排,并且仅依赖于哈希分布提供的负载平衡。xmit-hash-policy 可用于选择设置的适当哈希。

sysfs 条目可用于更改每个绑定设备的设置,初始值来自模块参数。仅当绑定设备处于关闭状态时,才允许更改 sysfs 条目。

默认值为“1”,表示启用流混排,而值“0”表示禁用它。此选项已添加到绑定驱动程序 3.7.1 中

updelay

指定检测到链路恢复后等待启用从设备的时间(以毫秒为单位)。此选项仅对 miimon 链路监控有效。updelay 值应为 miimon 值的倍数;如果不是,它将被向下舍入到最接近的倍数。默认值为 0。

use_carrier

指定 miimon 是否应使用 MII 或 ETHTOOL ioctl 与 netif_carrier_ok() 来确定链路状态。MII 或 ETHTOOL ioctl 效率较低,并且在内核中使用了已弃用的调用序列。netif_carrier_ok() 依赖于设备驱动程序来使用 netif_carrier_on/off 维护其状态;在撰写本文时,大多数(但并非全部)设备驱动程序都支持此功能。

如果 bonding 坚持链路处于活动状态,但实际上不应该如此,那么可能是您的网络设备驱动程序不支持 netif_carrier_on/off。netif_carrier 的默认状态是“carrier on”,因此如果驱动程序不支持 netif_carrier,则链路将始终显示为活动状态。在这种情况下,将 use_carrier 设置为 0 将导致 bonding 恢复为使用 MII / ETHTOOL ioctl 方法来确定链路状态。

值为 1 表示启用 netif_carrier_ok() 的使用,值为 0 将使用已弃用的 MII / ETHTOOL ioctl。默认值为 1。

xmit_hash_policy

选择用于 balance-xor、802.3ad 和 tlb 模式下从设备选择的传输哈希策略。可能的值包括

layer2

使用硬件 MAC 地址和数据包类型 ID 字段的异或来生成哈希。公式为

hash = 源 MAC[5] XOR 目标 MAC[5] XOR 数据包类型 ID slave number = hash 模从设备计数

此算法会将所有到特定网络对等方的流量放在同一从设备上。

此算法符合 802.3ad 标准。

layer2+3

此策略使用 layer2 和 layer3 协议信息的组合来生成哈希。

使用硬件 MAC 地址和 IP 地址的异或来生成哈希。公式为

hash = 源 MAC[5] XOR 目标 MAC[5] XOR 数据包类型 ID hash = hash XOR 源 IP XOR 目标 IP hash = hash XOR (hash RSHIFT 16) hash = hash XOR (hash RSHIFT 8) 然后将哈希值对从设备计数进行模运算。

如果协议是 IPv6,则首先使用 ipv6_addr_hash 对源地址和目标地址进行哈希处理。

此算法会将所有到特定网络对等方的流量放在同一从设备上。对于非 IP 流量,该公式与 layer2 传输哈希策略的公式相同。

此策略旨在提供比单独 layer2 更平衡的流量分配,尤其是在需要 layer3 网关设备才能到达大多数目标的环境中。

此算法符合 802.3ad 标准。

layer3+4

此策略在可用时使用上层协议信息来生成哈希。这允许到特定网络对等方的流量跨越多个从设备,但单个连接不会跨越多个从设备。

未分片的 TCP 和 UDP 数据包的公式为

hash = 源端口,目标端口(如标头中所示) hash = hash XOR 源 IP XOR 目标 IP hash = hash XOR (hash RSHIFT 16) hash = hash XOR (hash RSHIFT 8) hash = hash RSHIFT 1 然后将哈希值对从设备计数进行模运算。

如果协议是 IPv6,则首先使用 ipv6_addr_hash 对源地址和目标地址进行哈希处理。

对于分片的 TCP 或 UDP 数据包以及所有其他 IPv4 和 IPv6 协议流量,将省略源端口和目标端口信息。对于非 IP 流量,该公式与 layer2 传输哈希策略的公式相同。

此算法不完全符合 802.3ad 标准。包含分片和未分片数据包的单个 TCP 或 UDP 会话将看到数据包跨越两个接口条带化。这可能会导致乱序交付。大多数流量类型都不会满足此标准,因为 TCP 很少分片流量,并且大多数 UDP 流量不涉及扩展会话。802.3ad 的其他实现可能会或可能不会容忍此不合规行为。

encap2+3

此策略使用与 layer2+3 相同的公式,但它依赖于 skb_flow_dissect 来获取标头字段,如果使用封装协议,这可能会导致内部标头的使用。例如,这将提高隧道用户的性能,因为数据包将根据封装的流进行分配。

encap3+4

此策略使用与 layer3+4 相同的公式,但它依赖于 skb_flow_dissect 来获取标头字段,如果使用封装协议,这可能会导致内部标头的使用。例如,这将提高隧道用户的性能,因为数据包将根据封装的流进行分配。

vlan+srcmac

此策略使用非常基本的 vlan ID 和源 mac 哈希来按 vlan 平衡流量,并在一条链路发生故障时进行故障转移。预期的用例是多个虚拟机共享的绑定,所有虚拟机都配置为使用自己的 vlan,以提供类似 lacp 的功能,而无需支持 lacp 的交换硬件。

哈希公式很简单

hash = (vlan ID) XOR (源 MAC 供应商) XOR (源 MAC dev)

默认值为 layer2。此选项在 bonding 版本 2.6.3 中添加。在 bonding 的早期版本中,此参数不存在,并且 layer2 策略是唯一的策略。layer2+3 值是为 bonding 版本 3.2.2 添加的。

resend_igmp

指定在故障转移事件后要发出的 IGMP 成员资格报告的数量。在故障转移后立即发出一个成员资格报告,后续数据包以每 200 毫秒的间隔发送。

有效范围是 0 - 255;默认值为 1。值为 0 可防止 IGMP 成员资格报告响应故障转移事件而发出。

此选项对于 bonding 模式 balance-rr (0)、active-backup (1)、balance-tlb (5) 和 balance-alb (6) 很有用,在这些模式中,故障转移可以将 IGMP 流量从一个从设备切换到另一个从设备。因此,必须发出新的 IGMP 报告,以使交换机通过新选择的从设备转发传入的 IGMP 流量。

此选项是为 bonding 版本 3.7.0 添加的。

lp_interval

指定 bonding 驱动程序向每个从设备的对等交换机发送学习数据包的实例之间的时间间隔(秒)。

有效范围是 1 - 0x7fffffff;默认值为 1。此选项仅在 balance-tlb 和 balance-alb 模式下有效。

3. 配置 Bonding 设备

您可以使用发行版的网络初始化脚本配置 bonding,也可以使用 iproute2 或 sysfs 接口手动配置。发行版通常使用以下三个包之一来创建网络初始化脚本:initscripts、sysconfig 或 interfaces。这些包的最新版本支持 bonding,而旧版本不支持。

我们将首先描述使用完整或部分支持 bonding 的 initscripts、sysconfig 和 interfaces 版本的发行版的 bonding 配置选项,然后提供有关在没有网络初始化脚本支持的情况下启用 bonding 的信息(即,initscripts 或 sysconfig 的旧版本)。

如果您不确定您的发行版使用的是 sysconfig、initscripts 还是 interfaces,或者不知道它是否足够新,请不要担心。确定这一点非常简单。

首先,在 /etc/network 目录中查找名为 interfaces 的文件。如果您的系统中存在此文件,则您的系统使用 interfaces。请参阅使用 Interfaces 支持进行配置。

否则,请发出命令

$ rpm -qf /sbin/ifup

它将响应以“initscripts”或“sysconfig”开头的文本行,后跟一些数字。这是提供您的网络初始化脚本的包。

接下来,要确定您的安装是否支持 bonding,请发出命令

$ grep ifenslave /sbin/ifup

如果这返回任何匹配项,则您的 initscripts 或 sysconfig 支持 bonding。

3.1 使用 Sysconfig 支持进行配置

本节适用于使用带有 bonding 支持的 sysconfig 版本的发行版,例如,SuSE Linux Enterprise Server 9。

SuSE SLES 9 的网络配置系统确实支持 bonding,但是,在撰写本文时,YaST 系统配置前端不提供任何使用 bonding 设备的方法。但是,可以手动管理 bonding 设备,如下所示。

首先,如果尚未配置从设备,请配置它们。在 SLES 9 上,最简单的方法是运行 yast2 sysconfig 配置实用程序。目标是为每个从设备创建一个 ifcfg-id 文件。完成此操作的最简单方法是将设备配置为 DHCP(这只是为了创建 ifcfg-id 文件;有关 DHCP 的一些问题,请参见下文)。每个设备的配置文件名将采用以下形式

ifcfg-id-xx:xx:xx:xx:xx:xx

其中“xx”部分将被设备的永久 MAC 地址中的数字替换。

创建 ifcfg-id-xx:xx:xx:xx:xx:xx 文件集后,有必要编辑从设备的配置文件(MAC 地址对应于从设备的 MAC 地址)。在编辑之前,该文件将包含多行,并且看起来像这样

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 设备。

hotplug

设备由热插拔事件启动。对于 bonding 设备,这不是一个有效的选择。

off 或

设备配置将被忽略。

ignore

BONDING_MASTER=’yes’ 行表示该设备是 bonding 主设备。唯一有用的值是“yes”。

BONDING_MODULE_OPTS 的内容提供给此设备的 bonding 模块实例。在此处指定 bonding 模式、链路监视等的选项。不要包含 max_bonds bonding 参数;如果您有多个 bonding 设备,这将使配置系统感到困惑。

最后,为每个从设备提供一个 BONDING_SLAVEn=”从设备”。其中“n”是一个递增的值,每个从设备一个。“从设备”可以是接口名称,例如“eth0”,也可以是网络设备的设备说明符。接口名称更容易找到,但如果例如序列中的早期设备失败,则 ethN 名称可能会在启动时更改。设备说明符(示例中的 bus-pci-0000:06:08.1)指定物理网络设备,并且不会更改,除非设备的总线位置更改(例如,它从一个 PCI 插槽移动到另一个 PCI 插槽)。上面的示例出于演示目的使用了每种类型中的一种;大多数配置将为所有从设备选择一种或另一种。

修改或创建所有配置文件后,必须重新启动网络才能使配置更改生效。这可以通过以下方式完成

# /etc/init.d/network restart

请注意,网络控制脚本 (/sbin/ifdown) 将删除 bonding 模块作为网络关闭处理的一部分,因此如果例如模块参数已更改,则无需手动删除模块。

此外,在撰写本文时,YaST/YaST2 将不管理 bonding 设备(它们不会在其网络设备列表中显示 bonding 接口)。必须手动编辑配置文件以更改 bonding 配置。

有关 ifcfg 文件格式的其他常规选项和详细信息,请参见示例 ifcfg 模板文件

/etc/sysconfig/network/ifcfg.template

请注意,该模板没有记录上面描述的各种 BONDING_* 设置,但确实描述了许多其他选项。

3.1.1 将 DHCP 与 Sysconfig 结合使用

在 sysconfig 下,使用 BOOTPROTO=’dhcp’ 配置设备将导致它查询 DHCP 以获取其 IP 地址信息。在撰写本文时,这对于 bonding 设备不起作用;这些脚本尝试在添加任何从设备之前从 DHCP 获取设备地址。如果没有活动的从设备,则不会将 DHCP 请求发送到网络。

3.1.2 使用 Sysconfig 配置多个 Bonding

sysconfig 网络初始化系统能够处理多个 bonding 设备。所有需要做的就是每个 bonding 实例都有一个适当配置的 ifcfg-bondX 文件(如上所述)。不要为 bonding 的任何实例指定“max_bonds”参数,因为这会使 sysconfig 感到困惑。如果您需要具有相同参数的多个 bonding 设备,请创建多个 ifcfg-bondX 文件。

由于 sysconfig 脚本在 ifcfg-bondX 文件中提供 bonding 模块选项,因此无需将它们添加到系统 /etc/modules.d/*.conf 配置文件中。

3.2 使用 Initscripts 支持进行配置

本节适用于使用带有 bonding 支持的 initscripts 最新版本的发行版,例如,Red Hat Enterprise Linux 版本 3 或更高版本、Fedora 等。在这些系统上,网络初始化脚本了解 bonding,并且可以配置为控制 bonding 设备。请注意,initscripts 包的旧版本对 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,依此类推。

接下来,创建一个 bonding 网络脚本。此脚本的文件名将是 /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)以匹配您的网络配置。

对于 initscripts 的更高版本,例如 Fedora 7(或更高版本)和 Red Hat Enterprise Linux 版本 5(或更高版本)中找到的版本,可以在 ifcfg-bond0 文件中指定 bonding 选项,例如,格式为

BONDING_OPTS="mode=active-backup arp_interval=60 arp_ip_target=192.168.1.254"

的行将使用指定的选项配置 bond。BONDING_OPTS 中指定的选项与 bonding 模块参数相同,除了在使用低于 8.57 (Fedora 8) 和 8.45.19 (Red Hat Enterprise Linux 5.2) 的 initscripts 版本时,arp_ip_target 字段除外。使用旧版本时,每个目标都应作为单独的选项包含,并且应以“+”开头,以指示应将其添加到查询目标列表中,例如,

arp_ip_target=+192.168.1.1 arp_ip_target=+192.168.1.2

是指定多个目标的正确语法。通过 BONDING_OPTS 指定选项时,无需编辑 /etc/modprobe.d/*.conf

对于不支持 BONDING_OPTS 的更旧版本的 initscripts,有必要编辑 /etc/modprobe.d/*.conf(取决于您的发行版)以在启动 bond0 接口时加载具有所需选项的 bonding 模块。/etc/modprobe.d/*.conf 中的以下行将加载 bonding 模块,并选择其选项

alias bond0 bonding options bond0 mode=balance-alb miimon=100

将示例参数替换为适合您配置的选项集。

最后以 root 身份运行“/etc/rc.d/init.d/network restart”。这将重新启动网络子系统,并且您的 bond 链路现在应该已启动并运行。

3.2.1 将 DHCP 与 Initscripts 结合使用

Initscripts 的最新版本(Fedora Core 3 和 Red Hat Enterprise Linux 4 或更高版本提供的版本据报告有效)支持通过 DHCP 将 IP 信息分配给 bonding 设备。

要配置 DHCP 的 bonding,请如上所述配置它,除了将行“BOOTPROTO=none”替换为“BOOTPROTO=dhcp”并添加由“TYPE=Bonding”组成的行。请注意,TYPE 值区分大小写。

3.2.2 使用 Initscripts 配置多个 Bonding

Fedora 7 和 Red Hat Enterprise Linux 5 中包含的 Initscripts 包支持多个 bonding 接口,只需在 ifcfg-bondX 中指定适当的 BONDING_OPTS=,其中 X 是 bond 的编号。此支持需要在内核中支持 sysfs,以及 bonding 驱动程序 3.0.0 或更高版本。其他配置可能不支持此方法来指定多个 bonding 接口;对于这些实例,请参见下面的“手动配置多个 Bonds”部分。

3.3 使用 iproute2 手动配置 Bonding

本节适用于其网络初始化脚本(sysconfig 或 initscripts 包)不具有 bonding 特定知识的发行版。一个这样的发行版是 SuSE Linux Enterprise Server 版本 8。

对于这些系统,通用方法是将 bonding 模块参数放入 /etc/modprobe.d/ 中的配置文件中(如安装的发行版适当),然后将 modprobe 和/或 ip link 命令添加到系统的全局 init 脚本中。全局 init 脚本的名称不同;对于 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
ip link set eth0 master bond0
ip link set eth1 master bond0

将示例 bonding 模块参数和 bond0 网络配置(IP 地址、网络掩码等)替换为适合您配置的值。

不幸的是,此方法将不提供对 bond 设备上 ifup 和 ifdown 脚本的支持。要重新加载 bonding 配置,需要运行初始化脚本,例如,

# /etc/init.d/boot.local

# /etc/rc.d/rc.local

在这种情况下,可能需要创建一个单独的脚本,该脚本仅初始化 bonding 配置,然后从 boot.local 中调用该单独的脚本。这允许启用 bonding,而无需重新运行整个全局 init 脚本。

要关闭 bonding 设备,首先需要将 bonding 设备本身标记为关闭,然后删除适当的设备驱动程序模块。对于上面的示例,您可以执行以下操作

# ifconfig bond0 down
# rmmod bonding
# rmmod e100

同样,为了方便起见,可能需要创建一个包含这些命令的脚本。

3.3.1 手动配置多个 Bonds

本节包含有关为那些网络初始化脚本不支持配置多个 bonds 的系统配置具有不同选项的多个 bonding 设备的信息。

如果您需要多个 bonding 设备,但所有设备都具有相同的选项,则您可能希望使用上面记录的“max_bonds”模块参数。

要创建具有不同选项的多个 bonding 设备,最好使用 sysfs 导出的 bonding 参数,如下面的部分中所述。

对于没有 sysfs 支持的 bonding 版本,提供具有不同选项的 bonding 多个实例的唯一方法是多次加载 bonding 驱动程序。请注意,sysconfig 网络初始化脚本的当前版本会自动处理此问题;如果您的发行版使用这些脚本,则无需采取特殊操作。如果您不确定您的网络初始化脚本,请参见上面的配置 Bonding 设备部分。

要加载模块的多个实例,需要为每个实例指定不同的名称(模块加载系统要求每个加载的模块,即使是同一模块的多个实例,也具有唯一的名称)。这可以通过在 /etc/modprobe.d/*.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 模式创建一个 miimon 为 100 的 bond0 设备。第二个实例命名为“bond1”,并以 balance-alb 模式创建一个 miimon 为 50 的 bond1 设备。

在某些情况下(通常使用较旧的发行版),上述操作不起作用,并且第二个 bonding 实例永远看不到其选项。在这种情况下,可以按如下方式替换第二个选项行

install bond1 /sbin/modprobe --ignore-install bonding -o bond1 \
                             mode=balance-alb miimon=50

对于每个后续实例,可以在 bond1 的位置重复多次指定一个新的唯一名称。

已经观察到,某些 Red Hat 提供的内核无法在加载时重命名模块(“-o bond1”部分)。尝试将该选项传递给 modprobe 将产生“不允许操作”错误。这已在某些 Fedora Core 内核上报告,并且已在 RHEL 4 上看到。在出现此问题的内核上,将无法配置具有不同参数的多个 bonds(因为它们是较旧的内核,并且也缺少 sysfs 支持)。

3.4 通过 Sysfs 手动配置 Bonding

从版本 3.0.0 开始,可以通过 sysfs 接口配置通道 Bonding。此接口允许动态配置系统中的所有 bonds,而无需卸载模块。它还允许在运行时添加和删除 bonds。不再需要 ifenslave,但仍然支持它。

使用 sysfs 接口允许您使用具有不同配置的多个 bonds,而无需重新加载模块。它还允许您在使用编译到内核中的 bonding 时使用多个配置不同的 bonds。

您必须安装 sysfs 文件系统才能以这种方式配置 bonding。本文档中的示例假定您使用的是 sysfs 的标准挂载点,例如 /sys。如果您的 sysfs 文件系统挂载在其他位置,则需要相应地调整示例路径。

创建和销毁 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 中释放 slave eth0

# echo -eth0 > /sys/class/net/bond0/bonding/slaves

当接口绑定到 bond 时,将在 sysfs 文件系统中创建两者之间的符号链接。在这种情况下,您将获得 /sys/class/net/bond0/slave_eth0 指向 /sys/class/net/eth0,而 /sys/class/net/eth0/master 指向 /sys/class/net/bond0。

这意味着您可以通过查找主符号链接来快速判断接口是否已绑定。因此:# echo -eth0 > /sys/class/net/eth0/master/bonding/slaves 将从其绑定的任何 bond 中释放 eth0,而不管 bond 接口的名称如何。

更改 Bond 的配置

可以通过操作位于 /sys/class/net/<bond name>/bonding 中的文件来单独配置每个 bond

这些文件的名称与本文档中其他地方描述的命令行参数直接对应,并且除了 arp_ip_target 之外,它们接受相同的值。要查看当前设置,只需 cat 适当的文件即可。

此处将给出一些示例;有关每个参数的特定使用指南,请参见本文档中的相应部分。

要将 bond0 配置为 balance-alb 模式

# ifconfig bond0 down
# echo 6 > /sys/class/net/bond0/bonding/mode
- or -
# 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

注意

最多可以指定 16 个目标地址。

要删除 ARP 目标

# echo -192.168.0.100 > /sys/class/net/bond0/bonding/arp_ip_target

要配置学习数据包传输之间的间隔

# echo 12 > /sys/class/net/bond0/bonding/lp_interval

注意

lp_interval 是 bonding 驱动程序向每个从设备的对等交换机发送学习数据包的实例之间的时间间隔(秒)。默认间隔为 1 秒。

示例配置

我们从 3.3 节中显示的相同示例开始,使用 sysfs 执行,而不使用 ifenslave。

要创建一个由两个 e100 设备(假定为 eth0 和 eth1)组成的简单 bond,并使其在重新启动后保持不变,请编辑适当的文件(/etc/init.d/boot.local 或 /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 监视,请将以下行添加到您的 init 脚本中

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

3.5 使用 Interfaces 支持进行配置

本节适用于使用 /etc/network/interfaces 文件描述网络接口配置的发行版,最显着的是 Debian 及其衍生产品。

Debian 上的 ifup 和 ifdown 命令不支持开箱即用的 bonding。应安装 ifenslave-2.6 包以提供 bonding 支持。安装后,此包将提供 bond-* 选项以用于 /etc/network/interfaces 中。

请注意,ifenslave-2.6 包将在适当时加载 bonding 模块并使用 ifenslave 命令。

示例配置

在 /etc/network/interfaces 中,以下节将以 active-backup 模式配置 bond0,其中 eth0 和 eth1 作为 slaves

auto bond0
iface bond0 inet dhcp
        bond-slaves eth0 eth1
        bond-mode active-backup
        bond-miimon 100
        bond-primary eth0 eth1

如果上述配置不起作用,您可能有一个系统使用 upstart 进行系统启动。对于最新的 Ubuntu 版本,这一点尤其正确。/etc/network/interfaces 中的以下节将在这些系统上产生相同的结果

auto bond0
iface bond0 inet dhcp
        bond-slaves none
        bond-mode active-backup
        bond-miimon 100

auto eth0
iface eth0 inet manual
        bond-master bond0
        bond-primary eth0 eth1

auto eth1
iface eth1 inet manual
        bond-master bond0
        bond-primary eth0 eth1

有关 /etc/network/interfaces 中支持的 bond-* 选项的完整列表以及针对您的特定发行版的一些更高级的示例,请参见 /usr/share/doc/ifenslave-2.6 中的文件。

3.6 覆盖特殊情况的配置

使用 bonding 驱动程序时,传输帧的物理端口通常由 bonding 驱动程序选择,与用户或系统管理员无关。输出端口只是使用所选 bonding 模式的策略选择的。但是,有时有助于将某些类别的流量定向到某些物理接口上,以实施稍微更复杂的策略。例如,要通过连接到专用网络的绑定接口到达 Web 服务器,而 eth1 通过公共网络连接,则可能希望使绑定偏向首先通过 eth0 发送所述流量,仅将 eth1 用作后备,而所有其他流量都可以安全地通过任一接口发送。可以使用 linux 中固有的流量控制实用程序来实现此类配置。

默认情况下,bonding 驱动程序具有多队列感知能力,并且在驱动程序初始化时创建 16 个队列(有关详细信息,请参见 多队列网络设备支持 HOWTO)。如果需要更多或更少的队列,可以使用模块参数 tx_queues 来更改此值。没有可用的 sysfs 参数,因为分配是在模块初始化时完成的。

/proc/net/bonding/bondX 文件的输出已更改,因此现在为每个 slave 打印输出队列 ID

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth0
MII Status: up
MII Polling Interval (ms): 0
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth0
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:1a:a0:12:8f:cb
Slave queue ID: 0

Slave Interface: eth1
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:1a:a0:12:8f:cc
Slave queue ID: 2

可以使用命令设置 slave 的 queue_id

# echo "eth1:2" > /sys/class/net/bond0/bonding/queue_id

任何需要设置 queue_id 的接口都应使用多个像上面这样的调用来设置它,直到为所有接口设置了适当的优先级。在允许通过 initscripts 进行配置的发行版上,可以将多个“queue_id”参数添加到 BONDING_OPTS 以设置所有需要的 slave 队列。

这些队列 id 可以与 tc 实用程序结合使用,以配置多队列 qdisc 和过滤器,以使某些流量偏向在某些 slave 设备上传输。例如,假设我们希望在上述配置中强制所有绑定到 192.168.1.100 的流量使用 bond 中的 eth1 作为其输出设备。以下命令将完成此操作

# tc qdisc add dev bond0 handle 1 root multiq

# tc filter add dev bond0 protocol ip parent 1: prio 1 u32 match ip \
        dst 192.168.1.100 action skbedit queue_mapping 2

这些命令告诉内核将多队列队列规则附加到 bond0 接口并过滤排队到它的流量,以便具有 dst ip 为 192.168.1.100 的数据包将其输出队列映射值覆盖为 2。然后将此值传递到驱动程序中,导致覆盖正常的输出路径选择策略,而是选择映射到 eth1 的 qid 2。

请注意,qid 值从 1 开始。Qid 0 保留用于启动驱动程序,以便应进行正常的输出策略选择。简单地将 slave 的 qid 保留为 0 的一个好处是现在存在的 bonding 驱动程序中的多队列感知能力。此感知能力允许将 tc 过滤器放置在 slave 设备以及 bond 设备上,并且 bonding 驱动程序将仅充当选择 slave 设备上输出队列的直通,而不是输出端口选择。

此功能首次出现在 bonding 驱动程序 3.7.0 版本中,并且对输出 slave 选择的支持仅限于轮询和主动/备份模式。

3.7 以更安全的方式配置 802.3ad 模式的 LACP

使用 802.3ad bonding 模式时,Actor(主机)和 Partner(交换机)会交换 LACPDUs。这些 LACPDUs 无法被嗅探,因为它们的目标是链路本地 mac 地址(交换机/网桥不应转发)。但是,大多数值都很容易预测,或者只是机器的 MAC 地址(同一 L2 中的所有其他主机都知道)。这意味着 L2 域中的其他机器可以从其他主机欺骗 LACPDU 数据包到交换机,并可能通过(从交换机的角度来看)加入另一台机器的聚合来造成混乱,从而接收该主机的部分传入流量和/或欺骗来自该机器本身的流量(甚至可能成功终止部分流)。虽然这不太可能发生,但可以通过简单地配置几个 bonding 参数来避免这种可能性。

  1. ad_actor_system:您可以设置一个随机 mac 地址,用于这些 LACPDU 交换。该值不能为 NULL 或 Multicast。最好设置 local-admin 位。以下 shell 代码生成如上所述的随机 mac 地址

    # sys_mac_addr=$(printf '%02x:%02x:%02x:%02x:%02x:%02x' \
                             $(( (RANDOM & 0xFE) | 0x02 )) \
                             $(( RANDOM & 0xFF )) \
                             $(( RANDOM & 0xFF )) \
                             $(( RANDOM & 0xFF )) \
                             $(( RANDOM & 0xFF )) \
                             $(( RANDOM & 0xFF )))
    # echo $sys_mac_addr > /sys/class/net/bond0/bonding/ad_actor_system
    
  2. ad_actor_sys_prio:随机化系统优先级。默认值为 65535,但系统可以取值 1 - 65535。以下 shell 代码生成随机优先级并进行设置

    # sys_prio=$(( 1 + RANDOM + RANDOM ))
    # echo $sys_prio > /sys/class/net/bond0/bonding/ad_actor_sys_prio
    
  3. ad_user_port_key:使用端口密钥的用户部分。默认值保持为空。这些是端口密钥的上位 10 位,取值范围为 0 - 1023。以下 shell 代码生成这 10 位并进行设置

    # usr_port_key=$(( RANDOM & 0x3FF ))
    # echo $usr_port_key > /sys/class/net/bond0/bonding/ad_user_port_key
    

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 配置、状态和 bonding 驱动程序的版本而变化。

4.2 网络配置

可以使用 ifconfig 命令检查网络配置。Bonding 设备将设置 MASTER 标志;Bonding slave 设备将设置 SLAVE 标志。ifconfig 输出不包含有关哪些 slave 与哪些 master 相关联的信息。

在下面的示例中,bond0 接口是 master (MASTER),而 eth0 和 eth1 是 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. 交换机配置

对于本节,“交换机”是指 bonding 设备直接连接到的任何系统(即,电缆的另一端插入的位置)。这可以是实际的专用交换机设备,也可以是另一个常规系统(例如,运行 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”或其他类似的变体。对于这些模式,每个交换机还将具有其自己的用于交换机传输策略的配置选项。典型选择包括 MAC 或 IP 地址的 XOR。两个对等方的传输策略不需要匹配。对于这三种模式,bonding 模式实际上为 EtherChannel 组选择了一种传输策略;所有三种模式都将与另一个 EtherChannel 组互操作。

6. 802.1q VLAN 支持

可以使用 8021q 驱动程序在 bonding 接口上配置 VLAN 设备。但是,默认情况下,只有来自 8021q 驱动程序并通过 bonding 的数据包才会被标记。自生成的数据包,例如 bonding 的学习数据包或由 ALB 模式或 ARP 监视机制生成的 ARP 数据包,由 bonding 本身在内部标记。因此,bonding 必须“学习”在其之上配置的 VLAN ID,并使用这些 ID 标记自生成的数据包。

出于简单性的考虑,并且为了支持可以使用 VLAN 硬件加速卸载的适配器的使用,bonding 接口声明自身具有完全的硬件卸载能力,它会收到 add_vid/kill_vid 通知以收集必要的信息,并将这些操作传播到 slave。对于混合适配器类型,应通过不具备卸载能力的适配器的硬件加速标记数据包将由 bonding 驱动程序“取消加速”,以便 VLAN 标签位于常规位置。

VLAN 接口必须仅在 enslave 至少一个 slave 后添加到 bonding 接口之上。在添加第一个 slave 之前,bonding 接口的硬件地址为 00:00:00:00:00:00。如果在第一次 enslave 之前创建了 VLAN 接口,它将选择全零硬件地址。一旦第一个 slave 连接到 bond,bond 设备本身将选择 slave 的硬件地址,然后该地址可用于 VLAN 设备。

另请注意,如果从仍然在其上具有一个或多个 VLAN 接口的 bond 中释放所有 slave,则可能会发生类似的问题。添加新的 slave 时,bonding 接口将从第一个 slave 获取其硬件地址,该地址可能与 VLAN 接口的硬件地址不匹配(VLAN 接口的硬件地址最终是从较早的 slave 复制的)。

有两种方法可以确保 VLAN 设备在从 bonding 接口中删除所有 slave 时以正确的硬件地址运行

  1. 删除所有 VLAN 接口,然后重新创建它们

2. 设置 bonding 接口的硬件地址,使其与 VLAN 接口的硬件地址匹配。

请注意,更改 VLAN 接口的 HW 地址会将底层设备(即 bonding 接口)设置为混杂模式,这可能不是您想要的。

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 回复(因为 ARP 基于接口匹配回复),因此会被丢弃。MII 监视器不受路由表状态的影响。

此处的解决方案很简单,就是确保 slave 没有自己的路由,如果由于某种原因必须这样做,则这些路由不会覆盖其 master 的路由。通常应该是这种情况,但不寻常的配置或错误的或自动的静态路由添加可能会导致问题。

8.2 以太网设备重命名

在网络配置脚本不将物理设备直接与网络接口名称关联的系统上(因此相同的物理设备始终具有相同的“ethX”名称),可能需要在 /etc/modprobe.d/ 中的配置文件中添加一些特殊逻辑。

例如,给定包含以下内容的 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 配置会尝试 enslave eth2 和 eth3(稍后可能会分配给 tg3 设备)。

添加以下内容

add above bonding e1000 tg3

会导致 modprobe 在加载 bonding 时按顺序加载 e1000,然后加载 tg3。此命令已在 modules.conf 手册页中完全记录。

在使用 modprobe 的系统上,可能会出现等效的问题。在这种情况下,可以将以下内容添加到 /etc/modprobe.d/ 中的配置文件中,如

softdep bonding pre: tg3 e1000

这将在加载 bonding 模块之前加载 tg3 和 e1000 模块。有关此内容的完整文档,请参见 modprobe.d 和 modprobe 手册页。

9. SNMP 代理

如果运行 SNMP 代理,则应在任何参与 bond 的网络驱动程序之前加载 bonding 驱动程序。此要求是因为接口索引 (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 master 设备(例如 bond0)的混杂模式更改,并将设置传播到 slave 设备。

对于 balance-rr、balance-xor、broadcast 和 802.3ad 模式,混杂模式设置将传播到所有 slave。

对于 active-backup、balance-tlb 和 balance-alb 模式,混杂模式设置仅传播到活动 slave。

对于 balance-tlb 模式,活动 slave 是当前接收入站流量的 slave。

对于 balance-alb 模式,活动 slave 是用作“主要”的 slave。此 slave 用于特定于模式的控制流量,用于发送到未分配的对等方或负载不平衡的情况。

对于 active-backup、balance-tlb 和 balance-alb 模式,当活动 slave 更改时(例如,由于链路故障),混杂设置将传播到新的活动 slave。

11. 配置 Bonding 以实现高可用性

高可用性是指通过在主机与世界其他地方之间具有冗余或备份设备、链路或交换机来提供最大网络可用性的配置。目标是提供网络连接的最大可用性(即网络始终正常工作),即使其他配置可以提供更高的吞吐量。

11.1 单个交换机拓扑中的高可用性

如果两台主机(或主机和单个交换机)通过多个物理链路直接连接,则优化最大带宽不会导致可用性降低。在这种情况下,只有一个交换机(或对等方),因此如果它发生故障,则没有可故障转移的替代访问方式。此外,bonding 负载平衡模式支持对其成员的链路监视,因此如果单个链路发生故障,负载将在其余设备之间重新平衡。

有关使用一个对等设备配置 bonding 的信息,请参见第 12 节“配置 Bonding 以实现最大吞吐量”。

11.2 多个交换机拓扑中的高可用性

对于多个交换机,bonding 和网络的配置会发生巨大变化。在多个交换机拓扑中,网络可用性和可用带宽之间存在权衡。

以下是一个示例网络,配置为最大程度地提高网络的可用性

      |                                     |
      |port3                           port3|
+-----+----+                          +-----+----+
|          |port2       ISL      port2|          |
| switch A +--------------------------+ switch B |
|          |                          |          |
+-----+----+                          +-----++---+
      |port1                           port1|
      |             +-------+               |
      +-------------+ host1 +---------------+
               eth0 +-------+ eth1

在此配置中,两个交换机之间存在链路(ISL 或交换机间链路),并且有多个端口连接到外部世界(每个交换机上的“port3”)。没有技术原因不能将其扩展到第三个交换机。

11.2.1 多个交换机拓扑的 HA Bonding 模式选择

在上述示例之类的拓扑中,在优化可用性时,active-backup 和 broadcast 模式是唯一有用的 bonding 模式;其他模式要求所有链路在同一对等方上终止才能合理运行。

active-backup

这通常是首选模式,尤其是当交换机具有 ISL 并且运行良好时。如果网络配置使得一个交换机专门用作备份交换机(例如,容量较低、成本较高),则可以使用 primary 选项来确保首选链路始终在其可用时使用。

broadcast

此模式实际上是一种特殊用途模式,仅适用于非常特定的需求。例如,如果两个交换机未连接(没有 ISL),并且它们之外的网络完全独立。在这种情况下,如果需要某些特定单向流量到达两个独立的网络,则 broadcast 模式可能适用。

12. 配置 Bonding 以实现最大吞吐量

12.1 单个交换机拓扑中吞吐量最大化

在单个交换机配置中,最大程度地提高吞吐量的最佳方法取决于应用程序和网络环境。各种负载平衡模式在不同的环境中各有优缺点,如下详述。

对于此讨论,我们将拓扑分解为两类。根据大多数流量的目的地,我们将它们分为“网关”或“本地”配置。

在网关配置中,“交换机”主要用作路由器,并且大多数流量通过此路由器到达其他网络。一个例子如下所示

+----------+                     +----------+
|          |eth0            port1|          | to other networks
| Host A   +---------------------+ router   +------------------->
|          +---------------------+          | Hosts B and C are out
|          |eth1            port2|          | here somewhere
+----------+                     +----------+

路由器可以是专用路由器设备,也可以是充当网关的另一台主机。对于我们的讨论,重要的一点是来自主机 A 的大多数流量将在到达其最终目的地之前通过路由器到达某个其他网络。

在网关网络配置中,尽管主机 A 可能会与许多其他系统通信,但其所有流量都将通过本地网络上的另一个对等方(路由器)发送和接收。

请注意,对于配置 bonding 而言,通过多个物理链路直接连接的两个系统的情况与网关配置相同。在这种情况下,所有流量都将定向到“网关”本身,而不是网关之外的某个其他网络。

在本地配置中,“交换机”主要用作交换机,并且大多数流量通过此交换机到达同一网络上的其他站点。一个例子如下所示

+----------+            +----------+       +--------+
|          |eth0   port1|          +-------+ Host B |
|  Host A  +------------+  switch  |port3  +--------+
|          +------------+          |                  +--------+
|          |eth1   port2|          +------------------+ Host C |
+----------+            +----------+port4             +--------+

同样,交换机可以是专用交换机设备,也可以是充当网关的另一台主机。对于我们的讨论,重要的一点是来自主机 A 的大多数流量的目标是同一本地网络上的其他主机(在上面的示例中为主机 B 和主机 C)。

总而言之,在网关配置中,与 bonding 设备的流量将与网络上同一 MAC 级别的对等方(网关本身,即路由器)进行交互,而无论其最终目的地如何。在本地配置中,流量直接与最终目的地之间流动,因此,每个目的地(主机 B,主机 C)将由其各自的 MAC 地址直接寻址。

网关和本地网络配置之间的这种区别很重要,因为许多可用的负载平衡模式都使用本地网络源和目的地的 MAC 地址来制定负载平衡决策。下面描述了每种模式的行为。

12.1.1 单个交换机拓扑的 MT Bonding 模式选择

此配置最容易设置和理解,但您必须确定哪种 bonding 模式最适合您的需求。下面详细介绍了每种模式的权衡

balance-rr

此模式是唯一允许单个 TCP/IP 连接跨多个接口条带化流量的模式。因此,它是唯一允许单个 TCP/IP 流利用超过一个接口吞吐量的模式。但是,这是有代价的:条带化通常会导致对等系统接收无序的数据包,从而导致 TCP/IP 的拥塞控制系统启动,通常通过重新传输段。

可以通过更改 net.ipv4.tcp_reordering sysctl 参数来调整 TCP/IP 的拥塞限制。通常默认值为 3。但请记住,当 TCP 堆栈检测到重新排序时,它可以自动增加此值。

请注意,将以无序方式传递的数据包的分数差异很大,并且不可能为零。重新排序的级别取决于多种因素,包括网络接口、交换机和配置的拓扑。一般来说,高速网卡会产生更多的重新排序(由于数据包合并等因素),并且“多对多”拓扑将以高于“多慢对一快”配置的速率重新排序。

许多交换机不支持任何对流量进行条带化的模式(而是根据 IP 或 MAC 级别地址选择端口);对于这些设备,通过交换机流向 balance-rr bond 的特定连接的流量将不会利用大于一个接口的带宽。

如果您正在使用 TCP/IP 以外的协议(例如 UDP),并且您的应用程序可以容忍无序传递,则此模式可以允许随接口添加到 bond 而线性扩展的单流数据报性能。

此模式要求交换机将适当的端口配置为“etherchannel”或“trunking”。

active-backup

在此网络拓扑中,active-backup 模式没有太多优势,因为非活动备份设备都连接到与主设备相同的对等方。在这种情况下,负载平衡模式(具有链路监视)将提供相同级别的网络可用性,但具有增加的可用带宽。从好的方面来说,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 地址和数据包类型 ID 的 XOR),因此在“网关”配置中,所有传出流量通常将使用同一设备。传入流量也可能最终出现在单个设备上,但这取决于对等方的 802.3ad 实现的平衡策略。在“本地”配置中,流量将在 bond 中的设备之间分配。

最后,802.3ad 模式要求使用 MII 监视器,因此,在此模式下无法使用 ARP 监视器。

balance-tlb

balance-tlb 模式按对等方平衡传出流量。由于平衡是根据 MAC 地址完成的,因此在“网关”配置中(如上所述),此模式将通过单个设备发送所有流量。但是,在“本地”网络配置中,此模式以一种模糊智能的方式(不是像 balance-xor 或 802.3ad 模式中的简单 XOR)跨设备平衡多个本地网络对等方,因此在数学上不幸的 MAC 地址(即,XOR 为相同值的 MAC 地址)不会全部“聚集”在单个接口上。

与 802.3ad 不同,接口可以具有不同的速度,并且不需要特殊的交换机配置。缺点是,在这种模式下,所有传入的流量都通过单个接口到达,这种模式需要从属接口的网络设备驱动程序中提供一定的 ethtool 支持,并且 ARP 监视器不可用。

balance-alb

这种模式包含了 balance-tlb 的所有功能,甚至更多。它具有 balance-tlb 的所有特性(和限制),并且还将平衡来自本地网络对等方的传入流量(如上面的“绑定模块选项”部分所述)。

这种模式的唯一额外缺点是,网络设备驱动程序必须支持在设备打开时更改硬件地址。

12.2 多交换机拓扑中的最大吞吐量

当多个交换机配置为并行,作为两个或多个系统之间的隔离网络的一部分时,可以使用多个交换机来优化吞吐量,例如

              +-----------+
              |  Host A   |
              +-+---+---+-+
                |   |   |
       +--------+   |   +---------+
       |            |             |
+------+---+  +-----+----+  +-----+----+
| Switch A |  | Switch B |  | Switch C |
+------+---+  +-----+----+  +-----+----+
       |            |             |
       +--------+   |   +---------+
                |   |   |
              +-+---+---+-+
              |  Host B   |
              +-----------+

在此配置中,交换机彼此隔离。采用这种拓扑结构的一个原因是,对于具有许多主机的隔离网络(例如,配置为高性能的集群),使用多个较小的交换机可能比单个较大的交换机更具成本效益,例如,在具有 24 个主机的网络上,三个 24 端口交换机可能比单个 72 端口交换机便宜得多。

如果需要访问网络之外的内容,则可以为主机配备连接到外部网络的额外网络设备;然后,该主机还可以充当网关。

12.2.1 多交换机拓扑的 MT 绑定模式选择

在实际应用中,此类型配置中通常采用的绑定模式是 balance-rr。 历史上,在这种网络配置中,通常由于网络适配器不进行任何类型的包合并(通过使用 NAPI,或者因为设备本身直到收到一定数量的包才生成中断)而减轻了乱序包传递的常见警告。 以这种方式使用时,balance-rr 模式允许两个主机之间的单个连接有效地利用大于一个接口的带宽。

13. 交换机行为问题

13.2 重复的传入数据包

注意:从 3.0.2 版开始,绑定驱动程序具有抑制重复数据包的逻辑,这应在很大程度上消除此问题。 以下描述仅供参考。

观察到当首次使用绑定设备或在一段时间空闲后,会出现短暂的重复流量突发并不罕见。 通过向网络上的某个其他主机发出“ping”来最容易观察到这一点,并注意到来自 ping 标志重复的输出(通常每个从属设备一个)。

例如,在具有五个从属设备并且全部连接到一个交换机的活动-备份模式的绑定中,输出可能如下所示

# 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

这不是由于绑定驱动程序中的错误,而是许多交换机如何更新其 MAC 转发表的副作用。 最初,交换机不会将数据包中的 MAC 地址与特定的交换机端口相关联,因此可能会将流量发送到所有端口,直到其 MAC 转发表更新为止。 由于连接到绑定的接口可能会占用单个交换机上的多个端口,因此当交换机(暂时)将流量泛洪到所有端口时,绑定设备会收到同一数据包的多个副本(每个从属设备一个)。

重复的数据包行为取决于交换机,某些交换机表现出这种行为,而有些则没有。 在显示此行为的交换机上,可以通过清除 MAC 转发表来诱导此行为(在大多数 Cisco 交换机上,特权命令“clear mac address-table dynamic”将完成此操作)。

14. 硬件特定注意事项

本节包含有关在特定硬件平台上配置绑定或将绑定与特定交换机或其他设备连接的其他信息。

14.1 IBM BladeCenter

这适用于 JS20 和类似的系统。

在 JS20 刀片服务器上,绑定驱动程序仅支持 balance-rr、active-backup、balance-tlb 和 balance-alb 模式。 这主要是由于 BladeCenter 内部的网络拓扑,详见下文。

JS20 网络适配器信息

所有 JS20 都带有两个集成在主板上的 Broadcom 千兆以太网端口(在 IBM 术语中,“主板”)。 在 BladeCenter 机箱中,所有 JS20 刀片服务器的 eth0 端口都硬连线到 I/O 模块 #1;同样,所有 eth1 端口都连线到 I/O 模块 #2。 可以在 JS20 上安装一个附加的 Broadcom 子卡,以提供另外两个千兆以太网端口。 这些端口 eth2 和 eth3 分别连线到 I/O 模块 3 和 4。

每个 I/O 模块都可以包含交换机或直通模块(允许端口直接连接到外部交换机)。 某些绑定模式需要特定的 BladeCenter 内部网络拓扑才能运行; 详细信息如下。

有关更多特定于 BladeCenter 的网络信息,请参见两个 IBM 红皮书 (www.ibm.com/redbooks)

  • “IBM eServer BladeCenter 网络选项”

  • “IBM eServer BladeCenter 第 2-7 层网络交换”

BladeCenter 网络配置

由于 BladeCenter 可以通过多种方式进行配置,因此本讨论将仅限于描述基本配置。

通常,以太网交换机模块 (ESM) 用于 I/O 模块 1 和 2。在这种配置中,JS20 的 eth0 和 eth1 端口将连接到不同的内部交换机(在相应的 I/O 模块中)。

直通模块(OPM 或 CPM,光纤或铜缆直通模块)将 I/O 模块直接连接到外部交换机。 通过在 I/O 模块 #1 和 #2 中使用 PM,JS20 的 eth0 和 eth1 接口可以重定向到外部世界并连接到公共外部交换机。

根据 ESM 和 PM 的组合,网络对于绑定而言将显示为单交换机拓扑(所有 PM)或多交换机拓扑(一个或多个 ESM,零个或多个 PM)。 也可以将 ESM 连接在一起,从而形成与上述“多交换机拓扑中的高可用性”中的示例非常相似的配置。

特定模式的要求

balance-rr 模式要求对绑定中的设备使用直通模块,所有模块都连接到公共外部交换机。 与 balance-rr 常用方法一样,该交换机必须在适当的端口上配置为“etherchannel”或“trunking”。

balance-alb 和 balance-tlb 模式可以与交换机模块或直通模块(或两者的混合)一起使用。 这些模式的唯一特定要求是所有网络接口都必须能够访问通过绑定设备发送的流量的所有目的地(即,网络必须在 BladeCenter 外部的某个点汇聚)。

active-backup 模式没有其他要求。

其他注意事项

LAN 上的串行 (SoL) 链路仅通过主以太网 (eth0) 建立,因此,任何与 eth0 的链路丢失都将导致丢失 SoL 连接。 它不会与其他网络流量一起故障转移,因为 SoL 系统超出了绑定驱动程序的控制范围。

在交换机(内部以太网交换机模块或外部交换机)上禁用生成树可能有助于避免使用绑定时的故障转移延迟问题。

15. 常见问题解答

1. 它是否是 SMP 安全的?

是。 旧的 2.0.xx 通道绑定补丁不是 SMP 安全的。 新驱动程序从一开始就被设计为 SMP 安全的。

2. 什么类型的卡可以与它一起使用?

任何以太网类型的卡(您甚至可以混合使用卡 - 例如 Intel EtherExpress PRO/100 和 3com 3c905b)。 对于大多数模式,设备的速度不必相同。

从 3.2.1 版开始,绑定还支持活动-备份模式下的 Infiniband 从属设备。

3. 我可以拥有多少个绑定设备?

没有限制。

4. 一个绑定设备可以有多少个从属设备?

这仅受 Linux 支持的网络接口数量和/或您可以在系统中放置的网卡数量的限制。

6. 绑定可以用于高可用性吗?

是的。 有关详细信息,请参见高可用性部分。

7. 它与哪些交换机/系统配合使用?

此问题的完整答案取决于所需的模式。

在基本平衡模式(balance-rr 和 balance-xor)中,它可以与支持 etherchannel(也称为 trunking)的任何系统配合使用。 大多数当前可用的托管交换机都具有此类支持,许多非托管交换机也具有此类支持。

高级平衡模式(balance-tlb 和 balance-alb)没有特殊的交换机要求,但是确实需要支持特定功能的设备驱动程序(如上面的模块参数下的相应部分中所述)。

在 802.3ad 模式下,它可以与支持 IEEE 802.3ad 动态链路聚合的系统配合使用。 当前可用的大多数托管交换机和许多非托管交换机都支持 802.3ad。

active-backup 模式应与任何第 II 层交换机一起使用。

8. 绑定设备从何处获取其 MAC 地址?

当使用具有固定 MAC 地址的从属设备时,或者当启用了 fail_over_mac 选项时,绑定设备的 MAC 地址是活动从属设备的 MAC 地址。

对于其他配置,如果未显式配置(使用 ifconfig 或 ip link),则绑定设备的 MAC 地址取自其第一个从属设备。 然后,此 MAC 地址将传递给所有后续从属设备,并保持持久性(即使移除了第一个从属设备),直到绑定设备被关闭或重新配置。

如果您希望更改 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 地址

# ifconfig bond0 down ; modprobe -r bonding
# ifconfig bond0 .... up
# ifenslave bond0 eth...

此方法将自动从添加的下一个从属设备获取地址。

要恢复从属设备的 MAC 地址,您需要将它们从绑定中分离 (ifenslave -d bond0 eth0)。 然后,绑定驱动程序将恢复从属设备在被从属之前所具有的 MAC 地址。

9. 哪些绑定模式支持本机 XDP?

  • balance-rr (0)

  • active-backup (1)

  • balance-xor (2)

  • 802.3ad (4)

请注意,vlan+srcmac 哈希策略不支持本机 XDP。 对于其他绑定模式,必须以通用模式加载 XDP 程序。