cloudbase-init是初始化程序,涉及很多功能,比如购买机器时、重装系统时、重置密码时指定的密码的生效,购买机器时、重装系统时指定的hostname的生效,购买机器时指定的userdata的生效等重要功能。
cloudbase-init是系统的一个开机自启服务,系统起来后这个服务会自动运行,每次重启机器的时候都会自动运行,运行完毕后会自动关闭,不会一直是运行中的状态,对此不要误判以为服务异常了,这个服务本来如此。
配置文件位置:
C:Program FilesCloudbase SolutionsCloudbase-Initconfcloudbase-init.conf
日志文件位置:
C:Program FilesCloudbase SolutionsCloudbase-Initlogcloudbase-init.log
cloudbase-init用户是如何产生的,是安装软件的时候没有勾选"Run Cloudbase-Init service as LocalSystem"导致的
请注意:黑石物理机没有串口,串口日志就不用开了,开了可能会导致机器异常宕机,普通CVM可以开,但一般也没啥用,没特殊需求,建议不要开串口日志。
如何确认cloudbase-init用户能删不能删?运行services.msc打开服务列表找到cloudbase-init服务
我测试只要这里是这样的,删除了没关系,不影响功能
如果是下面这样,删除了会影响控制台重置密码等其他初始化功能,可以手动改成上面那样,然后就可以删除cloudbase-init用户了
.cloudbase-init这种运行模式历史上有bug,腾讯云公共镜像已经改成了本地系统帐户(LocalSystem)运行,自定义镜像还是.cloudbase-init运行模式可能会踩坑,建议随公共镜像优化节奏一起改过来。
当前最新稳定版cloudbase-init是1.1.2,我看华为云、百度云还是0.9.11,cloudbase-init软件官网都已经不认可老版本了
https://github.com/cloudbase/cloudbase-init/releases
0.9.11是2019年10月29日发版的
1.1.2是2020年6月23日发版的
8个月不到发了4个版,这么快不就是修bug吗
https://cloudbase-init.readthedocs.io/en/0.9.11/
当我看0.9.11文档时,软件官网已经告警了,提示版本太老,让用最新稳定版1.1.2
cloudbase-init各版本文档:
https://readthedocs.org/projects/cloudbase-init/downloads/
https://cloudbase-init.readthedocs.io/en/stable/
https://cloudbase-init.readthedocs.io/en/latest/
https://cloudbase-init.readthedocs.io/en/1.1.2/
https://cloudbase-init.readthedocs.io/en/0.9.11/
有些人吐槽机器重装后初始化还没有完成,这是他对初始化有误解,重装系统和初始化是2个动作,重装系统是往系统盘覆盖镜像数据并开机,初始化是开机后的一个即时服务的执行过程。
cloudbase-init是系统的一个服务,肯定得系统起来后cloudbase-init才会开始执行,所以肯定是重装结束后cloudbase-init才开始执行,对于那些启动快的其他业务服务建议设置延迟启动,其启动不要快于cloudbase-init。服务器状态显示为running是很快的,这个runing仅仅代表控制台流程完毕,不代表相关的OS内部流程完毕, 举个例子,在控制台重置密码,转圈一会儿就显示运行中了,那时候是控制台下发重置密码的指令完毕,然后真正生效是在机器重启后cloudbase-init服务开始运行的时候才会调用powershell去光驱拉控制台下发的密码(已转码加密)相关文件去设置密码,所以有些人会发现控制台重置完事已经不转圈了怎么vnc用新密码登录的时候显示密码错误?
控制台提醒得比较隐晦,原因就是cloudbase-init是系统的一个服务,肯定得系统起来后cloudbase-init才会开始执行。 每次重启后cloudbase-init完成的标志如何获取?用户的业务在运行之前需要确保cloudbase-init已经执行完毕,以避免冲突 我发现cloudbase-init.log结尾一般有这样的话代表当次执行结束 ①INFO cloudbaseinit.init [-] Stopping Cloudbase-Init service ②DEBUG cloudbaseinit.osutils.windows [-] Stopping service cloudbase-init stop_service c:program filescloudbase solutionscloudbase-initpythonlibsite-packagescloudbaseinitosutilswindows.py cloudbase-init服务不是常驻服务,运行完毕就会自动关闭,建议检测cloudbase-init服务的运行状态为Stopped和cloudbase-init.log最后一句匹配那2串话之一都满足就可以认定为cloudbase-init已经执行完毕
注意事项:制作自定义镜像前最后一步执行下这句命令
reg delete "HKEY_LOCAL_MACHINESOFTWARECloudbase Solutions" /f
否则,会导致用这个自定义镜像给原机器重装系统时指定的新密码不生效,因为注册表路径里记录了原机器已经初始化过了,你用原机器做的自定义镜像给原机器重装系统系统就会判断机器已经初始化过了,然后跳过初始化,导致指定的新密码不生效。
但是,请注意,请不要随便删除cloudbase-init的注册表,如果创建机器时传了userdata,而userdata代码里有写操作的代码,那你删除了cloudbase-init的注册表会导致初始化标记为0,下次开机的时候cloudbase-init会认为机器没有初始化过,是新机器,就会自动触发重新执行一遍userdata里的代码,严重点假设,假设代码里有格式化数据盘的操作,岂不是要凉凉
总结:如何做自定义镜像,使自定义镜像里的cloudbase-init是当前最新稳定版1.1.2 ?
1、买有公网的机器
2、把http://windows-1251783334.cos.ap-shanghai.myzijiebao.com/CLOUDBASE-INIT_INSTALL.PS1 下载放到上步买的机器桌面,打开powershell命令行,把桌面的脚本拖到命令行回车,然后等10分钟左右,会自动更新cloudbase-init到1.1.2
3、cmd命令行执行这句命令
reg delete "HKEY_LOCAL_MACHINESOFTWARECloudbase Solutions" /f
4、关机制作自定义镜像
5、用自定义镜像购买新机器