linux服务-Bonding网卡绑定工具
Linux 网卡绑定工具 Bonding
本章重点: 网卡绑定的安装使用,绑定检查,一部分常见故障
参考:Linux双网卡绑定bond详解,Linux双网卡绑定bond详解,豆包ai
Bonding 是 Linux 系统中常用的网卡绑定技术,通过将多块物理网卡虚拟为单一设备并共享同一 IP 地址,可实现带宽扩容、负载均衡或高可用,核心原理是统一多网卡的 MAC 地址,避免直接设置同一 IP 导致的网络冲突。
一、Bonding 核心优势
- 负载均衡:多网卡协同工作,分摊网络流量,缓解单 IP 高负载场景下的服务器网络压力,常见于文件服务器等流量密集型应用。
- 冗余高可用:绑定后的网卡形成冗余链路,当某块物理网卡故障时,备用网卡自动接管服务,保障网络连接不中断。
二、常见绑定模式详解
| 模式编号 | 模式名称 | 核心策略 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|---|
| Mode 0 | balance-rr(轮转) | 按顺序在所有从属网卡上轮流发送数据包,链路故障自动切换 | 流量翻倍,带宽利用率高 | 需交换机配置端口聚合,否则可能丢包 | 高带宽需求(如文件服务器) |
| Mode 1 | active-backup(主备) | 仅一块网卡活动,其余备用,故障时自动激活备用网卡 | 冗余性强,切换稳定,无需交换机配置 | 链路利用率低(仅单卡工作) | 高可用需求(如数据库服务器) |
| Mode 3 | broadcast(广播) | 在所有从属网卡同步传输所有报文 | 容错能力突出,数据传输可靠 | 带宽占用高,无负载均衡效果 | 数据冗余传输(如关键指令下发) |
| Mode 2 | balance-xor(异或) | 基于源 MAC + 目标 MAC 哈希算法分配流量 | 无需交换机聚合,支持负载均衡 | 流量分配依赖哈希结果,可能不均 | 无交换机聚合条件的负载场景 |
| Mode 4 | 802.3ad(LACP) | 动态聚合,遵循 IEEE 802.3ad 标准,协商聚合链路 | 动态调整聚合链路,负载均衡更优 | 需交换机支持 LACP 协议,配置复杂 | 企业级高可用 + 高带宽场景 |
| Mode 5 | balance-tlb(传输负载均衡) | 基于网卡负载动态分配 outgoing 流量 | 无需交换机配置,自动适配负载 | 仅优化出站流量,入站仍单卡接收 | 出站流量密集的应用(如 Web 服务) |
| Mode 6 | balance-alb(自适应负载均衡) | 同时优化入站 + 出站流量,支持 ARP 协商分发入站流量 | 无需交换机,负载均衡效果全面 | 配置稍复杂,依赖 ARP 协议 | 无交换机聚合的全能型场景 |
三、Bonding 内核模块加载方法(CentOS 7)
-
临时加载(重启后失效)
# 加载bonding模块 [root@localhost ~]# modprobe bonding# 验证加载结果(显示bonding相关记录即为成功) [root@localhost ~]# lsmod | grep bonding bonding 152656 0 -
永久加载(开机自动生效)
-
通过 modules-load.d 配置
# 创建bonding模块加载配置文件 echo "bonding" >> /etc/modules-load.d/bonding.conf# 验证配置文件 cat /etc/modules-load.d/bonding.conf# 立即加载模块(无需重启) systemctl restart systemd-modules-load -
通过 modprobe.d 配置(兼容旧版系统)
# 创建modprobe配置文件 echo "alias bond0 bonding" >> /etc/modprobe.d/bonding.conf# 加载模块 modprobe bonding -
加载多 Bond 设备(如需创建多个 bond 接口)
# 临时加载并支持2个bond设备(bond0、bond1) modprobe bonding max_bonds=2# 永久配置多Bond设备(修改modules-load.d配置) echo "bonding max_bonds=2" >> /etc/modules-load.d/bonding.conf
-
四、CentOS7实现Bonding配置
-
准备工作
-
执行
ip a命令查询系统中待绑定的物理网卡名称(如示例中的 ens33、ens36)。 -
CentOS 7 默认启用 NetworkManager,建议临时禁用(避免配置冲突):
[root@localhost ~]# systemctl stop NetworkManager && systemctl disable NetworkManager Removed symlink /etc/systemd/system/multi-user.target.wants/NetworkManager.service. Removed symlink /etc/systemd/system/dbus-org.freedesktop.NetworkManager.service. Removed symlink /etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service. Removed symlink /etc/systemd/system/network-online.target.wants/NetworkManager-wait-online.service. -
确保系统加载 bonding
[root@localhost ~]# modprobe bonding [root@localhost ~]# lsmod | grep bonding bonding 152656 0
-
-
创建配置文件
-
环境查看
# 准备两块网卡 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc inet 192.168.189.129/24 brd 192.168.189.255 scope global noprefixroute dynamic ens33 3: ens36: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 inet 192.168.189.131/24 brd 192.168.189.255 scope global noprefixroute dynamic ens36 -
进入配置目录:
cd /etc/sysconfig/network-scripts/ -
创建bond0配置文件(以Mode 0为例,可替换为其他模式)
[root@localhost network-scripts]# cat > ifcfg-bond0 << EOF DEVICE=bond0 TYPE=Bond BONDING_OPTS="mode=0 miimon=100" # 模式为轮转,100ms链路检测间隔 IPADDR=192.168.189.132 PREFIX=24 GATEWAY=192.168.189.1 DNS1=114.114.114.114 # 可选配置DNS ONBOOT=yes BOOTPROTO=none EOF -
创建从属网卡ens33配置文件
# 先备份一下配置 [root@localhost network-scripts]# mv ifcfg-ens33{,.bak} [root@localhost network-scripts]# mv ifcfg-ens36{,.bak}[root@localhost network-scripts]# cat > ifcfg-ens33 << EOF TYPE=Ethernet BOOTPROTO=none NAME=ens33 DEVICE=ens33 ONBOOT=yes MASTER=bond0 # 关联至bond0设备 SLAVE=yes # 标记为从属网卡 EOF# 在复制一张给 ens36 [root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens36 [root@localhost network-scripts]# sed -i "s@ens33@ens36@gi" ifcfg-ens36
-
-
启动并验证配置
-
重启网络服务
# (CentOS 7推荐使用network服务), 重启完之后用 bonding地址登陆 systemctl restart network -
查看网卡状态
[root@localhost ~]# ip a 2: ens33: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000link/ether 00:0c:29:fa:dc:ff brd ff:ff:ff:ff:ff:ff 3: ens36: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000link/ether 00:0c:29:fa:dc:ff brd ff:ff:ff:ff:ff:ff 4: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000link/ether 00:0c:29:fa:dc:ff brd ff:ff:ff:ff:ff:ffinet 192.168.189.132/24 brd 192.168.189.255 scope global bond0# BROADCAST,MULTICAST,MASTER,UP,LOWER_UP 注意看这里的状态 -
查看Bonding详细信息(模式、链路状态、网卡速度等)
[root@localhost ~]# cat /proc/net/bonding/bond0 Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)Bonding Mode: load balancing (round-robin) MII Status: upSlave Interface: ens33 MII Status: up Speed: 1000 MbpsSlave Interface: ens36 MII Status: up Speed: 1000 Mbps -
单独验证绑定模式
[root@localhost ~]# cat /sys/class/net/bond0/bonding/mode balance-rr 0 -
验证成功后,将看到 bond0 设备处于 UP 状态,ens160、ens192 为 SLAVE 状态,三者 MAC 地址一致,共用 192.168.9.31IP。
ens33: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> ens36: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> MAC地址: link/ether 00:0c:29:fa:dc:ff brd ff:ff:ff:ff:ff:ff
-
-
故障切换测试
# 关闭其中一块从属网卡,验证备用网卡是否正常接管: [root@localhost ~]# ip link set ens36 down [root@localhost ~]# cat /proc/net/bonding/bond0 Bonding Mode: load balancing (round-robin) MII Status: upSlave Interface: ens33 MII Status: upSlave Interface: ens36 MII Status: down <--- 注意状态 Speed: 1000 Mbps[root@localhost ~]# ip link set ens36 up [root@localhost ~]# cat /proc/net/bonding/bond0 Slave Interface: ens36 MII Status: up <--- 注意状态
五、交换机聚合配置
-
静态聚合(适配 Mode 0) --> 以华为 Quidway 系列交换机为例:
# 清空接口原有配置(如GigabitEthernet0/0/5) interface GigabitEthernet0/0/5 undo port link-type access undo port default vlan undo ntdp enable undo ndp enable undo bpdu enable# 创建Eth-Trunk 2聚合接口 interface Eth-Trunk 2 port link-type access port default vlan [VLAN ID] # 替换为实际业务VLAN# 将接口加入聚合组 interface GigabitEthernet0/0/5 eth-trunk 2 interface GigabitEthernet0/0/6 eth-trunk 2# 查看聚合状态 dis interface Eth-Trunk -
LACP 动态聚合(适配 Mode 4)
# 交换机创建Eth-Trunk并启用LACP interface Eth-Trunk 2 port link-type access port default vlan [VLAN ID] mode lacp-static # 启用静态LACP模式# 接口加入聚合组 interface GigabitEthernet0/0/5 eth-trunk 2 interface GigabitEthernet0/0/6 eth-trunk 2# 查看LACP协商状态 dis lacp eth-trunk 2
六、常见错误排查手册
- 网络服务重启失败(Job for network.service failed)
- 排查方向:配置文件语法错误、网卡名称与实际不符、端口被占用。
- 解决步骤:
- 检查配置文件格式,确保无多余空格、引号闭合:
cat /etc/sysconfig/network-scripts/ifcfg-bond0。 - 再次执行
ip a确认网卡名称(如 ens33 而非 ens160),同步修改配置文件中的 DEVICE 和 NAME 字段。 - 查看网络服务日志定位错误:
journalctl -xe | grep network。
- 检查配置文件格式,确保无多余空格、引号闭合:
- 从属网卡未显示为 SLAVE 状态
- 排查方向:从属网卡配置缺失 MASTER/SLAVE 字段、NetworkManager 未完全禁用。
- 解决步骤:
- 检查从属网卡配置文件,确保包含
MASTER=bond0和SLAVE=yes字段。 - 彻底禁用 NetworkManager:
systemctl stop NetworkManager && systemctl disable NetworkManager && systemctl mask NetworkManager。 - 重启网络服务:
systemctl restart network,再次通过ip a验证。
- 检查从属网卡配置文件,确保包含
- Bond0 无 IP 地址或无法 ping 通网关
- 排查方向:bond 配置文件 IP/Gateway 错误、防火墙拦截、路由表异常。
- 解决步骤:
- 核对 ifcfg-bond0 中的 IPADDR、PREFIX、GATEWAY 是否与网段匹配,避免子网掩码错误。
- 临时关闭 firewalld 测试:
systemctl stop firewalld,若能通信则配置防火墙放行 bond0 接口。 - 查看路由表:
ip route,确认默认路由指向配置的网关,缺失则手动添加:ip route add default via 192.168.9.1 dev bond0。
- Mode 0 模式下流量未负载均衡(丢包 / 卡顿)
- 排查方向:交换机未配置端口聚合、聚合模式不匹配。
- 解决步骤:
- 确认交换机已创建 Eth-Trunk 聚合组,且所有从属网卡对应的交换机端口已加入该组。
- 检查交换机聚合模式是否为静态聚合(Mode 0 需静态聚合配合),避免动态聚合协议不兼容。
- 通过
ethtool -S bond0查看网卡流量统计,确认多网卡是否均有数据传输。
- 网卡故障切换失败
- 排查方向:miimon 参数配置不当、物理网卡硬件问题。
- 解决步骤:
- 调整 bond 配置中的 miimon 值(建议 50-200ms),如
BONDING_OPTS="mode=0 miimon=200",重启网络服务。 - 检查故障网卡硬件状态:
ethtool ens160,查看 Link detected 是否为 yes,若为 no 则检查网线、交换机端口。 - 查看 Bonding 故障计数:
cat /proc/net/bonding/bond0,若 Link Failure Count 持续增加,更换网线或网卡测试。
- 调整 bond 配置中的 miimon 值(建议 50-200ms),如
- 重启系统后 Bonding 配置失效
- 排查方向:bonding 模块未开机自动加载、网络服务未设置开机启动。
- 解决步骤:
- 配置 bonding 模块开机加载:
echo "bonding" >> /etc/modules-load.d/bonding.conf。 - 设置 network 服务开机启动:
systemctl enable network。 - 验证:
reboot后通过lsmod | grep bonding和ip a确认配置生效。
- 配置 bonding 模块开机加载:
七、专属注意事项
- 配置文件差异:CentOS 7 的 bond 配置文件需添加
TYPE=Bond字段,与 CentOS 6 的配置格式区分。 - 网络服务管理:优先使用
network服务而非NetworkManager,避免配置不生效。 - 内核模块:若系统未自动加载 bonding 模块,可通过
/etc/modules-load.d/bonding.conf配置开机自动加载。 - 防火墙放行:若启用 firewalld,需确保 bond0 接口的相关端口或服务放行,避免网络不通。
- 模式选择:根据业务需求选择合适模式,无需交换机配置可优先选 Mode 1/5/6,需高带宽 + 高可用可选 Mode 4(LACP)。
八、Bonding 配置验证工具脚本
-
示例
#!/bin/bash # Bonding配置验证工具(CentOS 7)- 修复版 # 修复点:1. 精准识别bond接口 2. 增加参数空值校验 3. 优化从属网卡检测逻辑# 定义颜色输出 RED="\033[31m" GREEN="\033[32m" YELLOW="\033[33m" BLUE="\033[34m" RESET="\033[0m"# 检查脚本运行权限(需root) if [ "$(id -u)" -ne 0 ]; thenecho -e "${RED}[ERROR] 请使用root权限运行脚本(sudo ./bond_verify.sh)${RESET}"exit 1 fi# 1. 基础环境验证(模块+网络服务) echo -e "\n${BLUE}===== 1. 基础环境验证 =====" ${RESET} echo -n "验证bonding内核模块加载:" if lsmod | grep -q "bonding"; thenecho -e "${GREEN}[OK]${RESET}"MODULE_STATUS=0 elseecho -e "${RED}[FAIL]${RESET}"echo -e "${YELLOW}[WARNING] bonding模块未加载,尝试临时加载...${RESET}"modprobe bonding >/dev/null 2>&1if lsmod | grep -q "bonding"; thenecho -e "${GREEN}[SUCCESS] 临时加载bonding模块成功${RESET}"MODULE_STATUS=0elseecho -e "${RED}[ERROR] 加载bonding模块失败,请检查内核配置${RESET}"MODULE_STATUS=1fi fiecho -n "验证network服务状态:" if systemctl is-active --quiet network; thenecho -e "${GREEN}[OK]${RESET}" elseecho -e "${RED}[FAIL]${RESET}"echo -e "${YELLOW}[WARNING] network服务未启动,尝试启动...${RESET}"systemctl start network >/dev/null 2>&1if systemctl is-active --quiet network; thenecho -e "${GREEN}[SUCCESS] network服务启动成功${RESET}"elseecho -e "${RED}[ERROR] network服务启动失败,日志:journalctl -xe | grep network${RESET}"exit 1fi fi# 2. Bond接口存在性验证(仅识别bond开头的接口,修复核心问题) echo -e "\n${BLUE}===== 2. Bond接口验证 =====" ${RESET} # 仅过滤名称为bond0、bond1等的接口,排除物理网卡 BOND_INTERFACES=$(ip -o link show | awk '{print $2}' | sed 's/://' | grep -E '^bond[0-9]+$') if [ -z "$BOND_INTERFACES" ]; thenecho -e "${RED}[ERROR] 未检测到真实的bond接口(需命名为bond0、bond1等)${RESET}"echo -e "${YELLOW}[提示] 请先配置bond接口,再运行脚本验证${RESET}"exit 1 elseecho -e "检测到有效bond接口:${GREEN}$BOND_INTERFACES${RESET}" fi# 3. 详细验证每个bond接口 for BOND in $BOND_INTERFACES; doecho -e "\n${BLUE}----- 验证bond接口:$BOND -----${RESET}"# 3.1 接口状态验证echo -n "接口状态(UP/DOWN):"if ip link show "$BOND" | grep -q "UP"; thenecho -e "${GREEN}[UP]${RESET}"elseecho -e "${RED}[DOWN]${RESET}"echo -e "${YELLOW}[WARNING] 尝试激活接口:ip link set $BOND up${RESET}"ip link set "$BOND" up >/dev/null 2>&1fi# 3.2 IP配置验证echo -n "IP地址配置:"IP_ADDR=$(ip -4 addr show "$BOND" | grep -oP '(?<=inet\s)\d+(\.\d+){3}/\d+' | head -1)if [ -n "$IP_ADDR" ]; thenecho -e "${GREEN}$IP_ADDR${RESET}"elseecho -e "${RED}[未配置]${RESET}"echo -e "${YELLOW}[WARNING] bond接口未配置IP,请检查ifcfg-$BOND文件${RESET}"fi# 3.3 从属网卡验证(优化读取逻辑,避免报错)echo -n "从属网卡数量:"if [ -f "/proc/net/bonding/$BOND" ]; then# 精准提取从属网卡名称,排除空行SLAVE_LIST=$(grep -E '^Slave Interface:' /proc/net/bonding/$BOND | awk '{print $3}')SLAVE_NICS=$(echo "$SLAVE_LIST" | wc -w)if [ "$SLAVE_NICS" -ge 2 ]; thenecho -e "${GREEN}$SLAVE_NICS 块${RESET}"echo -e "从属网卡列表:$SLAVE_LIST"elseecho -e "${RED}$SLAVE_NICS 块(不足2块,无法实现冗余/负载均衡)${RESET}"echo -e "当前从属网卡:$SLAVE_LIST"fielseecho -e "${RED}[读取失败]${RESET}"echo -e "${YELLOW}[WARNING] 未找到/proc/net/bonding/$BOND,可能配置未生效${RESET}"fi# 3.4 绑定模式验证echo -n "绑定模式:"if [ -f "/proc/net/bonding/$BOND" ]; thenBOND_MODE=$(grep "Bonding Mode:" /proc/net/bonding/$BOND | awk -F': ' '{print $2}')if [ -n "$BOND_MODE" ]; thenecho -e "${GREEN}$BOND_MODE${RESET}"elseecho -e "${RED}[未知]${RESET}"fielseecho -e "${RED}[读取失败]${RESET}"fi# 3.5 链路检测间隔验证(增加空值校验,修复整数表达式错误)echo -n "链路检测间隔(miimon):"MIIMON_PATH="/sys/class/net/$BOND/bonding/miimon"if [ -f "$MIIMON_PATH" ]; thenMIIMON=$(cat "$MIIMON_PATH")# 校验是否为整数if [[ "$MIIMON" =~ ^[0-9]+$ ]]; thenif [ "$MIIMON" -ge 50 ] && [ "$MIIMON" -le 200 ]; thenecho -e "${GREEN}$MIIMON ms(正常范围)${RESET}"elseecho -e "${YELLOW}$MIIMON ms(建议调整为50-200ms)${RESET}"fielseecho -e "${RED}$MIIMON(非整数,配置异常)${RESET}"fielseecho -e "${RED}[未配置]${RESET}"echo -e "${YELLOW}[WARNING] 请在ifcfg-$BOND中添加BONDING_OPTS=\"miimon=100\"${RESET}"fi# 3.6 连通性测试(ping网关)if [ -n "$IP_ADDR" ]; thenecho -n "网关连通性测试:"GATEWAY=$(ip route show default | awk '{print $3}' | head -1)if [ -n "$GATEWAY" ]; thenping -c 2 -W 1 "$GATEWAY" >/dev/null 2>&1if [ $? -eq 0 ]; thenecho -e "${GREEN}[可达](网关:$GATEWAY)${RESET}"elseecho -e "${RED}[不可达](网关:$GATEWAY)${RESET}"fielseecho -e "${YELLOW}[无默认网关]${RESET}"fifi done# 4. 故障切换功能测试(可选) echo -e "\n${BLUE}===== 3. 故障切换测试(可选) =====" ${RESET} read -p "是否执行故障切换测试?(会临时关闭一块从属网卡,y/n):" TEST_CHOICE if [ "$TEST_CHOICE" = "y" ] || [ "$TEST_CHOICE" = "Y" ]; thenBOND_TEST=$(echo "$BOND_INTERFACES" | head -1)if [ -f "/proc/net/bonding/$BOND_TEST" ]; thenSLAVE_TEST=$(grep -E '^Slave Interface:' /proc/net/bonding/$BOND_TEST | awk '{print $3}' | head -1)if [ -n "$SLAVE_TEST" ]; thenecho -e "\n${YELLOW}[TEST] 临时关闭从属网卡:$SLAVE_TEST${RESET}"ip link set "$SLAVE_TEST" downsleep 2echo -n "故障切换后bond状态:"if ip link show "$BOND_TEST" | grep -q "UP"; thenecho -e "${GREEN}[正常]${RESET}"echo -e "详细状态(从属网卡):"grep -A 3 "Slave Interface:" /proc/net/bonding/$BOND_TEST | grep -E "Slave Interface|State"elseecho -e "${RED}[异常]${RESET}"fiecho -e "\n${YELLOW}[TEST] 恢复从属网卡:$SLAVE_TEST${RESET}"ip link set "$SLAVE_TEST" upelseecho -e "${RED}[ERROR] $BOND_TEST 无可用从属网卡用于测试${RESET}"fielseecho -e "${RED}[ERROR] 无法读取$BOND_TEST 配置,测试终止${RESET}"fi fi# 5. 总结报告 echo -e "\n${BLUE}===== 验证总结 =====" ${RESET} if [ "$MODULE_STATUS" -eq 0 ] && [ -n "$BOND_INTERFACES" ]; thenecho -e "${GREEN}[整体状态:正常]${RESET}"echo -e "建议:定期通过 ./bond_verify.sh 检查bond状态,确保高可用" elseecho -e "${RED}[整体状态:异常]${RESET}"echo -e "请根据上述错误提示修复配置后重新验证" fiexit 0 -
测试
[root@localhost ~]# bash check.sh ===== 1. 基础环境验证 ===== 验证bonding内核模块加载:[OK] 验证network服务状态:[OK]===== 2. Bond接口验证 ===== 检测到有效bond接口:bond0----- 验证bond接口:bond0 ----- 接口状态(UP/DOWN):[UP] IP地址配置:192.168.189.132/24 从属网卡数量:2 块 从属网卡列表:ens33 ens36 绑定模式:load balancing (round-robin) 链路检测间隔(miimon):100 ms(正常范围) 网关连通性测试:[不可达](网关:192.168.189.1)===== 3. 故障切换测试(可选) ===== 是否执行故障切换测试?(会临时关闭一块从属网卡,y/n):y[TEST] 临时关闭从属网卡:ens33 故障切换后bond状态:[正常] 详细状态(从属网卡): Slave Interface: ens33 Slave Interface: ens36[TEST] 恢复从属网卡:ens33===== 验证总结 ===== [整体状态:正常] 建议:定期通过 ./bond_verify.sh 检查bond状态,确保高可用
