文章目录
-
- 一、环境准备与检查
-
- [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切换的详细说明
- 基本模式切换 :
- 在
BONDING_OPTS="mode=1 miimon=100"中修改mode数字即可切换模式 - 例如:
mode=0→ balance-rr,mode=1→ active-backup
- 在
- 不同模式的配置差异 :
- 命令相同:所有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"
十、注意事项
- 备份配置:配置前备份现有网络配置
- 物理连接:确保所有物理接口正确连接到交换机
- 交换机配置:根据 bonding 模式配置交换机
- 远程操作风险:配置网络时确保有物理或带外管理访问
- 测试验证:配置后进行全面测试