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>
Jay Vosburgh 于 2005 年 2 月重新组织并更新,Mitch Williams 于 2006/04/24 添加了 Sysfs 信息
Mitch Williams <mitch.a.williams at intel.com>
简介¶
Linux 绑定驱动程序提供了一种将多个网络接口聚合为单个逻辑“绑定”接口的方法。绑定接口的行为取决于模式;一般来说,模式提供热备用或负载平衡服务。此外,还可以执行链路完整性监控。
绑定驱动程序最初来自 Donald Becker 为内核 2.0 编写的 beowulf 补丁。自那时以来,它发生了很大变化,来自 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
为支持它的模式(活动-备份、balance-alb 和 balance-tlb)指定新的活动从属接口。可能的值是任何当前被奴役的接口的名称,或空字符串。如果给出了名称,则必须启动该从属接口及其链路才能被选为新的活动从属接口。如果指定了空字符串,则清除当前活动从属接口,并自动选择新的活动从属接口。
请注意,这仅通过 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 关联状态更改
绑定的管理状态更改为启动
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
验证仅对备份从属设备执行。
全部或 3
验证对所有从属设备执行。
过滤或 4
过滤应用于所有从属设备。不执行验证。
filter_active 或 5
过滤应用于所有从属设备,验证仅对活动从属设备执行。
filter_backup 或 6
过滤应用于所有从属设备,验证仅对备份从属设备执行。
验证
启用验证会导致 ARP 监视器检查传入的 ARP 请求和回复,并且只有在从属设备收到适当的 ARP 流量时才认为它是已启动的。
对于活动从属设备,验证会检查 ARP 回复以确认它们是由 arp_ip_target 生成的。由于备份从属设备通常不会收到这些回复,因此对备份从属设备执行的验证是对通过活动从属设备发出的广播 ARP 请求进行的。某些交换机或网络配置可能会导致备份从属设备收不到 ARP 请求的情况;在这种情况下,必须禁用对备份从属设备的验证。
备份从属设备上 ARP 请求的验证主要帮助绑定决定在活动从属设备发生故障时哪些从属设备更有可能工作,它并不能真正保证备份从属设备在被选为下一个活动从属设备后会工作。
验证在多个绑定主机同时向公共交换机之外的一个或多个目标发出 ARP 的网络配置中很有用。如果交换机和目标之间的链路出现故障(但不是交换机本身),则多个绑定实例生成的探测流量会欺骗标准 ARP 监视器,使其认为链路仍然处于启动状态。使用验证可以解决此问题,因为 ARP 监视器只会考虑与其自身绑定实例关联的 ARP 请求和回复。
过滤
启用过滤会导致 ARP 监视器仅使用传入的 ARP 数据包来确定链路的可用性。不是 ARP 的传入数据包会正常传递,但在确定从属设备是否可用时不会被计算在内。
过滤的工作原理是仅考虑接收 ARP 数据包(任何 ARP 数据包,无论源或目标)来确定从属设备是否已接收到用于链路可用性的流量。
过滤在第三方广播流量级别很高的情况下很有用,这些广播流量会欺骗标准 ARP 监视器,使其认为链路仍然处于启动状态。使用过滤可以解决此问题,因为只有 ARP 流量才会被考虑用于链路可用性。
此选项是在 bonding 版本 3.1.0 中添加的。
arp_all_targets
指定为了让 ARP 监视器认为从属设备已启动,必须可达到的 arp_ip_target 的数量。此选项仅影响启用了 arp_validation 的从属设备的活动-备份模式。
可能的值是
任何或 0
仅当任何 arp_ip_target 可达时,才认为从属设备已启动
全部或 1
仅当所有 arp_ip_target 都可达时,才认为从属设备已启动
arp_missed_max
指定为了让 ARP 监视器将接口标记为关闭,必须失败的 arp_interval 监视器检查的次数。
为了提供有序的故障转移语义,允许备份接口进行额外的监视器检查(即,它们必须失败 arp_missed_max + 1 次才能被标记为关闭)。
默认值为 2,允许的范围为 1 - 255。
coupled_control
指定 802.3ad 模式下的 LACP 状态机的 MUX 是否应具有单独的收集和分配状态。
这是通过在现有的耦合控制状态机之外,按照 IEEE 802.1AX-2008 5.4.15 实现独立的控制状态机来实现的。
默认值为 1。此设置不会分离收集和分配状态,从而保持绑定处于耦合控制状态。
downdelay
指定检测到链路故障后,禁用从属设备之前等待的时间(以毫秒为单位)。此选项仅对 miimon 链路监视器有效。downdelay 值应为 miimon 值的倍数;如果不是,则将其向下舍入到最接近的倍数。默认值为 0。
fail_over_mac
指定活动-备份模式是否应在从属时将所有从属设备设置为相同的 MAC 地址(传统行为),或者在启用时,根据所选策略对绑定的 MAC 地址执行特殊处理。
可能的值是
none 或 0
此设置禁用 fail_over_mac,并导致绑定在从属时将活动-备份绑定的所有从属设备设置为相同的 MAC 地址。这是默认值。
active 或 1
“active” fail_over_mac 策略表示绑定的 MAC 地址应始终是当前活动从属设备的 MAC 地址。不会更改从属设备的 MAC 地址;相反,绑定的 MAC 地址会在故障转移期间更改。
此策略适用于永远无法更改其 MAC 地址的设备,或拒绝使用其自身源 MAC 的传入广播(这会干扰 ARP 监视器)的设备。
此策略的缺点是,网络上的每个设备都必须通过无偿 ARP 进行更新,而不是仅更新交换机或一组交换机(如果交换机侦听传入流量以更新其表,则通常对任何流量(不仅仅是 ARP 流量)进行更新)对于传统方法。如果无偿 ARP 丢失,则可能会中断通信。
当此策略与 mii 监视器结合使用时,在实际能够发送和接收之前断言链路启动的设备特别容易丢失无偿 ARP,并且可能需要适当的 updelay 设置。
follow 或 2
“follow” fail_over_mac 策略导致正常选择绑定的 MAC 地址(通常是添加到绑定的第一个从属设备的 MAC 地址)。但是,第二个和后续从属设备在处于备份角色时不设置为此 MAC 地址;从属设备在故障转移时使用绑定的 MAC 地址进行编程(而以前活动的从属设备接收新活动的从属设备的 MAC 地址)。
此策略适用于当多个端口使用相同 MAC 地址进行编程时会感到困惑或产生性能损失的多端口设备。
默认策略为 none,除非第一个从属设备无法更改其 MAC 地址,在这种情况下,默认情况下会选择 active 策略。
仅当绑定中不存在从属设备时,才能通过 sysfs 修改此选项。
此选项是在 bonding 版本 3.2.0 中添加的。“follow”策略是在 bonding 版本 3.3.0 中添加的。
- lacp_active
指定是否定期发送 LACPDU 帧的选项。
- 关闭或 0
LACPDU 帧充当“有人说话时才说话”。
- 开启或 1
LACPDU 帧会沿着配置的链路定期发送。有关更多详细信息,请参阅 lacp_rate。
默认值为 on。
lacp_rate
指定我们要求链路伙伴在 802.3ad 模式下传输 LACPDU 数据包的速率的选项。可能的值包括
- 慢速或 0
请求伙伴每 30 秒传输一次 LACPDU
- 快速或 1
请求伙伴每 1 秒传输一次 LACPDU
默认值为 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 功能。这允许设置在将绑定设备标记为启动(载波开启)之前必须启动(链路启动状态)的成员端口的最小数量。这对于希望确保在切换之前有最小数量的低带宽链路处于活动状态(例如集群)的更高层服务的情况很有用。此选项仅影响 802.3ad 模式。
默认值为 0。这将导致在存在活动聚合器时断言载波(对于 802.3ad 模式),而与该聚合器中可用的链路数无关。请注意,由于聚合器在没有至少一个可用链路的情况下无法处于活动状态,因此将此选项设置为 0 或 1 具有完全相同的效果。
mode
指定一种绑定策略。默认值为 balance-rr(循环)。可能的值包括
balance-rr 或 0
循环策略:按顺序从第一个可用从属设备到最后一个从属设备传输数据包。此模式提供负载平衡和容错能力。
active-backup 或 1
活动-备份策略:绑定中只有一个从属设备处于活动状态。只有当活动从属设备发生故障时,另一个从属设备才会变为活动状态。绑定的 MAC 地址仅在一个端口(网络适配器)上外部可见,以避免混淆交换机。
在绑定版本 2.6.2 或更高版本中,当在活动-备份模式下发生故障转移时,绑定会在新活动的从属设备上发出一个或多个无偿 ARP。为绑定主接口和在其上配置的每个 VLAN 接口发出一个无偿 ARP,前提是该接口已配置至少一个 IP 地址。为 VLAN 接口发出的无偿 ARP 会使用适当的 VLAN ID 进行标记。
此模式提供容错能力。下面记录的 primary 选项会影响此模式的行为。
balance-xor 或 2
XOR 策略:根据选择的传输哈希策略进行传输。默认策略是一个简单的 [(源 MAC 地址与目标 MAC 地址异或运算的结果与数据包类型 ID 异或运算) 模数从属设备计数]。可以通过 xmit_hash_policy 选项选择备用传输策略,如下所述。
此模式提供负载平衡和容错能力。
broadcast 或 3
广播策略:在所有从属接口上广播所有内容。此模式提供容错能力。
802.3ad 或 4
IEEE 802.3ad 动态链路聚合。创建共享相同速度和双工设置的聚合组。根据 802.3ad 规范利用活动聚合器中的所有从属设备。
根据传输哈希策略完成对传出流量的从属设备选择,可以从默认的简单 XOR 策略通过 xmit_hash_policy 选项进行更改,如下所述。请注意,并非所有传输策略都符合 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
自适应负载均衡:包括针对 IPv4 流量的 balance-tlb 和接收负载均衡 (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
指定在故障转移事件后要发出的对等通知(免费 ARP 和未经请求的 IPv6 邻居通告)的数量。一旦新从属设备上的链路建立(可能立即建立),就会在绑定设备和每个 VLAN 子设备上发送对等通知。如果该数量大于 1,则以 peer_notif_delay 指定的速率重复发送。
有效范围是 0 - 255;默认值为 1。这些选项仅影响主动-备份模式。这些选项分别针对绑定版本 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
指定在故障转移事件后发出对等通知(免费 ARP 和未经请求的 IPv6 邻居通告)之间的延迟时间(以毫秒为单位)。此延迟应为 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 模式的默认行为是在该间隔内根据负载在从属设备之间洗牌活动流。这提供了良好的负载均衡特性,但可能会导致数据包重新排序。如果重新排序是一个问题,请使用此变量禁用流洗牌,并依赖仅由哈希分布提供的负载均衡。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 来维护其状态;在编写本文时,大多数(但并非全部)设备驱动程序都支持此功能。如果绑定坚持认为链路已启动,但实际上不应启动,则可能是你的网络设备驱动程序不支持 netif_carrier_on/off。netif_carrier 的默认状态为“载波开启”,因此如果驱动程序不支持 netif_carrier,则链路将始终显示为已启动。在这种情况下,将 use_carrier 设置为 0 将导致绑定恢复为使用 MII/ETHTOOL ioctl 方法来确定链路状态。
值为 1 表示启用
netif_carrier_ok()
的使用,值为 0 将使用已弃用的 MII/ETHTOOL ioctl。默认值为 1。
xmit_hash_policy
选择在 balance-xor、802.3ad 和 tlb 模式下用于从属设备选择的传输哈希策略。可能的值为
layer2
使用硬件 MAC 地址和数据包类型 ID 字段的 XOR 来生成哈希。公式为
hash = 源 MAC[5] XOR 目标 MAC[5] XOR 数据包类型 ID 从属设备编号 = hash 模 从属设备计数
此算法会将所有发送到特定网络对等方的流量放置在同一从属设备上。
此算法符合 802.3ad 标准。
layer2+3
此策略使用第 2 层和第 3 层协议信息的组合来生成哈希。
使用硬件 MAC 地址和 IP 地址的 XOR 来生成哈希。公式为
hash = 源 MAC[5] XOR 目标 MAC[5] XOR 数据包类型 ID hash = hash XOR 源 IP XOR 目标 IP hash = hash XOR (hash 右移 16 位) hash = hash XOR (hash 右移 8 位) 然后将哈希结果模从属设备计数。
如果协议为 IPv6,则首先使用 ipv6_addr_hash 对源地址和目标地址进行哈希处理。
此算法会将所有发送到特定网络对等方的流量放置在同一从属设备上。对于非 IP 流量,该公式与 layer2 传输哈希策略的公式相同。
此策略旨在提供比单独使用 layer2 更均衡的流量分配,尤其是在需要第 3 层网关设备才能访问大多数目标的环境中。
此算法符合 802.3ad 标准。
layer3+4
此策略使用可用的上层协议信息来生成哈希。这允许发送到特定网络对等方的流量跨越多个从属设备,尽管单个连接不会跨越多个从属设备。
未分片的 TCP 和 UDP 数据包的公式为
hash = 源端口,目标端口(如在标头中) hash = hash XOR 源 IP XOR 目标 IP hash = hash XOR (hash 右移 16 位) hash = hash XOR (hash 右移 8 位) hash = hash 右移 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 设备)
默认值是 layer2。此选项在 bonding 版本 2.6.3 中添加。在早期版本的 bonding 中,此参数不存在,layer2 策略是唯一的策略。layer2+3 值是在 bonding 版本 3.2.2 中添加的。
resend_igmp
指定在故障转移事件后要发出的 IGMP 组成员报告的数量。一个成员报告在故障转移后立即发出,后续数据包在每个 200 毫秒的间隔发送。
有效范围是 0 - 255;默认值是 1。值为 0 可防止响应故障转移事件而发出 IGMP 成员报告。
此选项对于绑定模式 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. 配置绑定设备¶
您可以使用您的发行版的网络初始化脚本配置绑定,也可以使用 iproute2 或 sysfs 接口手动配置。发行版通常使用以下三种软件包之一进行网络初始化脚本:initscripts、sysconfig 或 interfaces。这些软件包的最新版本支持绑定,而旧版本不支持。
我们将首先描述为使用具有完整或部分绑定支持的 initscripts、sysconfig 和 interfaces 版本的发行版配置绑定的选项,然后提供有关在没有网络初始化脚本支持的情况下启用绑定的信息(即,旧版本的 initscripts 或 sysconfig)。
如果您不确定您的发行版使用的是 sysconfig、initscripts 还是 interfaces,或者不知道它是否足够新,请不要担心。确定这一点相当简单。
首先,在 /etc/network 目录中查找名为 interfaces 的文件。如果此文件存在于您的系统中,则您的系统使用 interfaces。请参阅使用 Interfaces 支持进行配置。
否则,请发出命令
$ rpm -qf /sbin/ifup
它将响应一行文本,以 “initscripts” 或 “sysconfig” 开头,后跟一些数字。这是提供您的网络初始化脚本的软件包。
接下来,要确定您的安装是否支持绑定,请发出命令
$ grep ifenslave /sbin/ifup
如果此命令返回任何匹配项,则表示您的 initscripts 或 sysconfig 支持绑定。
3.1 使用 Sysconfig 支持进行配置¶
本节适用于使用具有绑定支持的 sysconfig 版本的发行版,例如 SuSE Linux Enterprise Server 9。
SuSE SLES 9 的网络配置系统确实支持绑定,但是,在撰写本文时,YaST 系统配置前端不提供任何使用绑定设备的方法。但是,可以手动管理绑定设备,如下所示。
首先,如果尚未配置从属设备,请配置它们。在 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 文件后,就可以为绑定设备本身创建配置文件了。此文件名为 ifcfg-bondX,其中 X 是要创建的绑定设备的编号,从 0 开始。第一个这样的文件是 ifcfg-bond0,第二个是 ifcfg-bond1,依此类推。sysconfig 网络配置系统将正确启动多个绑定实例。
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 时才启动设备。如果您因某种原因不希望绑定设备在启动时自动启动,则可以这样配置它们。
hotplug
设备由热插拔事件启动。这不是绑定设备的有效选择。
off 或
忽略设备配置。
ignore
行 BONDING_MASTER='yes' 表示该设备是绑定主设备。唯一有用的值是“yes”。
BONDING_MODULE_OPTS 的内容将提供给此设备的绑定模块实例。在此处指定绑定模式、链路监控等的选项。不要包含 max_bonds 绑定参数;如果您有多个绑定设备,这将使配置系统感到困惑。
最后,为每个从属设备提供一个 BONDING_SLAVEn=”从属设备”。其中 “n” 是一个递增值,每个从属设备一个。“从属设备” 是一个接口名称,例如 “eth0”,或者是网络设备的设备说明符。接口名称更容易查找,但是如果例如序列早期的设备发生故障,则 ethN 名称可能会在启动时更改。设备说明符(上例中的 bus-pci-0000:06:08.1)指定物理网络设备,并且除非设备的总线位置发生更改(例如,它从一个 PCI 插槽移动到另一个 PCI 插槽),否则不会更改。上面的示例出于演示目的使用了每种类型中的一种;大多数配置将为所有从属设备选择其中一种。
修改或创建所有配置文件后,必须重新启动网络才能使配置更改生效。这可以通过以下方式完成
# /etc/init.d/network restart
请注意,网络控制脚本 (/sbin/ifdown) 会删除绑定模块作为网络关闭处理的一部分,因此如果例如模块参数已更改,则不必手动删除该模块。
此外,在撰写本文时,YaST/YaST2 不会管理绑定设备(它们不会在其网络设备列表中显示绑定接口)。必须手动编辑配置文件才能更改绑定配置。
有关 ifcfg 文件格式的其他常规选项和详细信息,可以在示例 ifcfg 模板文件中找到
/etc/sysconfig/network/ifcfg.template
请注意,该模板没有记录上面描述的各种 BONDING_*
设置,但确实描述了许多其他选项。
3.1.1 使用 DHCP 与 Sysconfig¶
在 sysconfig 下,使用 BOOTPROTO='dhcp' 配置设备将导致它查询 DHCP 以获取其 IP 地址信息。在撰写本文时,这不适用于绑定设备;脚本尝试在添加任何从属设备之前从 DHCP 获取设备地址。如果没有活动的从属设备,则 DHCP 请求不会发送到网络。
3.1.2 使用 Sysconfig 配置多个绑定¶
sysconfig 网络初始化系统能够处理多个绑定设备。所有需要做的就是每个绑定实例都有一个配置正确的 ifcfg-bondX 文件(如上所述)。不要为任何绑定实例指定 “max_bonds” 参数,因为这会使 sysconfig 感到困惑。如果您需要具有相同参数的多个绑定设备,请创建多个 ifcfg-bondX 文件。
由于 sysconfig 脚本在 ifcfg-bondX 文件中提供绑定模块选项,因此不必将它们添加到系统 /etc/modules.d/*.conf
配置文件中。
3.2 使用 Initscripts 支持进行配置¶
本节适用于使用具有绑定支持的最新版本的 initscripts 的发行版,例如,Red Hat Enterprise Linux 版本 3 或更高版本、Fedora 等。在这些系统上,网络初始化脚本了解绑定,并且可以配置为控制绑定设备。请注意,旧版本的 initscripts 软件包对绑定的支持级别较低;这将在适用时注明。
除非 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
每个 ethX 设备的 DEVICE= 行将有所不同,并且必须与文件名相对应,即 ifcfg-eth1 必须具有 DEVICE=eth1 的设备行。MASTER= 行的设置还将取决于为您的绑定选择的最终绑定接口名称。与其他网络设备一样,这些设备通常从 0 开始,并且每个设备都增加 1,即第一个绑定实例是 bond0,第二个是 bond1,依此类推。
接下来,创建一个绑定网络脚本。此脚本的文件名将为 /etc/sysconfig/network-scripts/ifcfg-bondX,其中 X 是绑定的编号。对于 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(或更高版本)中找到的 initscripts,可以在 ifcfg-bond0 文件中指定绑定选项,例如,以下格式的行
BONDING_OPTS="mode=active-backup arp_interval=60 arp_ip_target=192.168.1.254"
将使用指定的选项配置绑定。BONDING_OPTS 中指定的选项与绑定模块参数相同,但当使用早于 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 配置多个 Bond¶
Fedora 7 和 Red Hat Enterprise Linux 5 中包含的 initscripts 包支持通过在 ifcfg-bondX 中简单地指定适当的 BONDING_OPTS= 来支持多个 bonding 接口,其中 X 是 bond 的编号。此支持需要在内核中支持 sysfs,以及 3.0.0 或更高版本的 bonding 驱动程序。其他配置可能不支持此方法来指定多个 bonding 接口;对于这些情况,请参阅下面的“手动配置多个 Bond”部分。
3.3 使用 iproute2 手动配置 Bonding¶
本节适用于网络初始化脚本(sysconfig 或 initscripts 包)不具备 bonding 特定知识的发行版。其中一个发行版是 SuSE Linux Enterprise Server 版本 8。
这些系统的通用方法是将 bonding 模块参数放入 /etc/modprobe.d/ 中的配置文件(根据安装的发行版),然后将 modprobe 和/或 ip link 命令添加到系统的全局初始化脚本中。全局初始化脚本的名称有所不同;对于 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 而无需重新运行整个全局初始化脚本。
要关闭 bonding 设备,首先必须将 bonding 设备本身标记为关闭,然后删除相应的设备驱动模块。对于上面的示例,你可以执行以下操作:
# ifconfig bond0 down
# rmmod bonding
# rmmod e100
同样,为了方便起见,可能需要创建一个包含这些命令的脚本。
3.3.1 手动配置多个 Bond¶
本节包含有关为那些网络初始化脚本缺乏配置多个 bond 支持的系统配置具有不同选项的多个 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 模式下使用 100 的 miimon 创建 bond0 设备。第二个实例名为 “bond1”,并在 balance-alb 模式下使用 50 的 miimon 创建 bond1 设备。
在某些情况下(通常是较旧的发行版),以上方法不起作用,第二个 bonding 实例永远看不到其选项。在这种情况下,可以将第二个选项行替换为:
install bond1 /sbin/modprobe --ignore-install bonding -o bond1 \
mode=balance-alb miimon=50
可以重复此操作任意次数,为每个后续实例指定一个唯一的名称,以替换 bond1。
据观察,某些 Red Hat 提供的内核无法在加载时重命名模块(“-o bond1” 部分)。尝试将该选项传递给 modprobe 将产生 “Operation not permitted” 错误。据报告,某些 Fedora Core 内核上存在此问题,RHEL 4 上也出现了此问题。在出现此问题的内核上,将无法使用不同的参数配置多个 bond(因为它们是较旧的内核,并且也缺乏 sysfs 支持)。
3.4 通过 Sysfs 手动配置 Bonding¶
从 3.0.0 版本开始,可以通过 sysfs 接口配置通道绑定。此接口允许动态配置系统中的所有 bond,而无需卸载模块。它还允许在运行时添加和删除 bond。不再需要 ifenslave,尽管它仍然受支持。
使用 sysfs 接口允许你使用具有不同配置的多个 bond,而无需重新加载模块。它还允许你在将 bonding 编译到内核中时使用多个配置不同的 bond。
你必须安装 sysfs 文件系统才能以这种方式配置 bonding。本文档中的示例假设你正在使用 sysfs 的标准挂载点,例如 /sys。如果你的 sysfs 文件系统安装在其他位置,则需要相应地调整示例路径。
创建和销毁 Bond¶
要添加一个新的 bond foo:
# echo +foo > /sys/class/net/bonding_masters
要删除现有的 bond bar:
# echo -bar > /sys/class/net/bonding_masters
要显示所有现有的 bond:
# cat /sys/class/net/bonding_masters
注意:
由于 sysfs 文件的大小限制为 4K,如果你的 bond 超过几百个,此列表可能会被截断。这种情况不太可能在正常运行条件下发生。
添加和删除 Slave¶
可以使用文件 /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/eth0 的 /sys/class/net/bond0/slave_eth0,以及指向 /sys/class/net/bond0 的 /sys/class/net/eth0/master。
这意味着你可以通过查找 master 符号链接来快速判断接口是否被绑定。因此:# 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 驱动程序将学习数据包发送到每个 slave 对等交换机的时间间隔(以秒为单位)。默认间隔为 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,其中包含两个处于 active-backup 模式的 e1000 接口,并使用 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
3.5 使用接口支持进行配置¶
本节适用于使用 /etc/network/interfaces 文件描述网络接口配置的发行版,最著名的是 Debian 及其衍生版本。
Debian 上的 ifup 和 ifdown 命令开箱即不支持 bonding。应安装 ifenslave-2.6 包以提供 bonding 支持。安装后,此软件包将提供可在 /etc/network/interfaces 中使用的 bond-*
选项。
请注意,ifenslave-2.6 软件包将加载 bonding 模块,并在适当时使用 ifenslave 命令。
示例配置¶
在 /etc/network/interfaces 中,以下节将以 active-backup 模式配置 bond0,并将 eth0 和 eth1 作为 slave:
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 模式的策略进行选择。然而,有时将某些类型的流量定向到特定的物理接口以实现稍微复杂的策略是有帮助的。例如,要通过一个 bonding 接口访问 Web 服务器,其中 eth0 连接到私有网络,而 eth1 通过公共网络连接,可能需要优先通过 eth0 发送流量,仅将 eth1 作为备用,而所有其他流量都可以安全地通过任一接口发送。可以使用 Linux 中固有的流量控制实用程序来实现此类配置。
默认情况下,bonding 驱动是多队列感知的,并且在驱动程序初始化时会创建 16 个队列(有关详细信息,请参阅 多队列网络设备支持指南)。如果需要更多或更少的队列,可以使用模块参数 tx_queues 来更改此值。由于分配是在模块初始化时完成的,因此没有可用的 sysfs 参数。
文件 /proc/net/bonding/bondX 的输出已更改,因此现在为每个从属设备打印输出队列 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
可以使用以下命令设置从属设备的 queue_id:
# echo "eth1:2" > /sys/class/net/bond0/bonding/queue_id
任何需要设置 queue_id 的接口都应使用多次调用(如上所示)来设置,直到为所有接口设置了正确的优先级。在允许通过 initscripts 配置的发行版上,可以将多个 'queue_id' 参数添加到 BONDING_OPTS 以设置所有需要的从属队列。
这些队列 ID 可以与 tc 实用程序结合使用,以配置多队列 qdisc 和过滤器,以偏向某些流量在特定的从属设备上传输。例如,假设在上述配置中,我们希望强制所有发送到 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 接口,并过滤排队到该接口的流量,以便将目标 IP 为 192.168.1.100 的数据包的输出队列映射值覆盖为 2。然后,此值传递给驱动程序,导致正常的输出路径选择策略被覆盖,而是选择映射到 eth1 的 qid 2。
请注意,qid 值从 1 开始。Qid 0 保留用于初始化驱动程序,以进行正常的输出策略选择。将从属设备的 qid 保留为 0 的一个好处是,现在存在于 bonding 驱动中的多队列感知能力。这种感知能力允许将 tc 过滤器放置在从属设备以及 bond 设备上,并且 bonding 驱动将简单地充当在从属设备上选择输出队列的传递机制,而不是输出端口选择。
此功能首次出现在 bonding 驱动程序 3.7.0 版本中,并且对输出从属设备选择的支持仅限于 round-robin 和 active-backup 模式。
3.7 以更安全的方式为 802.3ad 模式配置 LACP¶
当使用 802.3ad bonding 模式时,Actor(主机)和 Partner(交换机)会交换 LACPDU。这些 LACPDU 无法被嗅探,因为它们的目标是链路本地 MAC 地址(交换机/网桥不应转发)。但是,大多数值都很容易预测或只是机器的 MAC 地址(在同一 L2 中的所有其他主机都众所周知)。这意味着 L2 域中的其他机器可以伪造来自其他主机的 LACPDU 数据包到交换机,并可能通过加入(从交换机的角度来看)另一台机器的聚合来造成混乱,从而接收该主机的一部分传入流量和/或伪造来自该机器本身的流量(甚至可能成功终止部分流量)。虽然这不太可能发生,但可以通过简单地配置一些 bonding 参数来避免这种情况。
ad_actor_system: 您可以设置一个随机的 MAC 地址,用于这些 LACPDU 交换。该值不能为 NULL 或多播。最好也设置 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_systemad_actor_sys_prio: 随机化系统优先级。默认值为 65535,但系统可以取值 1 - 65535。以下 shell 代码会生成随机优先级并进行设置:
# sys_prio=$(( 1 + RANDOM + RANDOM )) # echo $sys_prio > /sys/class/net/bond0/bonding/ad_actor_sys_prioad_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 配置、选项和每个从属设备状态的信息。
例如,在加载了 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 标志。ifconfig 输出不包含有关哪些从属设备与哪些主设备关联的信息。
在下面的示例中,bond0 接口是主设备 (MASTER),而 eth0 和 eth1 是从属设备 (SLAVE)。请注意,除了 TLB 和 ALB 模式外,bond0 的所有从属设备都具有与 bond0 相同的 MAC 地址 (HWaddr),TLB 和 ALB 模式要求每个从属设备具有唯一的 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 系列交换机要求首先将相应的端口分组到单个以太通道实例中,然后将该以太通道设置为“lacp”模式以启用 802.3ad(而不是标准以太通道)。
balance-rr、balance-xor 和 broadcast 模式通常要求交换机将相应的端口分组在一起。这种组的命名在不同的交换机之间有所不同,它可能被称为“以太通道”(如上面的 Cisco 示例中所示)、“trunk group”或其他类似的变体。对于这些模式,每个交换机还将具有自己的交换机到 bonding 的传输策略配置选项。典型的选择包括 MAC 或 IP 地址的 XOR。两个对等方的传输策略不需要匹配。对于这三种模式,bonding 模式实际上为以太通道组选择了一种传输策略;这三种模式都可以与另一个以太通道组互操作。
6. 802.1q VLAN 支持¶
可以使用 8021q 驱动程序在 bonding 接口上配置 VLAN 设备。但是,默认情况下,只有来自 8021q 驱动程序并通过 bonding 的数据包才会被标记。自生成的数据包(例如,bonding 的学习数据包或由 ALB 模式或 ARP 监视机制生成的 ARP 数据包)由 bonding 本身在内部标记。因此,bonding 必须“学习”在其之上配置的 VLAN ID,并使用这些 ID 来标记自生成的数据包。
为了简单起见,并支持使用可以进行 VLAN 硬件加速卸载的适配器,bonding 接口声明自身完全具备硬件卸载功能,它会收到 add_vid/kill_vid 通知以收集必要的信息,并将这些操作传播给从属设备。如果使用混合适配器类型,则应通过不具备卸载功能的适配器的硬件加速标记的数据包将由 bonding 驱动程序“取消加速”,因此 VLAN 标记将位于常规位置。
只有在至少启用一个从属设备后,才必须在 bonding 接口之上添加 VLAN 接口。在添加第一个从属设备之前,bonding 接口的硬件地址为 00:00:00:00:00:00。如果在第一个启用从属设备之前创建了 VLAN 接口,它将获取全零的硬件地址。将第一个从属设备连接到 bonding 后,bonding 设备本身将获取从属设备的硬件地址,然后该地址可用于 VLAN 设备。
此外,请注意,如果从仍然在其之上有一个或多个 VLAN 接口的 bonding 中释放所有从属设备,则可能会发生类似的问题。添加新的从属设备时,bonding 接口将从第一个从属设备获取其硬件地址,该地址可能与 VLAN 接口的硬件地址不匹配(该地址最终是从较早的从属设备复制的)。
有两种方法可以确保 VLAN 设备在从 bonding 接口中删除所有从属设备时使用正确的硬件地址:
删除所有 VLAN 接口,然后重新创建它们。
2. 设置 bonding 接口的硬件地址,使其与 VLAN 接口的硬件地址匹配。
请注意,更改 VLAN 接口的 HW 地址会将底层设备(即 bonding 接口)设置为混杂模式,这可能不是您想要的。
7. 链路监控¶
目前,bonding 驱动程序支持两种方案来监控从属设备的链路状态:ARP 监视器和 MII 监视器。
目前,由于 bonding 驱动程序本身的实现限制,无法同时启用 ARP 和 MII 监控。
7.1 ARP 监视器操作¶
ARP 监视器顾名思义:它向网络上的一个或多个指定对等系统发送 ARP 查询,并将响应用作链路正在运行的指示。这可以确保流量实际上正在与本地网络上的一个或多个对等方之间流动。
7.2 配置多个 ARP 目标¶
虽然可以使用一个目标进行 ARP 监控,但在高可用性设置中,使用多个目标进行监控可能很有用。如果只有一个目标,则目标本身可能会出现故障或发生问题,从而使其对 ARP 请求无响应。拥有额外的目标(或多个)可以提高 ARP 监控的可靠性。
多个 ARP 目标必须用逗号分隔,如下所示:
# example options for ARP monitoring with three targets
alias bond0 bonding
options bond0 arp_interval=60 arp_ip_target=192.168.0.1,192.168.0.3,192.168.0.9
对于只有一个目标的情况,选项将类似于:
# example options for ARP monitoring with one target
alias bond0 bonding
options bond0 arp_interval=60 arp_ip_target=192.168.0.100
7.3 MII 监视器操作¶
MII 监视器仅监控本地网络接口的载波状态。它通过以下三种方式之一实现此目的:依赖设备驱动程序来维护其载波状态,查询设备的 MII 寄存器或对设备进行 ethtool 查询。
如果 use_carrier 模块参数为 1(默认值),则 MII 监视器将依赖驱动程序获取载波状态信息(通过 netif_carrier 子系统)。如上面的 use_carrier 参数信息中所述,如果 MII 监视器无法检测到设备上的载波丢失(例如,当电缆物理断开连接时),则可能是驱动程序不支持 netif_carrier。
如果 use_carrier 为 0,则 MII 监视器将首先(通过 ioctl)查询设备的 MII 寄存器并检查链路状态。如果该请求失败(不仅仅是返回载波关闭),则 MII 监视器将发出 ethtool ETHTOOL_GLINK 请求以尝试获取相同的信息。如果两种方法都失败(即,驱动程序不支持或在处理 MII 寄存器和 ethtool 请求时出现错误),则 MII 监视器将假定链路已连接。
8. 潜在的故障来源¶
8.1 路由方面的冒险¶
配置 bonding 时,重要的是从设备不应具有覆盖主设备路由的路由(或者,通常情况下,根本不应有路由)。例如,假设 bonding 设备 bond0 有两个从设备 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 上另一台主机的传出流量将使用 eth0 或 eth1,而不是 bond0)。
ARP 监视器(以及 ARP 本身)可能会对此配置感到困惑,因为 ARP 请求(由 ARP 监视器生成)将在一个接口(bond0)上发送,但相应的回复将在不同的接口(eth0)上到达。对于 ARP 来说,此回复看起来像是未经请求的 ARP 回复(因为 ARP 根据接口匹配回复),因此会被丢弃。MII 监视器不受路由表状态的影响。
此处的解决方案很简单,确保从设备没有自己的路由,如果出于某种原因必须有路由,则这些路由不会覆盖其主设备的路由。通常情况下应该是这样,但不同寻常的配置或错误的、手动或自动添加的静态路由可能会导致问题。
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 的从设备,则当 bond0 接口启动时,设备最终可能会重新排序。发生这种情况是因为 bonding 首先加载,然后是其从设备的驱动程序。由于没有加载其他驱动程序,因此当 e1000 驱动程序加载时,它将为其设备接收 eth0 和 eth1,但 bonding 配置尝试将 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 手册页。
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 没有改善故障转移,则驱动程序可能会缓存寄存器,或者问题可能出在其他地方。
此外,请记住,miimon 仅检查设备的载波状态。它无法确定交换机其他端口上或之外的设备的状态,或者交换机是否在仍然保持载波接通的情况下拒绝传递流量。
9. SNMP 代理¶
如果运行 SNMP 代理,则应在参与 bonding 的任何网络驱动程序之前加载 bonding 驱动程序。此要求是因为接口索引 (ipAdEntIfIndex) 与使用给定 IP 地址找到的第一个接口相关联。也就是说,每个 IP 地址只有一个 ipAdEntIfIndex。例如,如果 eth0 和 eth1 是 bond0 的从设备,并且 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
通过在参与 bonding 的任何网络驱动程序之前加载 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 之间的关联仍然存在,并且诸如 Interface_Scan_Next 之类的 SNMP 函数将报告该关联。
10. 混杂模式¶
在运行网络监视工具(例如 tcpdump)时,通常会启用设备的混杂模式,以便可以看到所有流量(而不是仅看到发往本地主机的流量)。bonding 驱动程序处理对 bonding 主设备(例如 bond0)的混杂模式更改,并将设置传播到从设备。
对于 balance-rr、balance-xor、broadcast 和 802.3ad 模式,混杂模式设置将传播到所有从设备。
对于 active-backup、balance-tlb 和 balance-alb 模式,混杂模式设置仅传播到活动从设备。
对于 balance-tlb 模式,活动从设备是当前接收入站流量的从设备。
对于 balance-alb 模式,活动从设备是用作“主”的从设备。此从设备用于特定于模式的控制流量,用于发送到未分配的对等方,或者如果负载不平衡。
对于 active-backup、balance-tlb 和 balance-alb 模式,当活动从设备更改时(例如,由于链路故障),混杂设置将传播到新的活动从设备。
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 模式可能适用。
11.2.2 多个交换机拓扑的 HA 链路监视选择¶
链路监视的选择最终取决于您的交换机。如果交换机可以可靠地因其他故障而使端口发生故障,则 MII 或 ARP 监视器都应起作用。例如,在上述示例中,如果“port3”链路在远程端发生故障,则 MII 监视器没有直接方法来检测到这一点。可以使用 port3 远程端的作为目标配置 ARP 监视器,从而在没有交换机支持的情况下检测到该故障。
但是,一般来说,在多个交换机拓扑中,ARP 监视器可以在检测端到端连接故障方面提供更高水平的可靠性(这可能是由于任何单个组件因任何原因未能传递流量而引起的)。此外,应使用多个目标(至少网络中每个交换机一个)来配置 ARP 监视器。这将确保,无论哪个交换机处于活动状态,ARP 监视器都有一个合适的目标来查询。
另请注意,最近许多交换机现在支持一种通常被称为“链路故障切换”的功能。这是交换机的一个特性,当另一个交换机端口的状态变为关闭(或开启)时,会导致特定交换机端口的链路状态被设置为关闭(或开启)。其目的是将链路故障从逻辑上的“外部”端口传播到逻辑上的“内部”端口,以便绑定可以通过 miimon 进行监控。链路故障切换的可用性和配置因交换机而异,但在使用合适的交换机时,这可以作为 ARP 监控器的可行替代方案。
12. 配置绑定以获得最大吞吐量¶
12.1 在单交换机拓扑中最大化吞吐量¶
在单交换机配置中,最大化吞吐量的最佳方法取决于应用程序和网络环境。如下所述,各种负载均衡模式在不同的环境中各有优缺点。
对于本文的讨论,我们将拓扑分为两类。根据大多数流量的目标,我们将其分为“网关”配置或“本地”配置。
在网关配置中,“交换机”主要充当路由器,并且大多数流量通过此路由器传递到其他网络。例如:
+----------+ +----------+
| |eth0 port1| | to other networks
| Host A +---------------------+ router +------------------->
| +---------------------+ | Hosts B and C are out
| |eth1 port2| | here somewhere
+----------+ +----------+
该路由器可以是专用路由器设备,也可以是充当网关的另一个主机。对于我们的讨论,重点是主机 A 的大多数流量在到达其最终目的地之前,将通过路由器传递到其他网络。
在网关网络配置中,尽管主机 A 可能与许多其他系统通信,但其所有流量都将通过本地网络上的另一个对等方(即路由器)发送和接收。
请注意,出于配置绑定的目的,通过多个物理链路直接连接的两个系统的情况与网关配置相同。在这种情况下,所有流量都将发送到“网关”本身,而不是网关之外的其他网络。
在本地配置中,“交换机”主要充当交换机,并且大多数流量通过此交换机传递,以到达同一网络上的其他站点。例如:
+----------+ +----------+ +--------+
| |eth0 port1| +-------+ Host B |
| Host A +------------+ switch |port3 +--------+
| +------------+ | +--------+
| |eth1 port2| +------------------+ Host C |
+----------+ +----------+port4 +--------+
同样,该交换机可以是专用交换机设备,也可以是充当网关的另一个主机。对于我们的讨论,重点是主机 A 的大多数流量都将发送到同一本地网络上的其他主机(上例中的主机 B 和 C)。
总而言之,在网关配置中,绑定设备的来回流量将发送到网络上的同一个 MAC 级对等方(即网关本身,即路由器),而与其最终目的地无关。在本地配置中,流量直接流向最终目的地,因此,每个目的地(主机 B、主机 C)都将通过其各自的 MAC 地址直接寻址。
网关和本地网络配置之间的这种区别很重要,因为许多可用的负载均衡模式使用本地网络源和目标 MAC 地址来做出负载均衡决策。以下描述每种模式的行为。
12.1.1 单交换机拓扑的 MT 绑定模式选择¶
此配置最易于设置和理解,但您必须确定哪种绑定模式最适合您的需求。下面详细介绍了每种模式的权衡。
- balance-rr
此模式是唯一允许单个 TCP/IP 连接在多个接口上进行条带化的模式。因此,它是唯一允许单个 TCP/IP 流利用多个接口的吞吐量的模式。但是,这是有代价的:条带化通常会导致对等系统接收无序的数据包,从而导致 TCP/IP 的拥塞控制系统启动,通常是通过重新传输段。
可以通过更改 net.ipv4.tcp_reordering sysctl 参数来调整 TCP/IP 的拥塞限制。通常的默认值为 3。但请记住,TCP 堆栈能够在检测到重新排序时自动增加此值。
请注意,无序传递的数据包比例变化很大,并且不太可能为零。重新排序的程度取决于多种因素,包括网络接口、交换机和配置的拓扑。一般来说,更高速的网络卡会产生更多的重新排序(由于数据包合并等因素),而“多对多”拓扑的重新排序率将高于“多慢到一快”配置。
许多交换机不支持任何条带化流量的模式(而是根据 IP 或 MAC 级地址选择端口);对于这些设备,通过交换机流向 balance-rr 绑定的特定连接的流量将不会利用超过一个接口的带宽。
如果您使用 TCP/IP 以外的协议(例如 UDP),并且您的应用程序可以容忍无序传递,那么此模式可以允许单流数据报性能随着添加到绑定中的接口数量而接近线性扩展。
此模式要求交换机为“以太通道”或“链路聚合”配置相应的端口。
- active-backup
在这种网络拓扑中,主动-备份模式没有太多优势,因为非活动备份设备都与主设备连接到同一个对等方。在这种情况下,负载均衡模式(带有链路监控)将提供相同级别的网络可用性,但具有更高的可用带宽。从好的方面来看,主动-备份模式不需要对交换机进行任何配置,因此如果可用硬件不支持任何负载均衡模式,则可能具有价值。
- balance-xor
此模式将限制流量,以便将发送到特定对等方的的数据包始终通过同一接口发送。由于目的地由相关的 MAC 地址确定,因此此模式在“本地”网络配置(如上所述)中最有效,其中目的地都在同一本地网络上。如果您的所有流量都通过单个路由器传递(即如上所述的“网关”网络配置),则此模式可能不是最佳选择。
与 balance-rr 一样,交换机端口需要配置为“以太通道”或“链路聚合”。
- broadcast
与主动-备份一样,在这种类型的网络拓扑中,此模式没有太多优势。
- 802.3ad
此模式对于这种类型的网络拓扑来说是一个不错的选择。802.3ad 模式是 IEEE 标准,因此所有实现 802.3ad 的对等方都应很好地互操作。802.3ad 协议包括聚合的自动配置,因此需要最少的手动配置交换机(通常仅指定某些设备集可用于 802.3ad)。802.3ad 标准还规定帧应按顺序传递(在一定限制范围内),因此通常单个连接不会出现数据包错乱的情况。802.3ad 模式确实有一些缺点:标准规定聚合中的所有设备都以相同的速度和双工模式运行。此外,与除 balance-rr 之外的所有绑定负载均衡模式一样,没有单个连接能够利用超过单个接口的带宽。
此外,Linux 绑定 802.3ad 实现按对等方分配流量(使用 MAC 地址和数据包类型 ID 的 XOR),因此在“网关”配置中,所有传出流量通常将使用同一设备。传入流量也可能最终出现在单个设备上,但这取决于对等方的 802.3ad 实现的均衡策略。在“本地”配置中,流量将在绑定中的设备之间分配。
最后,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.1.2 单交换机拓扑的 MT 链路监控¶
链路监控的选择很大程度上取决于您选择使用的模式。更高级的负载均衡模式不支持使用 ARP 监视器,因此被限制为使用 MII 监视器(其提供的端到端保证级别不如 ARP 监视器高)。
12.2 多交换机拓扑中的最大吞吐量¶
当多个交换机并行配置为两个或多个系统之间的隔离网络的一部分时,可以利用多个交换机来优化吞吐量,例如:
+-----------+
| Host A |
+-+---+---+-+
| | |
+--------+ | +---------+
| | |
+------+---+ +-----+----+ +-----+----+
| Switch A | | Switch B | | Switch C |
+------+---+ +-----+----+ +-----+----+
| | |
+--------+ | +---------+
| | |
+-+---+---+-+
| Host B |
+-----------+
在这种配置中,交换机彼此隔离。采用这种拓扑结构的一个原因是用于具有许多主机的隔离网络(例如,为高性能配置的集群),使用多个较小的交换机可能比单个较大的交换机更具成本效益。例如,在具有 24 个主机的网络上,三个 24 端口的交换机可能比单个 72 端口的交换机便宜得多。
如果需要访问网络之外的资源,可以为主机配备连接到外部网络的额外网络设备;该主机还会充当网关。
12.2.1 多交换机拓扑的 MT 绑定模式选择¶
在实际应用中,这种类型配置中通常采用的绑定模式是 balance-rr。历史上,在这种网络配置中,乱序数据包传递的常见问题通过使用不进行任何数据包合并的网络适配器(通过使用 NAPI,或者因为设备本身不会在收到一定数量的数据包之前生成中断)得到缓解。以这种方式使用时,balance-rr 模式允许两个主机之间的单个连接有效地利用大于一个接口的带宽。
12.2.2 多交换机拓扑的 MT 链路监控¶
同样,在实际应用中,MII 监视器最常用于此配置,因为性能优先于可用性。ARP 监视器在这种拓扑中也可以工作,但随着所涉及的系统数量的增长,它相对于 MII 监视器的优势会被所需探测的数量所抵消(请记住,网络中的每个主机都配置了绑定)。
13. 交换机行为问题¶
13.1 链路建立和故障转移延迟¶
某些交换机在链路状态上报的定时方面表现出不良行为。
首先,当链路启动时,某些交换机可能会指示链路已启动(载波可用),但在一段时间内不通过接口传递流量。此延迟通常是由于某种自动协商或路由协议造成的,但也可能发生在交换机初始化期间(例如,在交换机故障恢复期间)。如果发现这是一个问题,请为 updelay 绑定模块选项指定适当的值,以延迟相关接口的使用。
其次,某些交换机在链路状态更改时可能会多次“反弹”链路状态。这种情况最常发生在交换机初始化时。同样,适当的 updelay 值可能会有所帮助。
请注意,当绑定接口没有活动链路时,驱动程序会立即重用第一个启动的链路,即使已指定 updelay 参数(在这种情况下,将忽略 updelay)。如果有从接口正在等待 updelay 超时过期,则首先进入该状态的接口将立即被重用。如果在 updelay 值被高估的情况下,这会减少网络停机时间,并且由于这种情况仅发生在没有连接的情况下,因此忽略 updelay 不会产生额外的损失。
除了对交换机定时的考虑之外,如果您的交换机需要很长时间才能进入备份模式,则可能希望在链路断开后不立即激活备份接口。可以使用 downdelay 绑定模块选项延迟故障转移。
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 都配备了两个集成在平面(即 IBM 术语中的“主板”)上的博通千兆以太网端口。在 BladeCenter 机箱中,所有 JS20 刀片的 eth0 端口都硬连线到 I/O 模块 #1;类似地,所有 eth1 端口都连线到 I/O 模块 #2。可以在 JS20 上安装附加的博通子卡,以提供另外两个千兆以太网端口。这些端口 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 模式很常见。
balance-alb 和 balance-tlb 模式可以使用交换机模块或直通模块(或混合使用)。这些模式的唯一特定要求是,所有网络接口都必须能够到达通过绑定设备发送的流量的所有目的地(即,网络必须在 BladeCenter 之外的某个点汇聚)。
active-backup 模式没有其他要求。
链路监控问题¶
当以太网交换机模块到位时,只有 ARP 监视器才能可靠地检测到与外部交换机的链路丢失。这没什么不寻常的,但是检查 BladeCenter 机柜会表明“外部”网络端口是系统的以太网端口,而实际上,这些“外部”端口和 JS20 系统上的设备之间有一个交换机。MII 监视器只能检测到 ESM 和 JS20 系统之间的链路故障。
当直通模块到位时,MII 监视器会检测到到“外部”端口的故障,该端口直接连接到 JS20 系统。
其他注意事项¶
局域网串行 (SoL) 链路仅通过主以太网 (eth0) 建立,因此,任何到 eth0 的链路丢失都将导致您的 SoL 连接丢失。它不会与其他网络流量一起进行故障转移,因为 SoL 系统超出了绑定驱动程序的控制范围。
可能需要禁用交换机(内部以太网交换机模块或外部交换机)上的生成树,以避免在使用绑定时出现故障转移延迟问题。
15. 常见问题解答¶
1. 它是否是 SMP 安全的?¶
是的。旧的 2.0.xx 通道绑定补丁不是 SMP 安全的。新驱动程序从一开始就设计为 SMP 安全的。
2. 哪种类型的网卡可以使用它?¶
可以使用任何以太网类型的网卡(甚至可以混用网卡,例如 Intel EtherExpress PRO/100 和 3com 3c905b)。对于大多数模式,设备不需要具有相同的速度。
从 3.2.1 版本开始,bonding 也支持在主备模式下使用 Infiniband 从设备。
3. 我可以拥有多少个 bonding 设备?¶
没有限制。
4. 一个 bonding 设备可以有多少个从设备?¶
这仅受 Linux 支持的网络接口数量和/或您可以在系统中安装的网卡数量的限制。
5. 当一个从设备链路失效时会发生什么?¶
如果启用了链路监控,则会禁用故障设备。主备模式将故障转移到备用链路,而其他模式将忽略故障链路。链路将继续受到监控,如果它恢复,它将重新加入 bonding(以适合该模式的任何方式)。有关更多信息,请参阅高可用性部分和每种模式的文档。
可以通过 miimon 或 arp_interval 参数(在上面的模块参数部分中描述)启用链路监控。通常,miimon 监控底层网络设备感知的载波状态,而 arp 监控器 (arp_interval) 监控与本地网络上另一台主机的连接。
如果未配置链路监控,则 bonding 驱动程序将无法检测到链路故障,并将假定所有链路始终可用。这可能会导致数据包丢失,并导致性能下降。精确的性能损失取决于 bonding 模式和网络配置。
6. bonding 可以用于高可用性吗?¶
可以。有关详细信息,请参阅高可用性部分。
7. 它与哪些交换机/系统配合使用?¶
完整的答案取决于所需的模式。
在基本负载均衡模式(balance-rr 和 balance-xor)中,它与任何支持以太网通道(也称为链路聚合)的系统配合使用。目前可用的大多数托管交换机都支持此类功能,许多非托管交换机也支持。
高级负载均衡模式(balance-tlb 和 balance-alb)没有特殊的交换机要求,但需要支持特定功能的设备驱动程序(在上面的模块参数的相应部分中描述)。
在 802.3ad 模式下,它与支持 IEEE 802.3ad 动态链路聚合的系统配合使用。目前可用的大多数托管交换机和许多非托管交换机都支持 802.3ad。
主备模式应与任何 Layer-II 交换机配合使用。
8. bonding 设备从哪里获取其 MAC 地址?¶
当使用具有固定 MAC 地址的从设备时,或者当启用 fail_over_mac 选项时,bonding 设备的 MAC 地址是活动从设备的 MAC 地址。
对于其他配置,如果未显式配置(使用 ifconfig 或 ip link),则 bonding 设备的 MAC 地址取自其第一个从设备。然后将此 MAC 地址传递给所有后续的从设备,并保持持久性(即使第一个从设备被删除),直到 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 地址。
# ifconfig bond0 down ; modprobe -r bonding
# ifconfig bond0 .... up
# ifenslave bond0 eth...
此方法将自动从添加的下一个从设备获取地址。
要恢复从设备的 MAC 地址,您需要将它们从 bonding 中分离出来(ifenslave -d bond0 eth0
)。然后,bonding 驱动程序将恢复从设备被绑定之前所拥有的 MAC 地址。
9. 哪些 bonding 模式支持原生 XDP?¶
balance-rr (0)
active-backup (1)
balance-xor (2)
802.3ad (4)
请注意,vlan+srcmac 哈希策略不支持原生 XDP。对于其他 bonding 模式,必须以通用模式加载 XDP 程序。
16. 资源和链接¶
可以在 Linux 内核的最新版本中找到 bonding 驱动程序的最新版本,网址为 https://linuxkernel.org.cn
可以在最新的内核源代码中找到本文档的最新版本(名为 Linux 以太网 Bonding 驱动程序 HOWTO)。
有关 bonding 驱动程序开发的讨论在主要的 Linux 网络邮件列表上进行,该列表托管在 vger.kernel.org 上。列表地址为
可以在以下位置找到管理界面(用于订阅或取消订阅):