CentOS Stream 8 网络绑定(Bonding)配置方案

文章目录

    • 一、环境准备与检查
      • [1.1 环境](#1.1 环境)
      • [1.2 检查网络接口](#1.2 检查网络接口)
      • [1.3 修改网卡名称为 ethx 格式](#1.3 修改网卡名称为 ethx 格式)
        • [1.3.1 修改 GRUB 配置](#1.3.1 修改 GRUB 配置)
        • [1.3.2 重新生成 GRUB 配置](#1.3.2 重新生成 GRUB 配置)
        • [1.3.3 验证网卡信息](#1.3.3 验证网卡信息)
        • [1.3.4 安装必要工具 并加载bonding模块](#1.3.4 安装必要工具 并加载bonding模块)
    • [二、Bonding 模式选择](#二、Bonding 模式选择)
    • [三、配置方案(以 mode=1 为例)](#三、配置方案(以 mode=1 为例))
      • [方案1:使用 NetworkManager(推荐)](#方案1:使用 NetworkManager(推荐))
        • [3.1.1 创建 Bonding 接口](#3.1.1 创建 Bonding 接口)
        • [3.1.2 添加从属接口](#3.1.2 添加从属接口)
        • [3.1.3 激活配置](#3.1.3 激活配置)
      • 方案2:使用传统网络脚本(兼容性更好)
        • [3.2.1 创建配置文件](#3.2.1 创建配置文件)
        • [3.2.2 高级调优(可选)](#3.2.2 高级调优(可选))
        • [3.2.3 配置从属接口](#3.2.3 配置从属接口)
        • [3.2.4 重启网络服务](#3.2.4 重启网络服务)
    • [四、其他 Bonding 模式配置示例](#四、其他 Bonding 模式配置示例)
      • [4.1 Mode 0(轮询负载均衡)](#4.1 Mode 0(轮询负载均衡))
      • [4.2 Mode 4(LACP 负载均衡+高可用)](#4.2 Mode 4(LACP 负载均衡+高可用))
      • [4.3 Mode 6(自适应负载均衡)](#4.3 Mode 6(自适应负载均衡))
    • 五、验证与监控
      • [5.1 检查 Bonding 状态](#5.1 检查 Bonding 状态)
      • [5.2 监控工具](#5.2 监控工具)
      • [5.3 故障测试](#5.3 故障测试)
    • 六、优化建建议
      • [6.1 系统内核参数优化](#6.1 系统内核参数优化)
    • 七、故障排除
      • [7.1 常见问题](#7.1 常见问题)
      • [7.2 交换机配置要求](#7.2 交换机配置要求)
    • 八、脚本示例
      • [8.1 自动化配置脚本](#8.1 自动化配置脚本)
      • [8.2 使用说明](#8.2 使用说明)
    • 九、关于Mode切换的详细说明
      • [9.1 各模式关键参数示例:](#9.1 各模式关键参数示例:)
        • [9.1.1 Mode 0 (balance-rr) - 轮询](#9.1.1 Mode 0 (balance-rr) - 轮询)
        • [9.1.2 Mode 1 (active-backup) - 主备](#9.1.2 Mode 1 (active-backup) - 主备)
        • [9.1.3 Mode 4 (802.3ad) - LACP](#9.1.3 Mode 4 (802.3ad) - LACP)
        • [9.1.4 Mode 6 (balance-alb) - 自适应负载均衡](#9.1.4 Mode 6 (balance-alb) - 自适应负载均衡)
    • 十、注意事项

一、环境准备与检查

1.1 环境

IP 系统
192.168.100.200 CentOS Stream 8/RHEL 8系列

1.2 检查网络接口

bash 复制代码
# 查看网络接口信息
[root@localhost ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:1b:5f:eb brd ff:ff:ff:ff:ff:ff
    altname enp3s0
3: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:1b:5f:f5 brd ff:ff:ff:ff:ff:ff
    altname enp19s0
[root@localhost ~]#

# 备份原始配置
[root@localhost ~]# cp /etc/sysconfig/network-scripts/ifcfg-ens160 /etc/sysconfig/network-scripts/ifcfg-ens160_bak

1.3 修改网卡名称为 ethx 格式

1.3.1 修改 GRUB 配置
bash 复制代码
# 备份原始配置
[root@localhost ~]# cp /etc/default/grub /etc/default/grub.bak

# 编辑 GRUB 配置  - 找到 GRUB_CMDLINE_LINUX 行,添加net.ifnames=0 biosdevname=0
[root@localhost ~]# vi /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=cs/root net.ifnames=0 biosdevname=0 rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true
[root@localhost ~]#

关键参数:

  • net.ifnames=0:禁用 systemd 的命名规则
  • biosdevname=0:禁用 biosdevname 命名规则
1.3.2 重新生成 GRUB 配置
bash 复制代码
# 对于 BIOS 系统
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

# 对于 UEFI 系统
sudo grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

# 或者使用通用命令
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

[root@localhost ~]# ls /sys/firmware/efi
ls: cannot access '/sys/firmware/efi': No such file or directory
--- 如果该目录存在且包含文件,说明系统使UEFI启动;如果目录不存在,则使传统BIOS启动。

# 使用通用命令
[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
done
[root@localhost ~]#

# 复制一份,并命名为 eth0 网卡
[root@localhost ~]# cp /etc/sysconfig/network-scripts/ifcfg-ens160 /etc/sysconfig/network-scripts/ifcfg-eth0
[root@localhost ~]# rm -rf /etc/sysconfig/network-scripts/ifcfg-ens160
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.100.200
NETMASK=255.255.255.0
GATEWAY=192.168.100.2
DNS1=192.168.100.2
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# ls
ifcfg-ens160  ifcfg-ens160_bak  ifcfg-eth0
[root@localhost network-scripts]# vi ifcfg-eth1
[root@localhost network-scripts]# cat  ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=192.168.100.139
NETMASK=255.255.255.0
GATEWAY=192.168.100.2
DNS1=192.168.100.2
[root@localhost network-scripts]#
[root@localhost ~]# reboot  # 重启
1.3.3 验证网卡信息
bash 复制代码
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:1b:5f:eb brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    altname ens160
    inet 192.168.100.200/24 brd 192.168.100.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe1b:5feb/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:1b:5f:f5 brd ff:ff:ff:ff:ff:ff
    altname enp19s0
    altname ens224
    inet 192.168.100.139/24 brd 192.168.100.255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe1b:5ff5/64 scope link
       valid_lft forever preferred_lft forever
[root@localhost ~]#

# 查看网络接口驱动信息
[root@localhost ~]# ethtool -i eth1
driver: vmxnet3            # 驱动名称
version: 1.7.0.0-k-NAPI    # 驱动版本
firmware-version:
expansion-rom-version:
bus-info: 0000:13:00.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no
[root@localhost ~]#

#  网络设备状态概览
[root@localhost ~]# nmcli device status
DEVICE  TYPE      STATE      CONNECTION
eth0    ethernet  connected  eth0
eth1    ethernet  connected  eth1
lo      loopback  unmanaged  --
[root@localhost ~]#
1.3.4 安装必要工具 并加载bonding模块
bash 复制代码
# 安装网络工具
[root@localhost ~]# dnf install -y net-tools ethtool network-scripts

# 加载bonding模块
[root@localhost ~]# modprobe bonding

# 验证模块加载
[root@localhost ~]# lsmod | grep bonding
bonding               200704  0
tls                   110592  1 bonding
[root@localhost ~]#

# 设置开机自动加载
[root@localhost ~]# echo "bonding" | sudo tee /etc/modules-load.d/bonding.conf
bonding
[root@localhost ~]#

二、Bonding 模式选择

模式 名称 说明 推荐场景 交换机要求
mode=0 balance-rr 轮询负载均衡 需要交换机支持链路聚合的环境 需启用LACP
mode=1 active-backup 主备模式 高可用,VMware虚拟机环境 无需特殊配置
mode=4 802.3ad LACP动态聚合 负载均衡+高可用 需启用LACP
mode=6 balance-alb 自适应负载均衡 无需特殊交换机支持 无需特殊配置

注意:在VMware虚拟环境中,推荐使用mode=1(active-backup),因为VMware虚拟交换机不支持mode=0的链路聚合。

三、配置方案(以 mode=1 为例)

方案1:使用 NetworkManager(推荐)

3.1.1 创建 Bonding 接口
bash 复制代码
nmcli connection add type bond con-name bond0 ifname bond0 \
    ipv4.method manual \
    ipv4.addresses 192.168.100.140/24 \
    ipv4.gateway 192.168.100.2 \
    bond.options "mode=active-backup,miimon=100,fail_over_mac=1"
3.1.2 添加从属接口
bash 复制代码
# 假设有两个物理接口 eth0 和 eth1
sudo nmcli connection add type ethernet slave-type bond \
    con-name bond0-slave-eth0 ifname eth0 master bond0

sudo nmcli connection add type ethernet slave-type bond \
    con-name bond0-slave-eth1 ifname eth1 master bond0
    
# 查看 slave 生成的文件
cd /etc/sysconfig/network-scripts/
ls  -l
total 12
-rw-r--r-- 1 root root 382 Dec  5 03:29 ifcfg-bond0
-rw-r--r-- 1 root root 144 Dec  5 03:31 ifcfg-eth0
-rw-r--r-- 1 root root 144 Dec  5 03:31 ifcfg-bond-slave-eth0
-rw-r--r-- 1 root root 144 Dec  5 03:31 ifcfg-bond-slave-eth1

# 删除掉多余的网卡信息不然会冲突网络
rm -f ifcfg-eth0
3.1.3 激活配置
bash 复制代码
# 启用 bond0
sudo nmcli connection up bond0

# 检查状态
sudo nmcli connection show
sudo nmcli device status

方案2:使用传统网络脚本(兼容性更好)

  • 这里我使用方案2的方式去配置bond0,mode1
3.2.1 创建配置文件
bash 复制代码
# 创建 bond0 配置文件
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-bond0

内容如下:

ini 复制代码
DEVICE=bond0
NAME=bond0
TYPE=Bond
BONDING_MASTER=yes
IPADDR=192.168.100.200
NETMASK=255.255.255.0
GATEWAY=192.168.100.2
ONBOOT=yes
BOOTPROTO=static
USERCTL=no
BONDING_OPTS="mode=1 miimon=100 fail_over_mac=1"

fail_over_mac=1的作用

想象一下,你有两个朋友(eth0和eth1)一起拿着一个相同的门禁卡(MAC地址)来开门。当eth0(主接口)坏了,eth1(备用接口)需要继续用这张门禁卡开门。

  • 如果fail_over_mac=0(默认值):eth1会用自己的门禁卡开门,门禁系统(交换机)需要重新学习eth1的门禁卡,这会导致短暂的开门失败(网络中断)。
  • 如果fail_over_mac=1:eth1会继续用eth0的门禁卡开门,门禁系统不需要重新学习,开门过程无缝衔接(网络不中断)。

总结

场景 推荐模式 fail_over_mac 设置 原因
VMware 虚拟机 mode=1(主备) =1 避免 vSwitch MAC 地址重学习导致网络中断。
物理服务器 mode=1(主备) =0(默认) 物理交换机处理 MAC 迁移快,短暂中断可接受。
物理/虚拟机 mode=4(链路聚合) =2(强烈推荐) LACP 协议要求聚合端口 MAC 地址必须唯一且稳定。
物理/虚拟机 mode=0(轮询) =0(默认,或无需指定) 所有口都活动,无主备切换概念。
3.2.2 高级调优(可选)

创建 /etc/modprobe.d/bonding.conf

conf 复制代码
alias bond0 bonding
options bonding mode=1 miimon=100
3.2.3 配置从属接口
bash 复制代码
# 配置 eth0
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
ini 复制代码
TYPE=Ethernet
BOOTPROTO=static
ONBOOT=yes
DEVICE=eth0
NAME=eth0
MASTER=bond0
SLAVE=yes
bash 复制代码
# 配置 eth1
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth1
ini 复制代码
DEVICE=eth1
NAME=eth1
TYPE=Ethernet
BOOTPROTO=static
ONBOOT=yes
MASTER=bond0
SLAVE=yes
3.2.4 重启网络服务
bash 复制代码
# 重启网络,或者重启系统reboot
[root@localhost ~]# systemctl restart NetworkManager
[root@localhost ~]# systemctl status NetworkManager
● NetworkManager.service - Network Manager
   Loaded: loaded (/usr/lib/systemd/system/NetworkManager.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2025-12-03 08:05:48 EST; 3s ago
     Docs: man:NetworkManager(8)
 Main PID: 1855 (NetworkManager)
    Tasks: 4 (limit: 49262)
   Memory: 3.7M
   CGroup: /system.slice/NetworkManager.service
           └─1855 /usr/sbin/NetworkManager --no-daemon
......

# 建议使用传统的网络network,禁用掉NetworkManager

四、其他 Bonding 模式配置示例

4.1 Mode 0(轮询负载均衡)

bash 复制代码
# NetworkManager 方式

sudo nmcli connection add type bond con-name bond0 ifname bond0 \
    bond.options "mode=balance-rr,miimon=100" \
    ipv4.method manual \
    ipv4.addresses 192.168.100.200/24 \
    ipv4.gateway 192.168.100.2

4.2 Mode 4(LACP 负载均衡+高可用)

bash 复制代码
# 创建 bond0 接口,使用 LACP 模式
sudo nmcli connection add type bond con-name bond0 ifname bond0 \
    mode 802.3ad \
    ipv4.method manual \
    ipv4.addresses 192.168.100.200/24 \
    ipv4.gateway 192.168.100.2 \
    ipv4.dns 8.8.8.8 8.8.4.4 \
    bond.options "miimon=100,xmit_hash_policy=layer3+4"

4.3 Mode 6(自适应负载均衡)

bash 复制代码
sudo nmcli connection add type bond con-name bond0 ifname bond0 \
    mode balance-alb \
    bond.options "miimon=100" \
    ipv4.method manual \
    ipv4.addresses 192.168.100.200/24   \
    ipv4.gateway 192.168.100.2 

五、验证与监控

5.1 检查 Bonding 状态

bash 复制代码
# 查看 bond0 详细信息
[root@localhost ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup) (fail_over_mac active)
Primary Slave: None
Currently Active Slave: eth1
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 200
Down Delay (ms): 200
Peer Notification Delay (ms): 0

Slave Interface: eth0
MII Status: down
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 1
Permanent HW addr: 00:0c:29:ab:b7:1e
Slave queue ID: 0

Slave Interface: eth1
MII Status: up
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:ab:b7:28
Slave queue ID: 0
[root@localhost ~]#

# 查看网络接口状态
[root@localhost ~]# ip addr show bond0
4: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:0c:29:ab:b7:28 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.200/24 brd 192.168.100.255 scope global bond0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:feab:b71e/64 scope link
       valid_lft forever preferred_lft forever
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,SLAVE> mtu 1500 qdisc mq master bond0 state DOWN mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:ab:b7:1e brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    altname ens160
3: eth1: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond0 state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:ab:b7:28 brd ff:ff:ff:ff:ff:ff
    altname enp19s0
    altname ens224
4: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:ab:b7:28 brd ff:ff:ff:ff:ff:ff
[root@localhost ~]#



# 查看绑定统计信息
[root@localhost ~]# cat /sys/class/net/bond0/bonding/mode
active-backup 1
[root@localhost ~]#
[root@localhost ~]# cat /sys/class/net/bond0/bonding/slaves
eth0 eth1
[root@localhost ~]#

验证状态

  • Bonding接口状态应为UP
  • 所有从属接口状态应为UP
  • MII Status应为up

5.2 监控工具

bash 复制代码
# 实时监控
[root@localhost ~]# watch -n 1 'cat /proc/net/bonding/bond0'

# 使用 ethtool 查看接口状态
[root@localhost ~]# ethtool bond0
Settings for bond0:
        Supported ports: [  ]
        Supported link modes:   Not reported
        Supported pause frame use: No
        Supports auto-negotiation: No
        Supported FEC modes: Not reported
        Advertised link modes:  Not reported
        Advertised pause frame use: No
        Advertised auto-negotiation: No
        Advertised FEC modes: Not reported
        Speed: 10000Mb/s   # 链路速率为 20000 Mbps(20 Gbps)
        Duplex: Full       # 双工模式为全双工
        Auto-negotiation: off   # 自动协商功能已关闭
        Port: Other
        PHYAD: 0
        Transceiver: internal
        Link detected: yes   # 物理链路已连接,网卡检测到链路存在。


# 查看网络统计
[root@localhost ~]# ip -s link show bond0
4: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:ab:b7:28 brd ff:ff:ff:ff:ff:ff
    RX:  bytes packets errors dropped  missed   mcast
         90295     928      0       0       0     234
    TX:  bytes packets errors dropped carrier collsns
         84674     760      0       1       0       0
[root@localhost ~]#
# <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP>:Bond 接口状态正常,链路已连接(LOWER_UP)。
# mtu 1500:最大传输单元(MTU)为 1500 字节。

5.3 故障测试

bash 复制代码
# 模拟链路故障(临时禁用 eth0)
[root@localhost ~]# ifconfig eth0 down
[root@localhost ~]#

# 查看故障转移情况
[root@localhost ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup) (fail_over_mac active)
Primary Slave: None
Currently Active Slave: eth1  # eth1 接替eth0
MII Status: up     # 状态是 up
MII Polling Interval (ms): 100
Up Delay (ms): 200
Down Delay (ms): 200
Peer Notification Delay (ms): 0

Slave Interface: eth0  # eth0 
MII Status: down  # 状态 down
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 1
Permanent HW addr: 00:0c:29:ab:b7:1e
Slave queue ID: 0

Slave Interface: eth1
MII Status: up
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:ab:b7:28
Slave queue ID: 0
[root@localhost ~]#

# 恢复接口
[root@localhost ~]# ifconfig eth0 up
  • 注意:在VMware的虚拟环境中,mode=1(active-backup)是唯一能可靠工作的bonding模式。mode=0需要交换机支持,而VMware的虚拟交换机不支持这个功能

六、优化建建议

6.1 系统内核参数优化

bash 复制代码
# 编辑 sysctl 配置
sudo vi /etc/sysctl.d/99-bonding.conf

添加以下内容:

ini 复制代码
# 提高网络性能
net.core.netdev_max_backlog = 30000
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728

# ARP 设置(对于 active-backup 模式重要)
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1

应用配置:

bash 复制代码
sudo sysctl -p /etc/sysctl.d/99-bonding.conf

七、故障排除

7.1 常见问题

bash 复制代码
# 1. 检查 Bonding 模块是否加载
lsmod | grep bonding

# 2. 如果没有加载
sudo modprobe bonding

# 3. 永久加载
echo "bonding" | sudo tee /etc/modules-load.d/bonding.conf

# 4. 查看日志
sudo journalctl -xe -f
sudo dmesg | grep -i bond

# 5. 检查 NetworkManager 日志
sudo journalctl -u NetworkManager -f

7.2 交换机配置要求

  • Mode 0 和 Mode 4:需要交换机支持链路聚合
  • Mode 4 (LACP):需要在交换机上启用 LACP
  • Mode 6:通常无需特殊交换机配置

八、脚本示例

8.1 自动化配置脚本

bash 复制代码
#!/bin/bash
# bond-setup.sh

set -e

# 配置参数
BOND_NAME="bond0"
BOND_IP="192.168.100.140"
BOND_NETMASK="255.255.255.0"
BOND_GATEWAY="192.168.100.2"
BOND_MODE="4"  # 0=balance-rr, 1=active-backup, 4=802.3ad(4), 6=balance-alb
INTERFACES=("eth0" "eth1")

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 帮助信息
show_help() {
    echo "使用方法: $0 [选项]"
    echo ""
    echo "选项:"
    echo "  --help              显示此帮助信息"
    echo "  --mode MODE         设置bonding模式 (0-6)"
    echo "  --interfaces IF1,IF2  设置从属接口,用逗号分隔"
    echo "  --ip IP             设置bonding IP地址"
    echo "  --netmask NETMASK   设置子网掩码"
    echo "  --gateway GATEWAY   设置网关"
    echo ""
    echo "此脚本使用传统方式配置bonding,但与NetworkManager共存。"
}

# 检查 NetworkManager 状态
check_network_manager() {
    if systemctl is-active --quiet NetworkManager; then
        log_info "NetworkManager 正在运行"
        NM_RUNNING=1
    else
        log_info "NetworkManager 未运行"
        NM_RUNNING=0
    fi
}

# 检查 network 服务状态
check_network_service() {
    if systemctl is-active --quiet network; then
        log_info "network 服务正在运行"
        NETWORK_RUNNING=1
    else
        log_info "network 服务未运行"
        NETWORK_RUNNING=0
    fi
}

# 检查系统使用哪种网络管理方式
detect_network_manager() {
    log_info "检测网络管理方式..."

    # 检查是否有 NetworkManager
    if command -v nmcli &>/dev/null; then
        HAS_NM=1
    else
        HAS_NM=0
    fi

    # 检查是否有 network 服务
    if systemctl list-unit-files | grep -q 'network.service'; then
        HAS_NETWORK_SERVICE=1
    else
        HAS_NETWORK_SERVICE=0
    fi

    log_info "系统支持: NetworkManager=$HAS_NM, network服务=$HAS_NETWORK_SERVICE"
}

# 配置策略:选择使用哪种方式激活接口
choose_activation_method() {
    if [[ $NM_RUNNING -eq 1 ]]; then
        # 如果NetworkManager正在运行,我们创建配置文件但不激活接口
        # 让用户手动处理
        log_warn "NetworkManager正在运行,建议使用以下方式之一:"
        echo "  1. 临时禁用NetworkManager: systemctl stop NetworkManager"
        echo "  2. 使用nmcli手动配置bonding"
        echo "  3. 创建配置文件后重启系统"
        echo ""

        read -p "是否继续创建配置文件? (y/N): " -n 1 -r
        echo
        if [[ ! $REPLY =~ ^[Yy]$ ]]; then
            log_info "已取消操作"
            exit 0
        fi

        # 标记为仅创建配置文件
        ACTIVATION_METHOD="config_only"
    elif [[ $NETWORK_RUNNING -eq 1 ]]; then
        # 如果network服务在运行,使用它
        ACTIVATION_METHOD="network_service"
    else
        # 都没有运行,使用手动ifup
        ACTIVATION_METHOD="manual"
    fi

    log_info "使用激活方式: $ACTIVATION_METHOD"
}

# 创建配置文件(兼容两种方式)
create_config_files() {
    log_info "创建bonding配置文件..."

    # 创建bonding接口配置文件
    cat > /etc/sysconfig/network-scripts/ifcfg-"$BOND_NAME" << EOF
DEVICE=$BOND_NAME
TYPE=Bond
BONDING_MASTER=yes
IPADDR=$BOND_IP
NETMASK=$BOND_NETMASK
GATEWAY=$BOND_GATEWAY
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
NM_CONTROLLED=no
BONDING_OPTS="mode=$BOND_MODE miimon=100 downdelay=200 updelay=200"
EOF

    # 创建从属接口配置文件
    for IFACE in "${INTERFACES[@]}"; do
        log_info "配置接口: $IFACE"

        cat > /etc/sysconfig/network-scripts/ifcfg-"$IFACE" << EOF
DEVICE=$IFACE
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
NM_CONTROLLED=no
MASTER=$BOND_NAME
SLAVE=yes
EOF
    done

    # 创建modprobe配置(如果需要)
    cat > /etc/modprobe.d/bonding.conf << EOF
alias $BOND_NAME bonding
options bonding mode=$BOND_MODE miimon=100 downdelay=200 updelay=200
EOF
}

# 根据选择的方式激活接口
activate_interfaces() {
    case $ACTIVATION_METHOD in
        "config_only")
            log_warn "仅创建配置文件,未激活接口"
            log_info "请执行以下操作之一:"
            echo "  1. 重启系统"
            echo "  2. 手动加载配置:"
            echo "     modprobe bonding"
            echo "     ifdown $BOND_NAME 2>/dev/null || true"
            echo "     for iface in ${INTERFACES[@]}; do ifdown \$iface 2>/dev/null || true; done"
            echo "     ifup $BOND_NAME"
            ;;
        "network_service")
            log_info "使用network服务激活接口..."
            systemctl restart network
            ;;
        "manual")
            log_info "手动激活接口..."
            # 加载bonding模块
            modprobe bonding

            # 先关闭现有接口
            ifdown "$BOND_NAME" 2>/dev/null || true
            for IFACE in "${INTERFACES[@]}"; do
                ifdown "$IFACE" 2>/dev/null || true
            done

            # 激活接口
            for IFACE in "${INTERFACES[@]}"; do
                ifup "$IFACE"
            done
            ifup "$BOND_NAME"
            ;;
    esac

    # 等待接口稳定
    sleep 3
}

# 验证配置
verify_configuration() {
    log_info "验证bonding配置..."

    # 检查bonding接口是否存在
    if ! ip link show "$BOND_NAME" &>/dev/null; then
        log_warn "bonding接口 $BOND_NAME 未激活"

        if [[ $ACTIVATION_METHOD == "config_only" ]]; then
            log_info "这是预期的,因为NetworkManager正在运行"
            return 0
        fi
        return 1
    fi

    # 检查bonding状态
    if [[ -f "/proc/net/bonding/$BOND_NAME" ]]; then
        log_info "bonding配置成功!"
        echo "===================="
        cat "/proc/net/bonding/$BOND_NAME" | head -20
        echo "===================="
        return 0
    else
        log_warn "无法读取bonding状态"
        return 1
    fi
}

# 显示最终建议
show_final_advice() {
    echo ""
    log_info "配置完成!"
    echo ""

    if [[ $NM_RUNNING -eq 1 ]]; then
        log_warn "重要提示:NetworkManager正在运行!"
        echo "由于NetworkManager正在运行,传统配置文件可能不会立即生效。"
        echo ""
        echo "建议操作:"
        echo "1. 重启系统(推荐)"
        echo "2. 或停止NetworkManager后重启网络:"
        echo "   systemctl stop NetworkManager"
        echo "   systemctl restart network"
        echo "3. 或导入配置到NetworkManager:"
        echo "   nmcli connection load /etc/sysconfig/network-scripts/ifcfg-$BOND_NAME"
        for IFACE in "${INTERFACES[@]}"; do
            echo "   nmcli connection load /etc/sysconfig/network-scripts/ifcfg-$IFACE"
        done
    else
        echo "bonding配置已生效。"
        echo "查看状态:cat /proc/net/bonding/$BOND_NAME"
    fi

    echo ""
    echo "配置文件位置:"
    echo "  Bonding: /etc/sysconfig/network-scripts/ifcfg-$BOND_NAME"
    for IFACE in "${INTERFACES[@]}"; do
        echo "  接口 $IFACE: /etc/sysconfig/network-scripts/ifcfg-$IFACE"
    done
    echo "  模块配置: /etc/modprobe.d/bonding.conf"
}

# 主函数
main() {
    # 检测网络管理方式
    detect_network_manager
    check_network_manager
    check_network_service

    # 显示配置
    log_info "配置参数:"
    echo "  Bonding接口: $BOND_NAME"
    echo "  IP地址: $BOND_IP"
    echo "  子网掩码: $BOND_NETMASK"
    echo "  网关: $BOND_GATEWAY"
    echo "  Bonding模式: $BOND_MODE"
    echo "  从属接口: ${INTERFACES[*]}"
    echo ""

    # 确认配置
    read -p "是否继续? (y/N): " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        log_info "已取消操作"
        exit 0
    fi

    # 选择激活方式
    choose_activation_method

    # 创建配置文件
    create_config_files

    # 激活接口
    activate_interfaces

    # 验证配置
    verify_configuration

    # 显示最终建议
    show_final_advice
}

# 执行主函数
main "$@"

8.2 使用说明

bash 复制代码
# 赋予执行权限
chmod +x bond-setup.sh

# 运行脚本(需要 root 权限)
sudo ./bond-setup.sh

# 建议禁用掉NetworkManager ,是用传统的网络 Network

九、关于Mode切换的详细说明

  1. 基本模式切换
    • BONDING_OPTS="mode=1 miimon=100"中修改mode数字即可切换模式
    • 例如:mode=0 → balance-rr,mode=1 → active-backup
  2. 不同模式的配置差异
    • 命令相同:所有bond模式的创建命令基本相同
    • 参数不同:某些模式需要额外参数

9.1 各模式关键参数示例:

9.1.1 Mode 0 (balance-rr) - 轮询
ini 复制代码
BONDING_OPTS="mode=0 miimon=100 xmit_hash_policy=layer2"
9.1.2 Mode 1 (active-backup) - 主备
ini 复制代码
BONDING_OPTS="mode=1 miimon=100"
9.1.3 Mode 4 (802.3ad) - LACP
ini 复制代码
BONDING_OPTS="mode=4 miimon=100 lacp_rate=fast xmit_hash_policy=layer2+3"
9.1.4 Mode 6 (balance-alb) - 自适应负载均衡
ini 复制代码
BONDING_OPTS="mode=6 miimon=100"

十、注意事项

  1. 备份配置:配置前备份现有网络配置
  2. 物理连接:确保所有物理接口正确连接到交换机
  3. 交换机配置:根据 bonding 模式配置交换机
  4. 远程操作风险:配置网络时确保有物理或带外管理访问
  5. 测试验证:配置后进行全面测试
相关推荐
A小辣椒2 天前
TShark:Wireshark CLI 功能
linux
A小辣椒2 天前
TShark:基础知识
linux
AlfredZhao2 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao3 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334663 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪3 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush44 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5204 天前
Linux 11 动态监控指令top
linux
网络研究院4 天前
2026年网络安全
网络·安全·法律·法规·趋势·发展