bond0 启不来主因是 bonding 模块未加载或网卡被 networkmanager 占用;需加载模块、启用物理网卡、禁用 networkmanager、配置交换机 lacp、统一 mtu 并正确设置绑定参数。

为什么 bond0 启不来:检查内核模块和网卡状态
Linux 多网卡绑定(bonding)失败,最常见原因是 bonding 模块没加载,或物理网卡被其他服务(比如 NetworkManager)抢占。别急着改配置,先确认底层是否就绪。
- 运行
lsmod | grep bonding,没输出就执行modprobe bonding;要开机自动加载,得往/etc/modules里加一行bonding -
ip link show看所有接口,如果eth0、eth1显示DOWN或状态异常,先用ip link set eth0 up手动启一下——很多绑定失败其实只是某张卡被 ifdown 了 - NetworkManager 默认会干扰 bonding,建议停掉:
systemctl stop NetworkManager并systemctl disable NetworkManager;CentOS/RHEL 还得在网卡配置文件里加NM_CONTROLLED=no
mode=4(802.3ad)下链路聚合不生效的典型原因
选 mode=4 是为了真正负载分担+故障切换,但它依赖交换机支持 LACP,且两端必须严格匹配。很多人配完发现流量全走一张卡,问题基本出在这儿。
- 交换机侧必须开启 LACP,并配置为
active模式(不能是passive),同时把对应端口加入同一个 LAG 组 - Linux 端的
xmit_hash_policy默认是layer2,只按 MAC 地址哈希——这意味着同一台服务器通信永远走同一条链路;换成layer2+3或layer3+4才能按 IP+端口分散 - 执行
cat /proc/net/bonding/bond0查看输出,重点看Aggregator ID是否一致、Port State是否为0x3f(表示 LACP 协商成功),若显示0x1就说明根本没握手
ifconfig 和 ip 命令对 bond 接口配置的差异影响
用 ifconfig 配置 bond0 只是临时生效,而且它不感知 bonding 子系统状态变更;而 ip 命令虽更现代,但单独设 IP 不会触发 bond 重协商。真要稳定,得靠 systemd-networkd 或 ifupdown 的配置文件驱动。
-
ifconfig bond0 192.168.1.10/24能通一时,但重启或 reload bonding 模块后就丢——因为没写进/sys/class/net/bond0/bonding/ipaddr这类控制接口 -
ip addr add 192.168.1.10/24 dev bond0也一样,只是 netlink 层操作,不通知 bonding 驱动刷新参数 - 正确做法:在
/etc/network/interfaces(Debian/Ubuntu)或/etc/sysconfig/network-scripts/ifcfg-bond0(RHEL/CentOS)中明确写入BONDING_OPTS="mode=4 miimon=100 xmit_hash_policy=layer3+4"
MTU 不一致导致 bond0 上丢包的隐蔽问题
两张物理网卡 MTU 不一样,或者 bond0 和子接口 MTU 没对齐,会导致大包被静默丢弃,tcpdump 看起来像“连接时好时坏”,查起来特别费劲。
- 检查命令:
ip link show eth0 | grep mtu、ip link show eth1 | grep mtu、ip link show bond0 | grep mtu—— 三者必须完全一致,推荐统一设为9000(jumbo frame)或保守用1500 - MTU 修改顺序很重要:必须先
ip link set eth0 down,再ip link set eth0 mtu 9000,最后ip link set eth0 up;直接改 up 状态下的 MTU 会被 bonding 驱动忽略 - 某些网卡驱动(如
igb)在 jumbo frame 下需额外启用rx offload:ethtool -K eth0 rx on,否则仍可能丢包
真正麻烦的不是怎么配,而是配完之后没人盯着 /proc/net/bonding/bond0 里的 MII Status 和 Link Failure Count。这两个值一跳变,说明链路已经在抖了,等业务报障才去看就晚了。










