jjo*_*nic 8 linux bonding linux-networking linux-kernel lacp
Linux 绑定驱动程序是否有一个底层的管理或诊断接口来确定内部发生了什么?
多年来,我一直在 Linux 机器和 Cisco 交换机之间使用链路聚合。在设置 Linux 端根本不响应 Cisco LACP 数据包的新机器时,我会定期遇到死胡同。我对每台服务器都严格遵循一套严格的说明,但结果似乎各不相同。
无论绑定包含一个从属设备还是八个从属设备,tcpdump 都会显示来自所有绑定接口上的交换机的 LACP 数据包,并且没有数据包被传回。事实上,没有数据包是传输周期。 rx_packets
为接口显示可观的流量,但tx_packets
为零。日志中没有关于 MII 或绑定的有趣内容。甚至没有任何错误。
目前,我正在处理一个只有两个网卡的盒子。目前,我的债券中只有 eth1。显然,这是一个退化的配置。这种情况不会随着 eth0 和 eth1 在债券中而改变;当网络堆栈完全关闭时,它只会使机器更难工作。如有必要,我可以为两个 nic 重新配置它并通过管理界面 (DRAC),但我无法通过这种方式从框中复制粘贴。
一些预习:
这是今天下载的 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
Run Code Online (Sandbox Code Playgroud)
一个简写的配置:
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
Run Code Online (Sandbox Code Playgroud)
一些状态:
# 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
Run Code Online (Sandbox Code Playgroud)
来自交换机的 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
Run Code Online (Sandbox Code Playgroud)
思科方面:
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
Run Code Online (Sandbox Code Playgroud)
最终,交换机放弃,接口进入“独立”模式。如果通道组中有两个接口,它们都进入独立模式。
#show etherchannel 12 sum
Flags: I - stand-alone
Group Port-channel Protocol Ports
------+-------------+-----------+-----------
12 Po12(SD) LACP Gi1/0/15(I)
Run Code Online (Sandbox Code Playgroud)
我整天都在绞尽脑汁。我已经多次撕毁并重建 Cisco 配置。如果不是因为 tcpdump 显示到达 Linux 接口的 LACPv1 数据包,我会关注 Cisco 方面。唉,Linux 内核似乎完全忽略了这些数据包。我的下一站是内核源代码和最坏的情况,用于诊断的自定义内核。希望有人对绑定驱动程序有一些了解,以及是什么让它正确运行。
绑定驱动程序不会向用户空间公开任何 LACP 状态机调试,您需要了解代码并使用像 SystemTap 这样的内核检测,或者将您自己的调试写入您自己的绑定模块并为您的内核编译它。
然而,问题是bonding驱动认为slave宕机了:
MII Status: down
Run Code Online (Sandbox Code Playgroud)
你说你确信奴隶有链接,所以我们将忽略物理问题。
绑定/从属未正确配置并且从属管理器关闭,或者正在使用的驱动程序不支持netif_carrier()
内核内部的样式链接检测,您需要use_carrier=0
在绑定模块的选项中进行设置。
尝试将 Linux 端的下一个 LACP 属性设置为:
bond_downdelay 0
bond_updelay 0
bond_xmit_hash_policy layer3+4
bond_lacp_rate fast
Run Code Online (Sandbox Code Playgroud)
在 Cisco 端,重新创建端口通道并启用 LACP 的快速速率:
port-channel load-balance src-dst-ip
interface GigabitEthernet1/0/15
lacp rate fast
exit
Run Code Online (Sandbox Code Playgroud)
如果Cisco交换机无法设置lacp rate fast
,则需要更新其IOS。
Cisco 使用 LACP 的效果比 Linux 差。port-channel load-balance src-dst-port
如果您的 Cisco 交换机可以,请设置。