报错根因是开机启动程序占了系统盘盘符之外的其他盘符的路径,但是开机找不到路径,或者原路径的盘符变化了。
下面介绍一个具体的case,虽然细节可能有差别,但根因是一样的。
问题:用自定义镜像明明把光驱盘符改成F了,但是创建cvm会出现光驱盘符由F变为D的情况,且报错exception processing message 0xc0000013
报错exception processing message 0xc0000013的原因已查明,光驱不要占D和E,占了就报上面的错,因为我系统盘有程序指向了D盘和E盘某些路径,即便光驱盘符是D或E,但程序指向的路径在光驱是不存在的,找不到路径就报错
那怎么解释光驱盘符由F变成D?
制作自定义镜像的原机器是机型A,用自定义镜像创建新机器时用了机型B,换机型后,硬件识别的时候就会像公共镜像那样,光驱会从D盘符重新分配加载,这是cloudbase-init的一个隐含逻辑
为了保证光驱盘符的统一性,建议在创建机器时自定义数据部分通过代码显性指定光驱盘符,例如下面代码里的Z:
<powershell>
get-date -format HH:mm:ss:fffffff >> C:aaa.txt;
Set-ExecutionPolicy Unrestricted -force
Get-WmiObject -Class Win32_volume -Filter 'DriveType=5' |Set-WmiInstance -Arguments @{DriveLetter='Z:'} 2>&1 >> C:aaa.txt;
get-date -format HH:mm:ss:fffffff >> C:aaa.txt;
exit
</powershell>
那如何让自定义镜像买的机器的光驱不占盘符(即资源管理器看不到光驱、但磁盘管理器能看到个没有盘符的光驱设备)?
打开磁盘管理器,如下图删掉光驱盘符即可
注:删掉光驱盘符影响控制台重置密码的功能
关于cloudbase-init的其他说明:
1、确保cloudbase-init的运行模式是本地系统帐户
箭头所指处如果是.cloudbase-init 可能会触发一些bug
2、如果不需要光驱盘符,不要从设备管理器禁止光驱,从磁盘管理器删除光驱盘符即可,删掉盘符后在资源管理器就看不到光驱了,但删掉光驱盘符会影响控制台重置密码的功能,如删掉,需自己牢记密码,以后重置密码只能在系统内部来设置了
3、不建议卸载cloudbase-init,因为网络初始化、hostname初始化、UserData自定义数据等需要它
4、cloudbase-init默认会把hostname改成内网IP下划线形式,如果不想hostname被cloudbase-init更改,想保留hostname,需提前做如下配置
C:Program FilesCloudbase SolutionsCloudbase-Initconfcloudbase-init.conf
删掉这个文件的第11行里的cloudbaseinit.plugins.common.sethostname.SetHostNamePlugin
或者卸载cloudbase-init,但没有cloudbase-init的话,控制台重置密码功能、创建机器时的UserData功能就不起作用了