win10安装cloudinit和qemu-guest-agent
1.安装win10的系统
2.下载virtio-win版本
下载连接:https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/?C=M;O=D

红框中的两个下载任一一个就可以,这两个实际上是一个文件

3.加载virtio-win-302.iso到win10虚拟机上

直接运行virtio-win-guest-tools,按照默认操作下一步即可

安装完毕后,会有2个服务,其中vss那个服务没有开启自启动,可以设置为开机自启动。
或者在powershell中执行如下命令,启动并设置两个服务开机自启动
Start-Service -Name 'QEMU Guest Agent VSS Provider' Start-Service -Name 'QEMU-GA' Set-Service -Name 'QEMU Guest Agent VSS Provider' -StartupType Automatic Set-Service -Name 'QEMU-GA' -StartupType Automatic


宿主机验证

QGA 命令是 JSON 格式,宿主机下发给虚拟机内部 qemu-ga 执行
guest-ping 是 QGA 的连通性探测命令,用来测试宿主机能不能通过 virtio-serial 通道和虚拟机内的 qemu-ga 通信QEMU。
- 指令 JSON:
{"execute":"guest-ping"} - ✅ 成功返回:
{"return":{}} - ❌ 报错:通道不通、QGA 没启动、virtio-serial 串口异常
注意:Windows 里 QEMU-GA 服务 Running ≠ 通道通;guest-ping 返回 {},才代表 QGA 真正可用。

安装cloudinit-win即cloudbase
官方地址:https://cloudbase.it/cloudbase-init/
下载最新稳定版cloudbase-init
https://cloudbase.it/downloads/CloudbaseInitSetup_Stable_x64.msi




勾选Run Cloudbase-Init service as LocalSystem:Cloudbase-Init 服务以本地最高权限 LocalSystem 系统账号运行,账号创建、密码注入、修改系统配置能力最强,私有 KVM/PVE 镜像推荐勾选; 不勾选:会自动新建cloudbase-init专用管理员账号运行服务,权限略低,部分系统操作(重置内置管理员密码)容易失败,多用于公有云加固场景。
如果不是必须特定账号登录的话,推荐勾选
下面一直点击下一步即可

都不勾选,直接点击finish


cloduinit的默认配置文件如下
C:\Program Files\Cloudbase Solutions\Cloudbase-Init\conf\cloudbase-init.conf
编辑这个文件进行修改,或者直接使用powershell执行下面脚本,执行完毕后查看配置文件是否修改成功
$content = @' [DEFAULT] # 初始化要创建/重置的Windows本地账号 username=Administrator # 将账号加入管理员组 groups=Administrators # 启用从元数据注入账号密码 inject_user_password=true # NoCloud ConfigDrive 介质支持:原始硬盘、光盘、vfat格式镜像 config_drive_raw_hhd=true config_drive_cdrom=true config_drive_vfat=true # 解压工具bsdtar路径,用于读取configdrive内部文件 bsdtar_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\bin\bsdtar.exe # mtools工具目录,用于读写vfat格式configdrive mtools_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\bin\ # 存储策略:新磁盘默认全部联机,避免新增磁盘脱机只读 san_policy=OnlineAll # 元数据服务:仅启用ConfigDrive(nocloud光盘注入),不使用http元数据 metadata_services=cloudbaseinit.metadata.services.configdrive.ConfigDriveService # 读取configdrive失败时重试次数、重试间隔(秒),提升稳定性 retry_count=2 retry_count_interval=5 # 插件白名单,按需求启用对应功能 # SetHostNamePlugin:设置主机名 # NetworkConfigPlugin:读取nocloud的network-config配置IP/网关/DNS # ExtendVolumesPlugin:C盘自动扩容到磁盘最大容量 # SetUserPasswordPlugin:重置Administrator账号密码 # LocalScriptsPlugin:执行LocalScripts目录下本地脚本(弹出configdrive光盘脚本靠这个) # UserDataPlugin:执行平台下发的user-data自定义脚本 plugins=cloudbaseinit.plugins.common.sethostname.SetHostNamePlugin,cloudbaseinit.plugins.common.networkconfig.NetworkConfigPlugin,cloudbaseinit.plugins.windows.extendvolumes.ExtendVolumesPlugin,cloudbaseinit.plugins.common.setuserpassword.SetUserPasswordPlugin,cloudbaseinit.plugins.common.localscripts.LocalScriptsPlugin,cloudbaseinit.plugins.common.userdata.UserDataPlugin # 详细日志输出开关 verbose=true # 开启debug日志,调试阶段用,模板稳定后可改为false减少日志量 debug=true # 日志存放目录 logdir=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\log\ # 日志文件名 logfile=cloudbase-init.log # 各模块日志级别控制 default_log_levels=comtypes=INFO,suds=INFO,iso8601=WARN,requests=WARN # 串口日志输出(COM1,PVE虚拟机xml需要预先配置串口设备,不需要可注释) logging_serial_port_settings=COM1,115200,N,8 # 从DHCP获取MTU参数 mtu_use_dhcp_config=true # 从DHCP获取NTP服务器地址 ntp_use_dhcp_config=true # 首次登录行为:no 不弹出欢迎/服务器管理器窗口 first_logon_behaviour=no # 关闭NetBIOS 15字符主机名长度限制,支持长主机名 netbios_host_name_compatibility=false # 初始化过程禁止自动重启,防止实例意外反复重启 allow_reboot=false # 关闭Windows自动激活(私有虚拟化无KMS,不需要,有内部KMS再改为true) activate_windows=false # 本地脚本目录,eject_configdrive.ps1放在这个目录,由LocalScriptsPlugin执行 local_scripts_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\LocalScripts\ '@ $content | Out-File -Encoding ASCII -FilePath 'C:\Program Files\Cloudbase Solutions\Cloudbase-Init\conf\cloudbase-init.conf'
进行win系统的sysprep系统封装
管理员权限执行C:\Windows\System32\Sysprep\sysprep.exe

或者直接使用命令行执行(推荐,方便脚本化),管理员 PowerShell 执行:
C:\Windows\System32\Sysprep\sysprep.exe /oobe /generalize /shutdown - /oobe:下次开机进入 OOBE - /generalize:通用化系统,清除本机唯一信息 - /shutdown:封装完成自动关机
执行 sysprep 之后,虚拟机会自动关机,不要开机!一旦开机这个模板就被破坏,需要重新 sysprep
如果上面执行失败,查看C:\Windows\System32\Sysprep\Panther\setupact.log和setuperr.log文件
联网的话,系统更新占用C盘保留存储导致失败,等更新完了重启,然后重新执行即可
清理 sysprep 旧失败标记注册表
reg add "HKLM\SYSTEM\Setup\Status\SysprepStatus" /v CleanupState /t REG_DWORD /d 0 /f reg add "HKLM\SYSTEM\Setup\Status\SysprepStatus" /v GeneralizationState /t REG_DWORD /d 0 /f
然后重新使用sysprep进行封装

系统精简 & 垃圾清理(更新全部部署完毕后执行)
管理员 PowerShell 逐条执行
# 1. 清理WinSxS旧组件(模板必跑)
DISM /Online /Cleanup-Image /StartComponentCleanup /ResetBase
# 2. 停止更新服务,清理下载缓存
net stop wuauserv
Remove-Item C:\Windows\SoftwareDistribution\Download\* -Recurse -Force
net start wuauserv
#3. 清理临时文件
Remove-Item $env:TEMP\* -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item C:\Windows\Temp\* -Recurse -Force -ErrorAction SilentlyContinue


浙公网安备 33010602011771号