Linux 绑定模式 802.3ad 未激活

Linux 绑定模式 802.3ad 未激活

在运行的服务器上Debian Stretch我配置了一个bond0802.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,并且两个端口均已启动并正在运行:

[LAG 状态[1]

单元 3/端口 1 的状态

单元 4/端口 1 的状态

同一台机器有另一个 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 升级后,现有主干配置不再起作用。存在重大更改,称为错误:

以前在 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”,并将其全部放在一个地方,例如纽带它自己接口。

即使在ifenslave1.22 版本中也存在错误,指的是ifstateDebian 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

添加此配置并重新启动网络后,一切运行正常。

相关内容