- 需求描述:通过管理后台使用qcow2模板文件创建Windows虚拟机,初始化时修改Administrator的密码
- 技术路线:Proxmox VE + Cloudbase-init
问题记录:
安装Windows模板后,首次登录提示需要重置Administrator的密码。
出现这个问题的原因在于重装后Administrator的密码未设置。 查看Cloudbase-init的日志
C:\Program Files\Cloudbase Solutions\Cloudbase-Init\log
提示未找到meta-data文件
我这里使用的是NoCloudConfigDriveService,pve将cloud-config文件以光盘驱动挂载到Windows下,NoCloud服务会自动查找盘符为'CIDATA'或'cidata'的盘,读取下面的clodu-config文件。
查看文档后发现
The folder structure for NoCloud is:
- /user-data
- /meta-data
NoCloud服务要求的文件名格式为 小写+“-”,而PVE挂载的文件名格式为 大写+“_”,这导致NoCloud服务无法找到meta-data文件。
查看NoClodu服务的源码
def __init__(self):
super(NoCloudConfigDriveService, self).__init__(
'cidata', 'meta-data')
self._meta_data = {}
def get_user_data(self):
return self._get_cache_data("user-data")
def _get_meta_data(self):
if self._meta_data:
return self._meta_data
raw_meta_data = self._get_cache_data("meta-data", decode=True)
try:
self._meta_data = (
serialization.parse_json_yaml(raw_meta_data))
except serialization.YamlParserConfigError as ex:
LOG.error("Metadata could not be parsed")
LOG.exception(ex)
return self._meta_data
可以发现源码里文件名被固定为“meta-data”和“user-data”。 考虑到如果修改PVE源码会涉及到稳定性以及更新问题,这里选择修改NoCloud的代码,将文件名替换。
def __init__(self):
super(NoCloudConfigDriveService, self).__init__(
'cidata', 'META_DATA')
self._meta_data = {}
def get_user_data(self):
return self._get_cache_data("USER_DATA")
def _get_meta_data(self):
if self._meta_data:
return self._meta_data
raw_meta_data = self._get_cache_data("META_DATA", decode=True)
try:
self._meta_data = (
serialization.parse_json_yaml(raw_meta_data))
except serialization.YamlParserConfigError as ex:
LOG.error("Metadata could not be parsed")
LOG.exception(ex)
return self._meta_data
再次重装后Administrator的密码已经被成功修改