ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

系统启动后bond配置不生效问题定位

2022-02-14 22:32:06  阅读:618  来源: 互联网

标签:eth0 系统启动 network ip 网卡 initrd 生效 stage bond


背景描述

为了适配新功能,裸金属服务的磁盘镜像中做了如下修改:

  1. dracut添加network, iscsi模块
  2. grub添加rd.iscsi.firmware=1参数
  3. 删除网卡配置文件/etc/sysconfig/network-scripts/ifcfg-*
  4. 禁止network服务开机启动,防止网络中断

修改镜像后,需对裸金属服务既有功能进行测试,包括初始化密码、重置密码、从卷创建、从备份创建、重新部署、网卡bond配置等等。

环境准备

基础网段:10.33.46.0/24

裸金属节点:72a651ba-f6e7-42a0-892d-62089769ceb1,bm-11

裸金属网卡组:

  • 模式:active-backup
  • 关联网卡:eth0、eth3
  • 所属节点:72a651ba-f6e7-42a0-892d-62089769ceb1
  • 关联vif:84a48aa9-bf77-40a5-a410-a94a052cd5a7,10.33.46.186

裸金属镜像:hikos-x86_64-baremetal-cloudinit

问题描述

裸金属节点启动后发现bond配置未生效,eth0不是bond0的从属网卡,而是通过dhcp获取了ip,如下图所示:

问题排查

检查网卡配置文件,eth0、eth3、bond0的配置正常:

手动重启NetworkManager服务,eth0依然通过dhcp获取ip。

尝试ifup eth0,不生效且无任何输出;尝试ifdown eth0后再ifup,发现eth0成功变为bond0的从属网卡。

由于NetworkManager服务通过ifcfg-rh脚本来兼容/etc/sysconfig/network-scripts/目录下的网卡配置文件,本质上还是用ifup命令拉起各个网卡,因此推测在initrd阶段,eth3网卡就已经拿到ip,NetworkManager服务的启动不会对已拉起的eth3网卡做修改,才导致bond配置不生效。

测试重新制作initrd,将之前添加的network、iscsi模块忽略,重启系统后发现bond生效,因此原因应该是initrd阶段eth3网卡已拉起。

cat /etc/dracut.conf
# omit_dracutmodules+="network iscsi"
dracut -v -f -N /boot/initramfs-3.10.0-1160.49.1.el7.x86_64.img 3.10.0-1160.49.1.el7.x86_64
# 重启系统

重启后恢复initrd至原样。

解决方案

常规解决方案为在NetworkManager服务启动前刷新网卡ip,是NetworkManager能够根据网卡配置重新拉起网卡。

当裸金属从卷启动时,要求系统启动的过程中网络一直能联通,因此可以屏蔽从卷启动方式裸金属的网卡bond功能。在NetworkManager服务启动前判断是否是从卷启动,如果不为从卷启动,则刷新网卡,所使用到的命令如下:

# 搜索网卡中的iscsi配置,若搜索不到则报错
iscsiadm -m fw
# 刷新所有网卡的配置
ip addr flush scope global

最终决定在cloud-init的local阶段执行此命令,修改cloud-init的cmd/main.py文件,如下所示:

diff --git a/main.py b/main.py
index b562646..4f0d7a9 100644
--- a/test1
+++ b/test2
@@ -359,6 +359,7 @@ def main_init(name, args):
         # dhcp clients to advertize this hostname to any DDNS services
         # LP: #1746455.
         _maybe_set_hostname(init, stage='local', retry_stage='network')
+        _may_flush_ip_link()
     init.apply_network_config(bring_up=bool(mode != sources.DSMODE_LOCAL))

     if mode == sources.DSMODE_LOCAL:
@@ -712,6 +713,19 @@ def _maybe_set_hostname(init, stage, retry_stage):
                 'Failed setting hostname in %s stage. Will'
                 ' retry in %s stage. Error: %s.', stage, retry_stage, str(e))

+def _may_flush_ip_link():
+    LOG.debug("Cleaning up ip link address.")
+
+    ipsan_check_cmd = ['iscsiadm', '-m', 'fw']
+    ip_addr_cmd = ['ip', 'addr', 'flush', 'scope', 'global']
+
+    try:
+        util.subp(ipsan_check_cmd)
+
+    except Exception as e:
+        LOG.debug("iscsiadm failed to display nic iscsi info, will"
+        " flush ip link address. Error: %s", str(e))
+        util.subp(ip_addr_cmd)

 def main_features(name, args):
     sys.stdout.write('\n'.join(sorted(version.FEATURES)) + '\n')

附录

参考文档

dracut 054 (kernel.org)

# generated by dracut initrd

如果再次启动后发现仍未生效,查看网卡配置文件发现有# generated by dracut initrd的字样,这是由于dracut的ifcfg模块会写入根文件系统的网络配置,需忽略initrd的ifcfg模块。

标签:eth0,系统启动,network,ip,网卡,initrd,生效,stage,bond
来源: https://www.cnblogs.com/frankming/p/15894426.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有