玩转CVM:Cloud-Init排障

Cloud-Init 是一个纯开源的工具,它是虚拟机内部的一个服务,在开机启动的时候会被执行,非常驻服务,执行完就会退出。

Cloud-Init 是一个纯开源的工具,它是虚拟机内部的一个服务,在开机启动的时候会被执行,非常驻服务,执行完就会退出。腾讯云的 Linux 公有镜像都预安装了 Cloud-Init 服务,主要用于实现对 CVM 实例的初始化操作,以及执行一些用户在创建 CVM 实例的时候指定首次开机启动要执行的自定义脚本。

Cloud-Init 是腾讯云唯一一个与虚拟机通信的桥梁, 二者之间主要通过 ConfigDrive 的方式进行通信,腾讯云的后台服务会把实例的初始化配置信息放到 CD-ROM 里面,然后挂载给实例,在实例首次启动的时候会拉起 Cloud-Init 服务,该服务就会从 CD-ROM 里面读取出实例的初始化配置信息,并对实例进行初始化操作。

Cloud-Init主要是实现对云主机hostname,/etc/hosts,DNS,软件源,NTP,密码,秘钥绑定和网络等内容的初始化。在控制台修改IP,密码以及绑定和解绑秘钥也是依靠Cloud-Init 来实现的。用户在自定义镜像后启动,经常就会出现一些基本配置异常,或者修改密码,IP不生效,一般大部分的问题都是和Cloud-Init 有关,本文将详细介绍排查Cloud-Init的相关步骤。

排查步骤

重新初始化Cloud-Init

执行以下操作看下是否有报错,任何一个步骤报错,可以根据报错信息处理。

1、登录实例

2、rm -rf /var/lib/cloud

3、cloud-init init --local

4、cloud-init init

5、cloud-init modules --mode=config

6、cloud-init modules --mode=final

查看Cloud-Init是否开机自启动

1、对于sysctl服务管理的系统查看方式:

chkconfig --list|grep cloud

玩转CVM:Cloud-Init排障
查看Cloud-Init是否开机自启动

2、对于systemd服务管理的系统查看方式:

systemctl status cloud-init-local

systemctl status cloud-init

systemctl status cloud-config

systemctl status cloud-final

查看Cloud-Init日志

查看文件 /var/log/cloud-init.log,确认是否有报错

常见的内部操作导致cloud-init执行失败

1、用户卸载了cloud-init 的依赖包

问题现象

按照 “排查方案” 里面的步骤进行排查的时候,会报一个如下错误:

玩转CVM:Cloud-Init排障
Cloud-Init排查报错

原因与解决方案

“pkg_resources.DistributionNotFound: xxxxx ” 表示 cloud-init的安装的依赖包被卸载了,解决方案就是安装下该依赖包,然后再重新执行“排查方案” 里面的步骤,直至全部执行完无错误为止。

安装Cloud-Init的具体方法参见文档 https://cloud.tencent.com/document/product/213/12587

2、用户修改了默认python解释器

问题现象

cloud-init服务是预安装在公共镜像内部的,cloud-init安装的时候,python解释默认使用的是python2(即:/usr/bin/python 与 /bin/python 这两个软连是链接向 python2的),当用户有业务需要的时候

可能会在实例内部把python的默认解释器改为python3(即:修改 /usr/bin/python 与 /bin/python 这两个软连使其指向 python3),如此在开机启动执行cloud-init的时候就会报一些奇奇怪怪的错误,主要体现在python2 与 python3的兼容性上。

原因与解决方案

解决方案就是,修改/usr/bin/cloud-init文件里面指定的python解释器,把 #/usr/bin/python 或 #/bin/python 改为#/usr/bin/python2.7 。 不要使用软连接,直接指向具体的解释器。然后在重新执行“排查方案” 里面的步骤,直至全部执行完无错误为止。

Windows Cloud-Init 排障思路

确认Windows Server内部 cloudbase-init 服务是正常运行

1、登录虚拟机(如果忘记密码或者因为cloudbase-init 服务异常重置密码失败了,可以通过以下工具进行密码重置)。

