用nmcli配置team主备冗余的核心是:先建team逻辑接口、再加team-slave、最后只在team上配ip;顺序错或ip错配到slave上会导致失败。

直接说结论:用 nmcli 配置 team 主备冗余,核心是先建 team 逻辑接口、再加 team-slave、最后只在 team 上配 IP;顺序错或 IP 错配到 slave 上,就起不来。
为什么选 team 而不是 bond?
team 是用户态实现的链路聚合,不依赖内核模块(bonding.ko 不用手动加载),支持最多 8 块网卡,且 activebackup 模式天然适配跨交换机主备——比如 ens224 接 A 交换机、ens256 接 B 交换机,断电/拔线后自动切。bond 的 active-backup 虽然也能做,但默认依赖 carrier 检测,很多场景下物理链路已断但内核仍报 UP,team 用 ethtool 或 arp_ping 做链路探测更准。
注意:team 是 CentOS 7+/RHEL 8+ 默认支持的,Ubuntu 20.04+ 也自带 teamd,但 Debian 11 默认没装 teamd 包,得先 apt install teamd。
nmcli 创建 activebackup team 的完整命令流
假设用 ens224 和 ens256 做主备,目标 IP 是 172.16.3.40/24,网关 172.16.3.1:
-
nmcli connection add type team con-name team0 ifname team0 config '{"runner": {"name": "activebackup"}}'—— 必须指定config字符串,单引号不能少,JSON 中双引号要转义(实际敲命令时不用转,shell 会处理) -
nmcli connection modify team0 ipv4.method manual ipv4.addresses "172.16.3.40/24" ipv4.gateway "172.16.3.1" ipv4.dns "8.8.8.8"—— 所有网络参数只设在这里,team-slave连接上设ipv4.method会报错 nmcli connection add type team-slave con-name team0-ens224 ifname ens224 master team0-
nmcli connection add type team-slave con-name team0-ens256 ifname ens256 master team0—— 注意master值必须和con-name一致,大小写敏感 -
nmcli connection up team0-ens224 && nmcli connection up team0-ens256—— 必须先 up slave,再 up team0;反过来会失败 nmcli connection up team0
验证是否生效:teamdctl team0 state 看输出里 runner: activebackup 和当前 active port 是哪个;ip a s team0 看 IP 是否绑定成功。
主备切换不生效?别只盯着 ping
常见假象:拔掉主口网线后,ping 依然通,就以为冗余失效。其实可能是 ARP 缓存、中间设备缓存或 ICMP 回包走其他路径。真正要看的是:
-
teamdctl team0 state输出中active port是否已变成备用口(如从ens224变成ens256) -
cat /proc/net/team/team0查看实时端口状态,确认原主口显示link up: false - 用
tcpdump -i ens224 icmp和tcpdump -i ens256 icmp同时抓包,发 ping 时看哪个口真正在收发
如果状态没切,大概率是 link watcher 没配。默认 team 用 ethtool,但某些虚拟化环境(如 VMware)里 ethtool 检测不准,得显式加探测:
nmcli connection modify team0 team.config '{"runner": {"name": "activebackup"}, "link_watch": {"name": "arp_ping", "interval": 250, "target_host": "172.16.3.1"}}'
改完要 nmcli connection down team0 && nmcli connection up team0 重载配置。
容易被忽略的三个细节
一是 team-slave 连接不能设 autoconnect yes,否则系统启动时可能先 up slave 再 up team,导致 team 初始化失败;应该只给 team0 设 autoconnect yes,slave 保持默认 no。
二是 team 接口名(ifname)和连接名(con-name)可以不同,但实践中强烈建议一致,否则 teamdctl 查状态时容易混淆。
三是重启 NetworkManager(systemctl restart NetworkManager)会导致所有 team 连接丢失配置,因为 teamd 进程被杀,而 nmcli 不会自动重启它——必须确保 teamd 服务启用:systemctl enable --now teamd。











