Proxmox VE+Cloudbase-init 创建Windows虚拟机的初始化问题

1,028 阅读1分钟
  • 需求描述:通过管理后台使用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文件。

image.png 查看文档后发现

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的密码已经被成功修改