Rocky 10:bond 与 VLAN 的故障切换实测
在 Rocky Linux 10.2 虚拟机(内核 6.12.0-211.16.1.el10_2)中实测:3 块 virtio 网卡(ens18 管理网、ens19/ens20 分别接两块隔离 bridge),ip link 建 active-backup bond、/proc/net/bonding 观察 Active Slave、down 掉一块验证切换、在 bond 上建 802.1Q VLAN。日志:plans/content-expansion/evidence/logs/rocky-bonding-vlan.log。
没有真实交换机:LACP(802.3ad)与交换机 trunk 配置未验证,文中标注。
为什么在 VM 里能做真切换
Section titled “为什么在 VM 里能做真切换”容器的「网卡」是 dummy 或共享宿主网络,ip link 能建 bond 但链路状态是假的。VM 的 virtio 网卡有真实 carrier:两块 vNIC 分别接两块 bridge,down 掉一块时内核 bonding 驱动会真的检测到 link down 并切换。
这和真机差在交换机侧:VM 没有对端交换机,LACP 协商无法验证;active-backup 不依赖交换机,所以能完整测。
建 bond(真网卡)
Section titled “建 bond(真网卡)”sudo nmcli device set ens19 managed nosudo nmcli device set ens20 managed nosudo ip link add bond0 type bond mode active-backup miimon 100sudo ip link set ens19 down && sudo ip link set ens20 downsudo ip link set ens19 master bond0sudo ip link set ens20 master bond0sudo ip link set ens19 up && sudo ip link set ens20 upsudo ip link set bond0 upcat /proc/net/bonding/bond0 | head -6Ethernet Channel Bonding Driver: v6.12.0-211.16.1.el10_2.0.1.x86_64Bonding Mode: fault-tolerance (active-backup)Currently Active Slave: ens19MII Status: upMII Polling Interval (ms): 100先把 slave down 再 master,是为了避免 NetworkManager 在中间态自动接管;nmcli device set ... managed no 把两块网卡从 NM 手里摘出来。
切换:看内核说了什么
Section titled “切换:看内核说了什么”sudo ip link set ens19 downsleep 3grep -E "Currently Active Slave|MII Status" /proc/net/bonding/bond0bond0: (slave ens19): link status definitely down, disabling slavebond0: (slave ens20): making interface the new active oneCurrently Active Slave: ens20MII Status: up内核日志的两行就是切换证据。再 up 回 ens19 不会自动切回(active-backup 默认不回切),要回切需设 primary= 或手动切换。

在 bond 上打 VLAN
Section titled “在 bond 上打 VLAN”sudo ip link add link bond0 name bond0.100 type vlan id 100ip -d link show bond0.100 | head -2bond0.100@bond0: <BROADCAST,MULTICAST> ... state DOWN ... vlan protocol 802.1Q id 100 <REORDER_HDR>新建的 VLAN 接口默认 DOWN,要 ip link set bond0.100 up 才承载流量。
一次真实事故:同一 bridge 上两个 bond 口会成环
Section titled “一次真实事故:同一 bridge 上两个 bond 口会成环”实验时把两块 vNIC 都接到同一块 vmbr2,然后建 bond——VM 立刻失联。原因是两块网卡在同一 L2 域:bond 的广播从一块口出去、从另一块口回来,形成环路和广播风暴。
正确做法:bond 的两个端口必须接不同的 bridge/交换机(或交换机上配 LACP 端口组)。这也是本页把 ens19/ens20 分到两块隔离 bridge 的原因。
nmcli 等价写法(未逐条执行)
Section titled “nmcli 等价写法(未逐条执行)”sudo nmcli con add type bond con-name bond0 ifname bond0 bond.options "mode=active-backup,miimon=100"sudo nmcli con add type ethernet con-name bond0-p1 ifname ens19 master bond0sudo nmcli con add type ethernet con-name bond0-p2 ifname ens20 master bond0sudo nmcli con up bond0本页用 ip link 验证内核行为;生产上建议用 nmcli 或配置管理,保证重启后仍生效。
交换机侧要求
Section titled “交换机侧要求”| 模式 | 交换机 |
|---|---|
| active-backup | 无需配置,两口同 VLAN 即可 |
| 802.3ad(LACP) | 必须配 LACP 端口组,两端速率/周期一致 |
| balance-alb | 通常无需,依赖 ARP |
VLAN 侧:交换机端口必须是 trunk 并放行对应 VLAN ID。
可播放的故障切换演示
Section titled “可播放的故障切换演示”下面的终端录制来自 Rocky Linux 10.2 虚拟机,完整记录了「建 bond → 看 Active Slave → 断开链路 → 切换 → 恢复」的顺序(.cast 只有 857 字节,默认不自动播放):
文字版(命令与输出) / Text transcript
# 1. create active-backup bond over two vNICsnmcli device set ens19 managed no; nmcli device set ens20 managed noip link add bond0 type bond mode active-backup miimon 100ip link set ens19 master bond0; ip link set ens20 master bond0ip link set bond0 up
# 2. active slave and MII statusBonding Mode: fault-tolerance (active-backup)Currently Active Slave: ens19MII Status: up
# 3. failover: take the active link downip link set ens19 downCurrently Active Slave: ens20MII Status: up
# 4. bring it back (no automatic failback)ip link set ens19 upCurrently Active Slave: ens20- 两个端口接同一 bridge/交换机:成环、广播风暴、整机失联;
- NM 与 ip link 混用:NM 会把 slave 抢回去,先
nmcli device set ... managed no; - VLAN 建了没 up:接口存在但不通;
- LACP 只在主机侧配:链路起不来。
练习:建 bond、切一次、打 VLAN
Section titled “练习:建 bond、切一次、打 VLAN”sudo ip link add bond0 type bond mode active-backup miimon 100sudo ip link set ens19 master bond0 && sudo ip link set ens20 master bond0sudo ip link set bond0 upgrep "Active Slave" /proc/net/bonding/bond0sudo ip link set ens19 down && sleep 3grep -E "Active Slave|MII Status" /proc/net/bonding/bond0sudo ip link add link bond0 name bond0.100 type vlan id 100ip -d link show bond0.100 | grep 802.1Q检查:
- down 前 Active Slave 是 ens19,down 后变成 ens20
MII Status仍为 updmesg里有making interface the new active one- VLAN 接口显示
802.1Q id 100
常见问题
active-backup 会自己切回原来的网卡吗?
默认不会。down 掉的链路恢复后,active 仍是切换后的那块;要回切需配置 primary= 或在维护窗口手动切换。
bond 的两个口能接同一台交换机吗?
active-backup 可以(但不要接同一 bridge 的两个口,会成环);802.3ad 需要交换机配 LACP 端口组,且两端参数一致。
为什么用 ip link 而不是 nmcli 做实验?
ip link 直接验证内核 bonding 行为,不受 NM 配置干扰;生产环境应用 nmcli/配置管理持久化,避免重启丢失。
- 网络排查:按症状分诊网络问题
- 静态 IP:nmcli 静态 IP
- 防火墙:firewalld rich rule