背景描述

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

  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模块。

系统启动后bond配置不生效问题定位的更多相关文章

  1. 案例解析:springboot自动配置未生效问题定位(条件断点)

    Spring Boot在为开发人员提供更高层次的封装,进而提高开发效率的同时,也为出现问题时如何进行定位带来了一定复杂性与难度.但Spring Boot同时又提供了一些诊断工具来辅助开发与分析,如sp ...

  2. 记一次Linux修改MySQL配置不生效的问题

    背景 自己手上有一个项目服务用的是AWS EC2,最近从安全性和性能方面考虑,最近打算把腾讯云的MySQL数据库迁移到AWS RDS上,因为AWS的出口规则和安全组等问题,我需要修改默认的3306端口 ...

  3. 重装ArchLinux后修改GRUB配置不生效问题的解决

    重装ArchLinux后修改GRUB配置不生效问题的解决 mount指令看一下挂载,或者vim /etc/fstab看一下有没有/boot,看看fstab是不是没写进去.... 我特喵昨天重装完Arc ...

  4. 基于iSCSI的SQL Server 2012群集测试(二)--SQL群集安装后初始化配置测试

    4.群集安装后初始化配置测试 4.1 禁用full-text 服务和Browser服务 Full-text服务:公司目前暂不使用,需在两个节点上分别禁用 Browser服务:为保证安全,建议将Brow ...

  5. Charles使用问题, iOS7的http代理(http proxy)配置不生效问题

    Charles配合iOS7使用时, 发现iOS7的http代理(http proxy)配置不生效, 代理信息写完后, 系统没有自动保存. 解决方法: 将些wifi忽略, 重新连接, 再配置代理就好了.

  6. Centos6系列Bond配置方法

    在Windows Server平台因业务需求经常会用到NIC双网卡绑定,同样Linux平台下用于网络负载均衡及网络冗余会用到bond模式. Bond模式:0-6,即7种模式. 模式一:mod=0 ,即 ...

  7. Ubuntu系统启动后停在(initramfs)

    问题 今天我在启动虚拟机过程 遇到莫名其妙的问题,启动不了.如下图.提示某个文件系统错误了.例如我的就是 /dev/mapper/vagrant--vg-root . 上面问题 可把我急坏了,以为虚拟 ...

  8. windows Redis绑定ip无效,Redis设置密码无效,Windows Redis 配置不生效, Windows Redis requirepass不生效

    windows Redis绑定ip无效,Redis设置密码无效,Windows Redis 配置不生效, Windows Redis requirepass不生效 >>>>&g ...

  9. centos7.x网卡bond配置

    本文摘抄自 https://www.cnblogs.com/liwanggui/p/6807212.html centos7网卡bond配置 centos7网卡bond配置 1 备份网卡配置文件2 使 ...

随机推荐

  1. 【JDBC】学习路径1-JDBC背景知识

    学习完本系列JDBC课程后,你就可以愉快使用Java操作我们的MySQL数据库了. 各种数据分析都不在话下了. 第一章:废话 JDBC编程,就是写Java的时候,调用了数据库. Java Databa ...

  2. 【java】学习路径45-多线程-线程生命周期

    线程分为五大状态:新建.就绪.运行.阻塞.死亡. New,Runnable,Running,Blocked,Terminated. 新建状态(New: 创建好一个系统对象,在调用start()之前,线 ...

  3. mac_VMWare安装总结

    MacOS 安装VmWare 总结 如果之前安装过virtualBox,virtualBox的内核扩展会影响到VmWare的使用 *比如会导致VMWare虽然可以安装,却无法创建虚拟机 这是需要执行以 ...

  4. Docker_删除所有容器

    删除所有容器 docker rm `docker ps -aq`

  5. [Python]-字典-实践经验总结

    字典是Python中常用的一个数据类型. 与列表有相似的用法,表现在列表的下标和字典的键值可以通过相似的方式读取数据: list_name[0] = value dict_name['key'] = ...

  6. 我眼中的大数据(二)——HDFS

    Hadoop的第一个产品是HDFS,可以说分布式文件存储是分布式计算的基础,也可见分布式文件存储的重要性.如果我们将大数据计算比作烹饪,那么数据就是食材,而Hadoop分布式文件系统HDFS就是烧菜的 ...

  7. 第一个Java代码的编写 :HelloWorld代码的编写

    HelloWorld代码的编写 创建一个新的文件夹,通过Notepad++编写第一个Java程序 , 文件名为"Hello.java" 在文件中编写,如下代码: public cl ...

  8. day03-3私聊功能

    多用户即时通讯系统03 4.编码实现02 4.4功能实现-私聊功能实现 4.4.1思路分析 客户端 - 发送者: 用户在控制台输入信息,客户端接收内容 将消息构建成Messgae对象,通过对应的soc ...

  9. Object.keys的‘诡异’特性,你值得收藏!

    先从'诡异'的问题入手 例1: 纯Number类型的属性 const obj = { 1: 1, 6: 6, 3: 3, 2: 2 } console.log('keys', Object.keys( ...

  10. ProxySQL 密码管理

    ProxySQL是一个协议感知的proxy.由于ProxySQL基于流量进行路由,当一个客户端连接ProxySQL时,它还无法识别它的目标主机组,因此ProxySQL需要对该客户端进行认证.基于此,需 ...