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的相关步骤。
执行以下操作看下是否有报错,任何一个步骤报错,可以根据报错信息处理。
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
1、对于sysctl服务管理的系统查看方式:
chkconfig --list|grep cloud
2、对于systemd服务管理的系统查看方式:
systemctl status cloud-init-local
systemctl status cloud-init
systemctl status cloud-config
systemctl status cloud-final
查看文件 /var/log/cloud-init.log,确认是否有报错
1、用户卸载了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 。 不要使用软连接,直接指向具体的解释器。然后在重新执行“排查方案” 里面的步骤,直至全部执行完无错误为止。
1、登录虚拟机(如果忘记密码或者因为cloudbase-init 服务异常重置密码失败了,可以通过以下工具进行密码重置)。
2、打开: 控制面板 --> 管理工具 --> 服务 --> 找到 cloudbase-init 服务 --> 右击属性如下图:
1)查看“启动类型”是否是“自动”,如果不是改为如下图所示
2)查看“登录身份”是否是“本地系统账户”,如果不是改为如下图所示。
3、手工 启动 cloudbase-init 服务看看是否有相关报错,如果有报错需要解决(特别关注是否安装相关安全软件拦截cloudbase-init执行的相关操作)。
4、打开“注册表”搜索并找到全部的“LocalScriptsPlugin”,确认其值是否为2,如果不是则改为2,如下图所示:
5、确认 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日志看看是否有异常:
从下往上慢慢翻看看是否有什么报错(重点关注出问题那次启动的时间)。
背景原因: 在早期的 Windows 公有镜像里面 cloudbase-init 服务不是以 LocalSytem 服务存在的,因此会对应存在一个账号 cloudbase-init 账号,这个账号本身是安全的因为 cloudbase-init 服务在每次启动的时候都会把该账户的密码重置为一个随机数。当用户手工修改了改账号的密码的时候就会出现Windows 拉起 cloudbase-init 服务的时候用户名密码校验不通过导致 cloudbase-init 服务启动失败。
*解决方案:* 将 cloudbase-init 服务改为 LocalSystem 服务,具体操作方式详见: “如何确认子机内部的 cloudbase-init 服务是正常运行的-> 步骤2”。 备注:这个问题只针对部分存量的子机,最新的公有镜像已经全部将 cloudbase-init 服务改为 LocalSystem。
背景原因: 无。
解决方案: 将 cloudbase-init 服务启动类型改为 自动。 详见“如何确认子机内部的 cloudbase-init 服务是正常运行的-> 步骤2”。
背景原因: 无。
解决方案: 卸载对应的安全软件, 或者在安全软件里面对 cloudbase-init 服务的相关操作加白。
** 解决方案 ** 恢复默认的PATH路径,保证path路径中包含powershell
** 解决方案 ** 需要用户自行修改密码,此种情况下暂时无法支持。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。