Contents

基于 KVM 的 Cloudbase-init 使用教程(01):Windows 镜像模板制作

最近在研发 KVM 虚拟化管理平台,需要在新建实例时自动初始化主机名、实例 ID、IP 等配置。本来打算自己开发一套初始化流程,调研后发现社区已有成熟方案:

两者在配置模型上高度兼容(尤其是 NoCloud/ConfigDrive 这类场景),能显著降低维护成本。

本篇(01)主要讲 Windows 模板镜像制作;下一篇会基于该模板演示如何创建实例并下发初始化数据。

准备

你将得到什么

  • 一个可复用的 Windows Server 2022 模板镜像(qcow2)
  • 模板内已安装并配置好 cloudbase-init(后续可通过 ConfigDrive/NoCloud 注入初始化信息)

环境与材料

  • 宿主机:已安装 KVM + libvirt,并可使用 virt-install
  • 网络:示例使用 Linux bridge br0(请按你的实际环境替换)
  • Windows ISO:Windows Server 2022 Standard(示例为中文 ISO)
  • VirtIO 驱动 ISOVirtIO Windows Drivers ISO(示例使用 virtio-win-0.1.285.iso
  • cloudbase-init 安装包cloudbase-init Releases(示例使用 1.1.6
提示
如果你希望 cloudbase-init 输出日志到串口(便于宿主机采集),请确保虚拟机设备里存在 COM1(serial port)。没有也不影响功能,只是少了串口日志。

1. 创建 Windows 模板虚拟机

在宿主机创建一个用于制作模板的虚拟机。我这里使用 virt-install,Windows 安装过程(分区/账号等)请按你的习惯完成即可。

 1virt-install \
 2  --name win2022-template \
 3  --ram 8192 \
 4  --vcpus 4 \
 5  --cpu host-passthrough \
 6  --os-variant win2k22 \
 7  --network bridge=br0,model=virtio \
 8  --disk path=/var/lib/libvirt/images/win2022-template.qcow2,size=40,bus=virtio,format=qcow2 \
 9  --disk path=/opt/cloud-init-cfg/win2k22-2026-1-22/virtio-win-0.1.285.iso,device=cdrom,bus=sata \
10  --cdrom /opt/cloud-init-cfg/zh-cn_windows_server_2022_updated_sep_2024_x64_dvd_cab4e960.iso \
11  --graphics vnc,listen=0.0.0.0 \
12  --boot cdrom,hd \
13  --noautoconsole
说明
  • --disk ... virtio-win-*.iso:把 VirtIO 驱动 ISO 作为光驱挂载(后续在 Windows 里安装驱动/工具)。
  • --cdrom ... windows.iso:系统安装介质。
  • 以上路径与规格请按你的实际环境调整。

2. 安装 VirtIO 驱动与 Guest Tools

系统安装完成并完成基础配置后,在虚拟机内安装 VirtIO 的驱动与工具(通过挂载的 ISO)。

2.1 安装 virtio-win-gt-x64(驱动)

virtio-win-gt-x64 主要用于安装设备驱动(网卡/磁盘等),一路“下一步”即可。

virtio-win-gt-x64 安装向导(1) virtio-win-gt-x64 安装向导(2) virtio-win-gt-x64 安装向导(3) virtio-win-gt-x64 安装向导(4)

2.2 安装 virtio-win-guest-tools(Guest Tools)

virtio-win-guest-tools 会安装一些后台服务/组件,用于提升宿主机与虚拟机之间的协作能力(如更好的设备支持等)。

virtio-win-guest-tools 安装向导(1) virtio-win-guest-tools 安装向导(2)

安装完成后建议重启 Windows 虚拟机。

3. 安装 cloudbase-init

在 Windows 虚拟机中下载并安装 cloudbase-init(本文示例版本:1.1.6)。

下载 cloudbase-init(1) 下载 cloudbase-init(2) 安装 cloudbase-init(1) 安装 cloudbase-init(2)

安装向导里会有 serial port for logging 选项:如果虚拟机里有 COM1 就选择;没有则忽略即可。

serial port for logging 选项
注意
关闭 cloudbase-init 安装界面时,不要勾选任何复选框,尤其是不要在这里直接运行 Sysprep。我们先完成配置,再在后续流程中按需要决定是否泛化/封装。
关闭安装向导时的选项

4. 配置 cloudbase-init

cloudbase-init 的默认配置文件路径是:

C:\Program Files\Cloudbase Solutions\Cloudbase-Init\conf\cloudbase-init.conf

4.1 以管理员权限编辑配置文件

如果直接编辑提示权限不足,可以:

  • 以管理员身份运行记事本/编辑器后再打开该文件
  • 或先复制到桌面修改,再覆盖回原路径(覆盖时需要管理员权限)

4.2 配置示例(NoCloud ConfigDrive)

cloudbase-init.conf 替换为以下内容(按你的环境调整账号、KMS、脚本目录等参数):

 1[DEFAULT]
 2username=Admin
 3groups=Administrators
 4inject_user_password=true
 5config_drive_raw_hhd=true
 6config_drive_cdrom=true
 7config_drive_vfat=true
 8bsdtar_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\bin\bsdtar.exe
 9mtools_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\bin\
10metadata_services=cloudbaseinit.metadata.services.nocloudservice.NoCloudConfigDriveService
11plugins=cloudbaseinit.plugins.windows.extendvolumes.ExtendVolumesPlugin,cloudbaseinit.plugins.common.networkconfig.NetworkConfigPlugin,cloudbaseinit.plugins.windows.licensing.WindowsLicensingPlugin,cloudbaseinit.plugins.common.sethostname.SetHostNamePlugin,cloudbaseinit.plugins.common.setuserpassword.SetUserPasswordPlugin,cloudbaseinit.plugins.common.localscripts.LocalScriptsPlugin,cloudbaseinit.plugins.common.userdata.UserDataPlugin
12verbose=true
13debug=true
14log_dir=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\log\
15log_file=cloudbase-init.log
16default_log_levels=comtypes=INFO,suds=INFO,iso8601=WARN,requests=WARN
17logging_serial_port_settings=COM1,115200,N,8
18mtu_use_dhcp_config=true
19ntp_use_dhcp_config=true
20first_logon_behaviour=no
21netbios_host_name_compatibility=false
22allow_reboot=false
23activate_windows=true
24kms_host="KMS_HOST:1688"
25local_scripts_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\LocalScripts\
26check_latest_version=true
建议
  • metadata_services=...NoCloudConfigDriveService:表示后续通过 ConfigDrive/NoCloud 方式注入元数据/用户数据。
  • allow_reboot=false:避免初始化过程中自动重启(你也可以按需改为 true)。
  • kms_host:这里改为占位符,建议填你自己的 KMS(或按你的授权方式调整/移除)。

到这里模板就基本完成了。你还可以按需安装浏览器、基础工具、补丁等。下一篇我们会演示如何基于该模板创建实例,并通过 cloudbase-init 自动设置主机名、实例 ID、账号与网络配置等。