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. 测试验证:配置后进行全面测试
相关推荐
Leon-Ning Liu1 小时前
【系列实验二】RAC 19C集群:CentOS 7.9 原地升级至 Oracle Linux 8.10 实战笔记
linux·数据库·oracle·centos
大聪明-PLUS1 小时前
C++编程中存在的问题
linux·嵌入式·arm·smarc
pingzhuyan1 小时前
linux运维异常(总) - 排查与修复(系统yum,docker,网络dns解析等)
linux·运维·docker·centos·shell
问道飞鱼1 小时前
【Linux知识】Shell 脚本参数详解:从基础到高级应用
linux·运维·服务器·shell
深眸财经2 小时前
汽水音乐崛起的冷思考:抖音「附属业务」能否自立?
网络
观音山保我别报错2 小时前
文件操作指南
linux·运维·服务器
-曾牛2 小时前
CSRF跨站请求伪造:原理、利用与防御全解析
前端·网络·web安全·网络安全·渗透测试·csrf·原理解析
JiMoKuangXiangQu2 小时前
Linux 内存管理 (6):slub 分配器
linux·内存管理·slab
_F_y2 小时前
Linux中gdb的使用
linux