基于 KVM 的 Cloudbase-init 使用教程(01):Windows 镜像模板制作
最近在研发 KVM 虚拟化管理平台,需要在新建实例时自动初始化主机名、实例 ID、IP 等配置。本来打算自己开发一套初始化流程,调研后发现社区已有成熟方案:
- Linux:使用 cloud-init
- Windows:使用 cloudbase-init
两者在配置模型上高度兼容(尤其是 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 驱动 ISO:VirtIO Windows Drivers ISO(示例使用
virtio-win-0.1.285.iso) - cloudbase-init 安装包:cloudbase-init Releases(示例使用
1.1.6)
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 主要用于安装设备驱动(网卡/磁盘等),一路“下一步”即可。
2.2 安装 virtio-win-guest-tools(Guest Tools)
virtio-win-guest-tools 会安装一些后台服务/组件,用于提升宿主机与虚拟机之间的协作能力(如更好的设备支持等)。
安装完成后建议重启 Windows 虚拟机。
3. 安装 cloudbase-init
在 Windows 虚拟机中下载并安装 cloudbase-init(本文示例版本:1.1.6)。
安装向导里会有 serial port for logging 选项:如果虚拟机里有 COM1 就选择;没有则忽略即可。
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、账号与网络配置等。