问题表现

在我的 OpenStack 集群上迁移了一批老旧的镜像(从其他三方云平台过来的)发现这批镜像在使用 ConfigDrive 的方式注入配置初始化时无法对非首张网卡镜像初始化(后经过测试非 ConfigDrive 的数据源也不行)。

排查路径

首先检查 cloud-init 是否是正常工作的

实例化镜像查看 cloud-init 服务, 以及相关日志。

systemctl status cloud-init
systemctl status cloud-init-local

服务均正常启用。

再查看 Cloud-init 的初始化日志

[   19.254076] cloud-init[1483]: Cloud-init v. 0.7.5 finished at Tue, 02 Jul 2024 06:28:30 +0000. Datasource DataSourceConfigDriveNet [net,ver=2][source=/dev/sr0].  Up 19.24 seconds

可以看到有类似读取到数据源并实例化的日志。基本上可以可以排除 cloud-init 运行不正常的情况。

cloud-init 调试

只能细化cloud-init初始化的流程。

关于cloud-init 运行阶段的讲述推荐这篇文章,我此处不多赘述。https://www.cnblogs.com/frankming/p/16281447.html

此处给出快速重重跑初始化的脚本

# centos7
#! /bin/bash
cloud-init clean
rm -rf /var/run/cloud-init/
rm -rf /var/lib/cloud/
rm -rf /etc/sysconfig/network-scripts/ifcfg-* # local 阶段数据源准备
cloud-init init --local # 网络阶段, 渲染数据
cloud-init init # 执行模块
cloud-init modules --mode=config
# centos6
#! /bin/bash
rm -rf /var/run/cloud-init/
rm -rf /var/lib/cloud/
rm -rf /etc/sysconfig/network-scripts/ifcfg-* # local 阶段数据源准备
cloud-init init --local # 网络阶段, 渲染数据
cloud-init init # 执行模块
cloud-init modules --mode=config

很遗憾,在重跑初始化流程中未看出端疑,对比可以初始化多张网卡的日志(CentOS7系统上),总感觉 CentOS6 在网卡配置阶段无任务操作。于是拖下了 Cloud-init 的源码码进行静态审计+Print大发。

源码路径:

/usr/lib/python2.6/site-packages/cloudinit

定位到 Cloud-init 7.5 的这个位置

...
# sources/DataSourceConfigDrive.py +166
def read_config_drive(source_dir, version="2012-08-10"):
reader = openstack.ConfigDriveReader(source_dir)
finders = [
(reader.read_v2, [], {'version': version}),
(reader.read_v1, [], {}),
]
excps = []
for (functor, args, kwargs) in finders:
try:
return functor(*args, **kwargs)
except openstack.NonReadable as e:
excps.append(e)
raise excps[-1]
...
...
# sources/DataSourceConfigDrive.py +59
def get_data(self):
found = None
md = {}
results = {}
if os.path.isdir(self.seed_dir):
try:
results = read_config_drive(self.seed_dir)
found = self.seed_dir
except openstack.NonReadable:
util.logexc(LOG, "Failed reading config drive from %s",
self.seed_dir)
if not found:
for dev in find_candidate_devs():
try:
results = util.mount_cb(dev, read_config_drive)
found = dev
except openstack.NonReadable:
...

可以看到在挂载 /dev/sr0 设备后,cloud-init 0.7.5 版本使用的是 2012-08-10 数据源

手动挂载并查看

[root@aa home]# mount /dev/sr0 /mnt/
mount: /dev/sr0 is write-protected, mounting read-only
[root@aa home]# ls /mnt/
ec2 openstack
[root@aa home]# ls /mnt/openstack/2012-08-10/
meta_data.json user_data

好哇,根本没有network_data.json这种东西。看相关网络配置的初始化,验证网络初始逻辑只给ubuntu做了适配。得出结果,Cloud-init 0.7.5 版本过低,centos7支持差导致。

解决方案

解决方案大致有两种:

1. 升级 Cloud-init
2. 手工实现 Cloud-init 网络初始化部分的逻辑

解决方案一

升级的话首选需要升级Python版本,本人未采用升级的方案,所以不多赘述,但是是一定可行的,推荐手动升级Python 并源码安装 Cloud-init。

解决方案二

推荐像本人一样参考高版本的 cloud-init 驱动实现逻辑手工用 go 或者 C 语言这种重新写一个补丁,经测试可行。由于这个组件是为公司开发的,不方便开源,但是欢迎交流。

