集群重启后Bond网络异常问题
集群重启后Bond网络异常问题
1. 故障概述与现场时序
本次故障发生为计划性下电重启后自发产生,全程无人工修改网卡配置、无手动执行网络操作。
故障时序:
-
集群所有节点计划性下电关机;
-
整机重新上电后,部分节点 service-bond 业务网络不通;
-
手动重启 network 服务,网络故障依旧无法恢复;
-
排查发现 Bond 运行模式异常变为 mode0(round robin 轮询),不符合业务标准配置;
-
核对主配置文件
ifcfg-service-bond4,配置参数完全正确、无篡改;

-
删除目录下残留的
ifcfg-service-bond4.bak.时间戳等备份文件后,重启 network 服务,Bond 网络立即恢复正常。

2. 故障底层机制与根因
2.1 系统过滤规则固有缺陷
系统 network-functions 内置过滤规则仅过滤标准备份后缀,规则如下:
/\(~\|\.bak\|\.old\|\.orig\|\.rpmnew\|\.rpmorig\|\.rpmsave\)$/d

该规则仅拦截 .bak/.old/.orig 等常规后缀,不拦截 .bak+时间戳 格式文件,导致 ifcfg-xxx.bak.20250907 这类备份文件不会被忽略。
2.2 网络服务扫描加载逻辑
network 服务启动时,会通过ls ifcfg-* 全局遍历目录下所有 ifcfg- 前缀文件,无后缀限制。带时间戳的备份文件因不匹配过滤规则,会被纳入开机启动列表。

可以看到除上述$__sed_discard_ignored_files拦截规则外,还有如下几个规则
① -e '/\(ifcfg-lo$\|:\|ifcfg-.*-range\)/d'
筛掉几类特殊文件:
ifcfg-lo$:回环接口lo,不需要处理。- 包含
:的:通常是 VLAN 子接口,如ifcfg-eth0:1。 ifcfg-*-range:某些范围配置文件。
② -e '{ s/^ifcfg-//g; s/[0-9]/ &/ }'
s/^ifcfg-//g:去掉文件名开头的ifcfg-。
例如ifcfg-eth0→eth0,ifcfg-bond0→bond0。s/[0-9]/ &/:在每个数字前插入一个空格。
例如eth0→eth 0,eth10→eth 10,bond0→bond 0。
这样做是为了后面排序时,数字能按数值大小排,而不是按字典序排。
③ LC_ALL=C sort -k 1,1 -k 2n
-k 1,1:先按第一列(接口名前缀,如eth、bond)排序。-k 2n:再按第二列(数字部分)做数值排序。
这样eth2就会排在eth10前面,而不是字典序的eth10在eth2前。
④ LC_ALL=C sed 's/ //'
把前面插入的第一个空格删掉,还原成接口名。
例如 eth 0 → eth0,eth 10 → eth10。
最终 interfaces 变量里就是干净的接口名列表。
2.3 配置覆盖异常流程
系统全自动执行、无人工干预,异常流程如下:
-
目录同时存在正常主配置文件和带时间戳的旧备份配置文件,两者
DEVICE指向同一个 Bond 设备; -
按字典序加载,备份文件后置加载,后加载的配置全覆盖前置主配置参数;
-
旧备份文件 Bond 模式为 mode0,覆盖了业务正常 Bond 配置;
-
最终出现「主配置文件正常、系统运行配置异常」的迷惑性故障。
3. 根因总结
1. 核心根因:操作系统网络过滤机制存在局限,仅过滤标准后缀备份,无法拦截 .bak.时间戳 自定义备份文件;
2. 触发条件:网卡配置目录残留 ifcfg- 前缀、带时间戳且参数不一致的历史备份文件;
3. 故障特征:开机自动双配置加载覆盖,隐蔽性极强,常规查看主配置无法定位问题。
4. 修复方案
4.1 临时应急恢复
清理所有带时间戳的 ifcfg 备份文件并重启网络:
rm -f /etc/sysconfig/network-scripts/ifcfg-*.bak.*
systemctl restart network
4.2 长期生产规范
规避该机制缺陷,统一运维标准:
-
网卡配置目录禁止留存任意 ifcfg- 前缀备份文件(含 .bak.时间戳 格式);
-
所有配置备份统一移出默认目录,存放至独立备份目录;
-
配置变更、节点重启前,强制巡检清理冗余 ifcfg 备份文件。
5. 日常巡检命令
一键排查所有系统将自动加载的网卡配置,提前发现异常备份文件:
cd /etc/sysconfig/network-scripts
. ./network-functions
ls ifcfg-* | LC_ALL=C sed -e "$__sed_discard_ignored_files" -e '/\(ifcfg-lo$\|:\|ifcfg-.*-range\)/d'

- 点赞
- 收藏
- 关注作者


评论(0)