2、打开: 控制面板 –> 管理工具 –> 服务 –> 找到 cloudbase-init 服务 –> 右击属性如下图:

  1)查看“启动类型”是否是“自动”,如果不是改为如下图所示

玩转CVM:Cloud-Init排障
查看是否为自启动

  2)查看“登录身份”是否是“本地系统账户”,如果不是改为如下图所示。

玩转CVM:Cloud-Init排障
查看是否为本地用户

3、手工 启动 cloudbase-init 服务看看是否有相关报错,如果有报错需要解决(特别关注是否安装相关安全软件拦截cloudbase-init执行的相关操作)。

玩转CVM:Cloud-Init排障
手动启动

4、打开“注册表”搜索并找到全部的“LocalScriptsPlugin”,确认其值是否为2,如果不是则改为2,如下图所示:

玩转CVM:Cloud-Init排障
修改注册表

5、确认 CD-ROM 的加载是否被禁用,如下图应该要可以看到一个光驱设备,如果没看到的话就有可能是被禁用了需要取消禁用。

玩转CVM:Cloud-Init排障
查看cd-rom是否被禁用

备注:

1) cloudbase-init 通过CD-ROM 获取数据源,来对虚拟机做初始化和重置密码等操作的。 如果禁用了CD-ROM 这些所有的操作都会失败,为了保证虚拟机正常的使用建议引导用户不要禁用CD-ROM。

2)CD-ROM 不一定要在D盘这个盘符, 如果用户对D这个盘符有特殊需求,建议引导用户通过修改把CD-ROM的盘符往后移,改为E、F等,都不会影响cloudbase-init的正常使用。

3)如果有特殊需求一定要禁用CD-ROM,需要把cloudbase-init 这个服务一起禁用掉。 要不然每次虚拟机启动的时候cloudbase-init 就会使用默认的参数初始化机器,比如虚拟机密码就会被随机分配一个,导致无法登陆。

6、如果以上多已经排查正常了,查看下cloudbase-init日志看看是否有异常:

玩转CVM:Cloud-Init排障
查看日志是否有异常

从下往上慢慢翻看看是否有什么报错(重点关注出问题那次启动的时间)。

cloudbase-init 常见问题排查

问题1: 手工修改了cloudbase-init 账号密码导致cloudbase-init服务启动失败,从而使得初始化重置密码等操作失败。

背景原因: 在早期的 Windows 公有镜像里面 cloudbase-init 服务不是以 LocalSytem 服务存在的,因此会对应存在一个账号 cloudbase-init 账号,这个账号本身是安全的因为 cloudbase-init 服务在每次启动的时候都会把该账户的密码重置为一个随机数。当用户手工修改了改账号的密码的时候就会出现Windows 拉起 cloudbase-init 服务的时候用户名密码校验不通过导致 cloudbase-init 服务启动失败。

*解决方案:* 将 cloudbase-init 服务改为 LocalSystem 服务,具体操作方式详见: “如何确认子机内部的 cloudbase-init 服务是正常运行的-> 步骤2”。 备注:这个问题只针对部分存量的子机,最新的公有镜像已经全部将 cloudbase-init 服务改为 LocalSystem。

问题2:用户禁用了 cloudbase-init 服务,从而使得初始化重置密码等操作失败。

背景原因: 无。

解决方案: 将 cloudbase-init 服务启动类型改为 自动。 详见“如何确认子机内部的 cloudbase-init 服务是正常运行的-> 步骤2”。

问题3:用户安装了安全软件拦截了 cloudbase-init 服务重置密码的操作,从而使得重置密码流程返回成功但是是实际没重置上。

背景原因: 无。

解决方案: 卸载对应的安全软件, 或者在安全软件里面对 cloudbase-init 服务的相关操作加白。

问题4: 用户设置了不正确的PATH路径,导致找不到powershell命令,从而重置密码失败

** 解决方案 ** 恢复默认的PATH路径,保证path路径中包含powershell

问题5: 用户设置了过于严格的 Powershell 执行策略,导致powershell无法正常执行,从而重置密码失败

** 解决方案 ** 需要用户自行修改密码,此种情况下暂时无法支持。

本文来自腾讯云计算社区,转载请注明出处:https://computeinit.com/archives/3260

发表评论

登录后才能评论
交流群