OpenStack 下 CentOS6.X 镜像网络初始化失败问题排查的更多相关文章

  1. VMware下centos6.3minimal搭建网络环境

    VMware提供3钟连接网络的方式,参看http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/03/15/1985084.html 先确定VMw ...

  2. CentOS 7下Java的SecureRandom种子初始化失败解决办法

    io.netty.util.internal.ThreadLocalRandom getInitialSeedUniquifierWARNING: Failed to generate a seed ...

  3. Logback初始化失败问题排查(Web.xml中context-param配置详解)

    监控部分反馈异常,生产系统日志文件竟然木有了(最后一次版本发布后,再也无日志文件生成). 问题排查步骤: 1. 检查logback配置文件 日志生成目录一切正常 应该服务器上磁盘空间未满.操作权限没有 ...

  4. 【转】Fuel 9.0安装Openstack网络验证失败解决

    原文链接:https://blog.csdn.net/wiborgite/article/details/52983575 故障现象: 网络验证失败,报错信息如下: Repo availability ...

  5. VMware下CentOS6.5无法连接网络

    VMware下CentOS6.5无法连接网络的主要原因就是eth0文件配置了不正确的地址 正确配置方法如下: 1.确保虚拟网卡(VMware Network Adapter VMnet8)是开启的,然 ...

  6. BurpSuite下提示embedded browser initialisation failed(嵌入式浏览器初始化失败)的解决方法

    BurpSuite可谓是渗透测试过程经常使用的神器之一,但使用中经常会碰到奇奇怪怪的问题,比如有时抓http包,发送到Repeater(中继器,也叫重发器)模块后,在右边Render模块下,却无法看到 ...

  7. [ Openstack ] Openstack-Mitaka 高可用之 网络服务(Neutron)

    目录 Openstack-Mitaka 高可用之 概述    Openstack-Mitaka 高可用之 环境初始化    Openstack-Mitaka 高可用之 Mariadb-Galera集群 ...

  8. 为openstack制作CoreOS虚拟机镜像(基于CoreOS官方提供镜像)

    OpenStack源码交流群: 538850354 1.下载CoreOS镜像(633.1.0版本) CoreOS官网已经有openstack使用的虚拟机镜像,可以直接下载,然后进行修改 http:// ...

  9. 使用ISO文件制作openstack使用的coreOS镜像

    OpenStack源码交流群: 538850354 本篇文章是使用coreOS ISO文件手动制作openstack使用的qcow2镜像文件,关于coreOS的介绍,可以看这里 使用服务器:cento ...

  10. k8s-记一次安全软件导致镜像加载失败

    近期在现场项目中遇到了一个镜像加载失败的问题,相关报错如下: Error processing tar file(exit status 1): symlink . /usr/bin/X11: per ...

随机推荐

  1. FTP主动模式和被动模式(2)

    防火墙对FTP的影响 ASPF 多通道协议 应用层程序有些使用的是单通道协议,有些使用的是多通道协议. 单通道协议 例如http协议,整个协议交互过程中,服务端和客户端只建立一个连接,并且服务端固定使 ...

  2. su与sudo用法详解

    su与sudo用法详解 目录 su与sudo用法详解 1. su和sudo详解:切换用户身份 1.1 shell登录类型和环境配置文件 1.2 su进行身份切换 1.3 sudo命令详解 1.3.1 ...

  3. Linux 开启防火墙端口策略

    1. 安装防火墙 yum install firewalld systemd -y 2. 手动开放防火墙端口 查看防火墙全部设置 firewall-cmd --list-all 若防火墙服务未启动可执 ...

  4. java8用Stream一行代码实现数据分组统计、排序、最大值、最小值、平均值、总数、合计

    getAverage(): 它返回所有接受值的平均值. getCount(): 它计算所有元素的总数. getMax(): 它返回最大值. getMin(): 它返回最小值. getSum(): 它返 ...

  5. Chrome 浏览器插件 V3 版本 Manifest.json 文件中 Action 的类型(Types)、方法(Methods)和事件(Events)的属性和参数解析

    一.类型(Types) 一.OpenPopupOptions 1. 属性 windowId: number 可选 打开操作弹出式窗口的窗口 ID.如果未指定,则默认为当前活动窗口. 二.TabDeta ...

  6. 国产系统UOS安装体验

    原文链接 https://www.giantliu.cn/2020/09/04/200904InstallUOS/ UOS简介 统信桌面操作系统(Uniontech OS)个人正式版是统信软件基于Li ...

  7. vulnhub靶场-->MATRIX-BREAKOUT: 2 MORPHEUS

    靶机下载地址 MATRIX-BREAKOUT: 2 MORPHEUS << 点我下载 开始打靶 IP发现 nmap扫描网段发现靶机ip:192.168.111.139 端口发现 对靶机进行 ...

  8. 如何用 Unity 做出一只赛博宠物

    推荐的一些学习资料 unity 官方文档:Unity 用户手册 (2019.4LTS) - Unity 手册 视频教程:https://www.bilibili.com/video/BV1zB4y1C ...

  9. C# wpf之控制屏幕显示方向旋转

    using System;using System.Collections.Generic;using System.Linq;using System.Runtime.InteropServices ...

  10. WPF开发快速入门【1】WPF的布局

    概述 本文描述几款WPF中常用的布局控件. Grid Grid是WPF最常用的布局控件. 它把面板分割为固定长和宽的网格,子控件就放置在网格内. <Grid> <Grid.Colum ...