Linux 绑定驱动程序是否有一个底层管理或诊断接口来确定内部发生的情况?
多年来,我一直在 Linux 机器和 Cisco 交换机之间使用链路聚合。在设置新机器时,我时不时会遇到死胡同,Linux 端根本不响应 Cisco LACP 数据包。我严格遵循每台服务器的一组指令,但结果似乎有所不同。
无论绑定包含一个从属设备还是八个从属设备,tcpdump 都会显示所有绑定接口上都有来自交换机的 LACP 数据包,并且不会有任何数据包被传回。事实上,没有数据包被传输。 rx_packets
接口的流量显示相当大,但tx_packets
为零。日志中没有任何与 MII 或绑定相关的有趣信息。甚至没有任何错误。
目前,我正在处理一个只有两个网卡的盒子。目前,我的绑定中只有 eth1。显然,这是一个退化的配置。绑定中同时有 eth0 和 eth1 时情况不会改变;当网络堆栈完全关闭时,它只会使机器更难工作。如果需要,我可以为两个网卡重新配置它,并通过管理界面 (DRAC) 进行操作,但我不能通过这种方式从盒子中复制粘贴。
一些准备工作:
- 我测试了网卡、端口和电缆。当接口未绑定时,一切都按预期运行。
- 我已重新启动并确认模块正在正确加载。
- 我已经尝试过使用和不使用 VLAN 中继的情况;这应该没有问题,因为链路聚合发生在堆栈中的该点以下。
- 交换机具有可运行的中继通道组,可连接到其他 Linux 设备。尽管 Linux 设备的发行版、内核和硬件各不相同,但配置大致相同。
这是今天下载的debian 8.6。
Linux box 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u2
(2016-10-19) x86_64 GNU/Linux
简要配置:
iface eth1 inet manual
auto bond0
iface bond0 inet manual
slaves eth1
address 10.10.10.10
netmask 255.255.255.0
bond_mode 4
bond_miimon 100
bond_downdelay 200
bond_updelay 200
bond_xmit_hash_policy layer2+3
bond_lacp_rate slow
有人说:
# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer2+3 (2)
MII Status: down
MII Polling Interval (ms): 100
Up Delay (ms): 200
Down Delay (ms): 200
802.3ad info
LACP rate: slow
Min links: 0
Aggregator selection policy (ad_select): stable
bond bond0 has no active aggregator
Slave Interface: eth1
MII Status: down
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 78:2b:cb:5a:2b:3e
Aggregator ID: N/A
Slave queue ID: 0
来自交换机的 eth1 上的入站 tcpdump 记录:
22:18:47.333928 M 44:ad:d9:6c:8d:8f ethertype Slow Protocols (0x8809),
length 126: LACPv1, length 110
Actor Information TLV (0x01), length 20
System 44:ad:d9:6c:8d:80, System Priority 32768, Key 12,
Port 272, Port Priority 32768
State Flags [Activity, Aggregation, Synchronization,
Collecting, Distributing, Default]
Partner Information TLV (0x02), length 20
System 00:00:00:00:00:00, System Priority 0, Key 0, Port 0,
Port Priority 0
State Flags [none]
Collector Information TLV (0x03), length 16
Max Delay 32768
Terminator TLV (0x00), length 0
思科方面:
interface GigabitEthernet1/0/15
switchport trunk allowed vlan 100,101,102
switchport mode trunk
channel-group 12 mode active
end
interface Port-channel12
switchport trunk allowed vlan 100,101,102
switchport mode trunk
end
最终,交换机放弃,接口进入“独立”模式。如果通道组中有两个接口,则它们两个都进入独立模式。
#show etherchannel 12 sum
Flags: I - stand-alone
Group Port-channel Protocol Ports
------+-------------+-----------+-----------
12 Po12(SD) LACP Gi1/0/15(I)
我整天都在为此绞尽脑汁。我多次拆除并重建 Cisco 配置。如果不是 tcpdump 显示 LACPv1 数据包到达 Linux 接口,我就会查看 Cisco 端。唉,Linux 内核似乎完全忽略了这些数据包。我的下一个目标就是内核源代码,最糟糕的情况是自定义内核进行诊断。希望有人对绑定驱动程序及其正确运行的原因有所了解。
答案1
绑定驱动程序不会向用户空间公开任何 LACP 状态机调试,您需要了解代码并使用 SystemTap 等内核工具,或者将您自己的调试写入您自己的绑定模块并为您的内核进行编译。
然而,问题在于绑定驱动程序认为从属设备已关闭:
MII Status: down
您说您确信从属有链接,因此我们将忽略物理问题。
要么是绑定/从属配置不正确,要么是从属管理已关闭,要么是正在使用的驱动程序不支持netif_carrier()
内核中的样式链接检测,您需要use_carrier=0
在绑定模块的选项中进行设置。
答案2
尝试在 Linux 端将下一个 LACP 属性设置为:
bond_downdelay 0
bond_updelay 0
bond_xmit_hash_policy layer3+4
bond_lacp_rate fast
在 Cisco 端,重新创建端口通道并启用 LACP 的快速速率:
port-channel load-balance src-dst-ip
interface GigabitEthernet1/0/15
lacp rate fast
exit
如果思科交换机无法设置lacp rate fast
,则需要更新其IOS。
Cisco 的 LACP 性能不如 Linux。port-channel load-balance src-dst-port
如果您的 Cisco 交换机可以,请设置。