在运行的服务器上Debian Stretch我配置了一个bond0与802.3ad 模式如下:
auto bond0
iface bond0 inet manual
slaves eth0 eth2
bond_miimon 100
bond_mode 802.3ad
这bond0接口已启动并运行,但它正在与负载平衡(循环)模式:
root@servir01:~# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
Bonding Mode: load balancing (round-robin)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 2
Permanent HW addr: e4:1f:13:65:f0:c4
Slave queue ID: 0
Slave Interface: eth2
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 2
Permanent HW addr: e4:1f:13:36:a3:ac
Slave queue ID: 0
在交换机上,已正确创建 LAG,并启用了 LACP,并且两个端口均已启动并正在运行:
[
同一台机器有另一个 Bond 接口(eth1 和 eth3 接口上的 bond1)以完全相同的方式配置,连接到相同的交换机,并且 LACP 运行良好:
Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer2 (0)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
802.3ad info
LACP rate: slow
Min links: 0
Aggregator selection policy (ad_select): stable
System priority: 65535
System MAC address: e4:1f:13:65:f0:c6
Active Aggregator Info:
Aggregator ID: 1
Number of ports: 2
Actor Key: 9
Partner Key: 1010
为什么 bond0 接口不想启用 LACP?我错在哪里?
答案1
这是一个老问题,但因为它在搜索中出现得相当早,而且我有一个类似的设置,也遇到了同样的问题。下面是我让它工作的方法(在 Debian stretch 上使用 ifenslave)...
/etc/网络/接口...
# The loopback network interface
auto lo
iface lo inet loopback
# bond0 is the bonded NIC and can be used like any other normal NIC.
# bond0 is configured using static addressing.
auto bond0
iface bond0 inet static
address <your static address>
gateway <your gateway>
# bond0 uses standard IEEE 802.3ad LACP bonding protocol
bond-mode 4
bond-miimon 100
bond-lacp-rate 0 (This is on a small NAS, so no rush)
bond-slaves none
# eth0 is manually configured, and enslaved to the "bond0" pseudo NIC
allow_hotplug eth0
auto eth0
iface eth0 inet manual
bond-master bond0
# eth1 ditto, thus creating a 2-link bond.
allow_hotplug eth1
auto eth1
iface eth1 inet manual
bond-master bond0
原因何在?
那么,NIC 就会启动,绑定驱动程序就会抓住它们,然后 NIC 会关闭以重新配置为从属设备,而绑定驱动程序会因为没有从属设备而感到恐慌,然后像无头鸡一样跑来跑去(循环)。
现在,绑定驱动程序启动了,发现它没有从属设备,因此它坐下来等待...NIC 发现它们有一个主设备,因此它们前去报告,从 bond0 获取它们的地址,然后它们都开始工作。
答案2
在 debian 10 上测试(阅读此线程和 debian 绑定文档后)
配置如下(没有编辑其他文件 - 模块或类似的东西)
auto enp4s0f2
allow-hotplug enp4s0f2
iface enp4s0f2 inet manual
bond-master bond1
bond-mode 4
auto enp4s0f3
allow-hotplug enp4s0f3
iface enp4s0f3 inet manual
bond-master bond1
bond-mode 4
auto bond1
iface bond1 inet static
address 1.2.3.4
netmask 255.255.255.0
bond-mode 4
bond-slaves none
bond-miimon 100
bond-lacp-rate 1
bond-updelay 800
bond-downdelay 400
bond_xmit_hash_policy layer2+3 # optional, sets the bonding algorithm
什么是新的:
- 接口在绑定之前启动
- 绑定模式也在接口级别指定
- 该债券没有定义奴隶
答案3
花了几天时间将 Debian 10 buster 升级(完全升级)到 Debian 11 Bullseye,因此想分享粘合问题解决方案。
Debian Linux 升级后,现有主干配置不再起作用。存在重大更改,称为错误:
- https://www.debian.org/releases/bullseye/amd64/release-notes/ch-information.html
- https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=990428
- https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=968368
以前在 Debian 10 上 bond0 的工作配置如下:
cat /etc/network/interfaces.d/bond0
auto enp9s0f0
iface enp9s0f0 inet manual
bond-master bond0
bond-mode 4
auto enp9s0f1
iface enp9s0f1 inet manual
bond-master bond0
bond-mode 4
auto bond0
iface bond0 inet static
address 192.168.23.1
network 192.168.23.0
netmask 255.255.255.128
bond-slaves none
bond-miimon 100
bond-lacp-rate 1 # 'fast' detection, every 1s, instead of 'slow', every 30s
# bond-updelay 100 # optional, mostly for debugging
# bond-downdelay 100 # optional, mostly for debugging
bond-xmit-hash-policy layer2+3 # optional, sets the bonding algorithm
结果没有bond0配置甚至出现如下错误:
RTNETLINK answers: Cannot assign requested address
run-parts: /etc/network/if-pre-up.d/ifenslave exited with return code 1
networking.service: Main process exited, code=exited, status=1/FAILURE
或者
journalctl -n -u networking
显示错误行
No iface stanza found for master
其中“stanza”是所谓的模块配置,是开发人员使用的术语。
其根本原因是该ifenslave
软件包被大量重构,主要思想是从子项(即物理接口 (nic))中删除“stanza”,并将其全部放在一个地方,例如纽带它自己接口。
即使在ifenslave
1.22 版本中也存在错误,指的是ifstate
Debian 11 中不存在的命令。简单快捷的解决方法是:
sed -i 's/ifstate -l/ip link show dev/g' /etc/network/if-pre-up.d/ifenslave
即使修复了这个问题,粘合仍然不起作用,这意味着存在导致粘合在 Bullseye 上不起作用的问题。
通过代码我发现关键的变化不仅仅是bond-mode
从 child 中移除并放回纽带界面配置,就像早期的软件包一样,但也恢复到了早期的格式bond-slaves
。
因此,工作的 Debian 11 Bullseye 绑定配置文件如下所示:
cat /etc/network/interfaces.d/bond0
auto enp9s0f0
iface enp9s0f0 inet manual
bond-master bond0
auto enp9s0f1
iface enp9s0f1 inet manual
bond-master bond0
auto bond0
iface bond0 inet static
address 192.168.23.1
network 192.168.23.0
netmask 255.255.255.128
bond-mode 4
bond-slaves enp9s0f0 enp9s0f1
bond-miimon 100
bond-lacp-rate 1 # 'fast' detection, every 1s, instead of 'slow', every 30s
# bond-updelay 100 # optional, mostly for debugging
# bond-downdelay 100 # optional, mostly for debugging
bond-xmit-hash-policy layer2+3 # optional, sets the bonding algorithm
2022 年更新:
最近,我在一台金属服务器上遇到了问题,在内核升级并删除旧内核后,系统变得没有网络。长话短说 - 可能存在绑定内核模块未加载、不存在或由于版本混淆或 initrd 混乱而导致加载失败的情况。使用以下命令检查:
lsmod | grep bond
bonding 167936 0
如果不存在,则这是问题的根源。尝试手动加载模块modprobe bonding
并检查它是否加载。调查加载的内核版本是否与预期的版本相对应uname -r
,并检查该版本的模块目录是否存在。
参考:https://www.kernel.org/doc/Documentation/networking/bonding.txt
答案4
我通过在债券配置中添加以下内容解决了这个问题/etc/network/interfaces
:
bond_xmit_hash_policy layer2+3
添加此配置并重新启动网络后,一切运行正常。