LXD中Windows VM的初始化方法

基本思路:使用Cloudbase-init,在容器初始化的时候将需要配置的IP地址配置信息填入到LXD容器的config里,借助LXD的配置功能为每一个VM配置一个名字为tzdata的光盘镜像,cloudbase-init在windows vm启动时自动读取镜像,将需要的配置执行。

华为云对cloudbase-init工具的介绍

Cloudbase-init基本原理类似于cloud-init,只是由于cloud-init并没有提供对windows的支持才有了cloudbase-init,这个工具可以在虚拟机首次启动时根据某一些信息来初始化VM,使得VM在云基础设施上配置时可以完全自动化。这些信息来源是通过Service来确定的,例如各个云平台的自定义初始化方法(AWS、GCP),或者一些通用的虚拟机话基础设施(OpenStack、MaaS、VMware),具体的Service在文档中有详细描述(https://cloudbase-init.readthedocs.io/en/latest/services.html#nocloud-configuration-drive)。每一个Service又支持多个Plugin来配置不同的设置。

由于LXD本身对于虚拟机的支持还是experimental,大部分的qemu配置都很难直接应用在LXD config里(有一个raw.qemu但也只是单纯将其参数补充在qemu运行命令之后),对于Windows的支持就更少了。好在LXD支持添加一个名为cloud-init:config的device,结合填入的user.meta-data等等参数即可以自动完成cloud-init初始化光盘的创建和连接。为了让cloud-init初始化光盘的配置能应用在cloudbase-init上,我们需要选择cloudbaseinit.metadata.services.nocloudservice.NoCloudConfigDriveService 这个配置和cloud-init的配置基本上是一致的,但是需要注意的是对于网络配置而言只能选择cloud-init的V1版本,对于V2版本(即官方宣称的network-config配置文件)是不能使用的(非常确定,因为我已经到源码里找了V2实现是空的)。

V1版本的配置方法也非常讲究,通过分析源码我发现他针对每一个网络端口并不是根据名称来配置的,而是根据MAC地址,因此如果需要修改的名字也只需要在配置项中指定即可。

network-interfaces:|
  iface Ethernet0 inet static
  address 10.0.0.2
  network 10.0.0.0
  netmask 255.255.255.0
  broadcast 10.0.0.255
  gateway 10.0.0.1
  hwaddress ether 00:11:22:33:44:55

还有需要注意的一点是,如果是使用lxc工具使用edit修改的VM config,那么yaml需要从那一项开始对齐。例如

Config:
  user.meta-data: |
    network-interfaces: |
      iface Ethernet0 inet static
.…

如果顶头写的话,那么lxc在解析修改后的yml文件时认为是无效参数直接忽略掉,而且不会有任何报错提示。因此,在修改lxc config后一定要再show一次检查一下是否修改成功。

完成配置后,可以检查虚拟机里的配置是否正常了,但是这里又出现了一个问题是,cloudbase-init在完成了一次修改后会在注册表里写入一些信息,这样第二次启动的时候就会检查有无相关信息,如果有那么会直接跳过配置项。这种策略在我们调试cloudbase-init配置的时候很麻烦。解决方法是,手动在具有管理员权限的powershell里执行(https://ask.cloudbase.it/question/1334/sethostnameplugin-execution-already-done/) Remove-Item -Recurse "HKLM:\Software\Cloudbase Solutions"

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注