VMware Windows Server 2012 R2 迁移华为云:virtio 驱动签名问题排查实录
状态:根因已确认,解法已找到,待验证
日期:2026-10-25
环境:VMware Workstation → 华为云 Flexus 实例,Windows Server 2012 R2
一、问题概述
把 VMware Workstation 里的 Windows Server 2012 R2 虚拟机,迁移到华为云 Flexus 实例。按华为云文档要求预先安装 virtio 驱动,导出磁盘上传制作私有镜像后,部署的实例无法正常启动。
先后遇到两个症状,排查过程中走了不少弯路,本文如实记录整个过程,包括错误判断。最终在 GitHub virtio-win 仓库找到完全匹配的 Issue,确认了根因。
二、症状一:0xc0000428 签名验证失败
现象
实例启动时提示:
0xc0000428:Windows 无法验证 viostor.sys 的数字签名
分析
viostor.sys是 VirtIO 存储驱动,华为云(KVM)的启动盘走 virtio 总线,这个驱动是 boot-start 驱动,在 Windows 引导最早期就必须加载。0xc0000428=STATUS_INVALID_IMAGE_HASH,Windows 无法验证该驱动的数字签名。- 在 VMware 里这个驱动不是 boot-critical(启动盘走 VMware SCSI),所以签名有问题也不暴露;到了华为云启动盘变成 virtio,签名检查立刻生效。
关键发现
华为云 IMS 文档提供的 virtio 驱动下载地址是:
//
安装方式是运行 virtio-win-gt-x64.msi。这就是 Fedora/Red Hat 的通用 virtio-win 驱动,不是华为自己签的。 按华为云文档操作 → 装通用驱动 → 上云 → 签名错误,是预期路径上就会遇到的问题。
三、症状二:恢复模式 + diskpart 看不到磁盘
现象
更换驱动安装方式(MSI 安装)后重新上传,实例启动自动进入 Windows 恢复模式,提示"无法初始化电脑,缺少所需的驱动器分区"。在恢复模式的命令提示符里执行 diskpart → list disk,一个磁盘都列不出来。
排查过程(含错误判断)
弯路 1:以为是 BCD / 磁盘签名问题
最初认为 VMDK → qcow2 转换时磁盘签名变了,导致 BCD 找不到启动分区。建议用 bcdboot + bootrec 重建 BCD。
问题:diskpart 连盘都看不见,根本无从下手修 BCD。方向不对。
弯路 2:以为是驱动没装进驱动商店
检查 pnputil -e | findstr /i "viostor" → 无输出。推断 MSI 只拷了文件没走 PnP 发布,建议用 pnputil -a viostor.inf 重新安装。
执行后 pnputil -e 确实能看到一个 Provider 为 Red Hat、类为"存储控制器"的条目(oem14.inf,版本 62.90.104.21500,日期 2021),但 findstr "viostor" 仍无输出。
进一步发现:2012 R2 的 pnputil -e 输出格式不显示原始 INF 文件名,所以 findstr "viostor" 查不到不代表驱动不在商店。用 findstr /i "viostor vioscsi" C:\Windows\INF\oem14.inf 确认该 INF 确实包含 viostor。
但用户指出:这个驱动配置(在商店 + Start=0)从一开始就是这样,第一次上传失败时就是这状态。所以"驱动没装进商店"不是根因。
弯路 3:建议在 VMware 里加 PVSCSI 盘触发驱动绑定
建议在 VMware 里加一块 PVSCSI 磁盘,让 Windows 做 PnP 绑定。
错误:VMware 没有 virtio 设备,PVSCSI 是 VMware 的半虚拟化 SCSI,不是 KVM 的 virtio,加 PVSCSI 盘不会触发 viostor 绑定。
弯路 4:用 CriticalDeviceDatabase 验证驱动匹配
建议查 HKLM\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase 下有没有 virtio 的硬件 ID 匹配条目。
错误:CriticalDeviceDatabase 在 Windows Server 2008 R2 之后基本退役,2012 R2 上查不到不代表驱动没装。
弯路 5:推断 SHA-2 补丁缺失
推断 2012 R2 缺少 SHA-2 代码签名支持补丁(KB3033929),无法验证 2021 年版驱动的 SHA-256 签名。
错误:KB3033929 是 Windows 7 / Server 2008 R2 的补丁。Windows 8.1 / Server 2012 R2 出厂已带 SHA-256 支持(Microsoft KB4472027 确认)。SHA-2 不是根因。
对症状二的修正理解
diskpart 看不到盘,只证明 WinRE(恢复环境)里没有 viostor 驱动,不代表主系统驱动有问题。WinRE 是独立的小系统,有自己的驱动库,主系统装了驱动 ≠ WinRE 装了。
四、根因(已确认)
根因 A:签名证书链的根 CA 在 Server 2012 R2 上不受信任
来源:GitHub Issue #1617(virtio-win/kvm-guest-drivers-windows 仓库)
该 Issue 报告了与本场景完全相同的问题:迁移 Windows Server 2012 R2 实例,手动安装 virtio-win 21500 驱动,安装后设备异常。setupapi.dev.log 明确记录:
! sig: Verifying file against specific (valid) catalog failed! (0x800b0109)
! sig: Error 0x800b0109: A certificate chain processed, but terminated
in a root certificate which is not trusted by the trust provider.
Red Hat 开发者 kostyanf14(MEMBER)确认:
“this is old os and we cannot resign driver anymore. Please check netkvm.cat certificate and if it is untrusted, add it manually to trusted store”
机制:
virtio-win 21500 驱动由 Red Hat 签名
→ 签名证书链终止于一个根 CA
→ 该根 CA 不在 Windows Server 2012 R2 的受信任根证书存储中
→ 2012 R2 扩展支持 2023 年 10 月结束,不再通过 Windows Update 接收根证书更新
→ 较新的 virtio-win 签名证书链到的根 CA 只分发到了 Win10/Server 2016+
→ 安装时:0x800b0109(CERT_E_UNTRUSTED_ROOT)
→ 启动时:boot-start 驱动内核签名验证更严格 → 0xc0000428
根因 B(可能叠加):UEFI/Secure Boot + 驱动无 WHQL/Attestation 签名
来源:GitHub Issue #557
Red Hat 开发者 Vadim Rozenfeld 确认:
“if it is UEFI setup, then drivers from build 190 will not work in any case, because they are neither WHQL, nor Attestation signed.”
virtio-win 对 Win10 之前的 OS(含 2012 R2)不是 WHQL 签名也不是 Attestation 签名。UEFI/Secure Boot 下会被拒。
virtio-win 对旧 OS 的签名支持已停止
来源:GitHub Issue #1430
Red Hat 开发者 kostyanf14 确认:
“The latest drivers are signed only for Windows 10 and Windows 11.”
virtio-win-0.1.240 是最后一个官方支持 Win8 内核的版本,但即使用 0.1.240,用户仍报告签名失败——光换老版本不够,还是得导入根 CA 证书。
五、已尝试的方案
| 方案 | 结果 |
|---|---|
| 按华为云文档装通用 virtio-win 驱动(MSI) | 上云后 0xc0000428 签名错误 |
pnputil -a 确保 INF 发布到驱动商店 |
驱动在商店确认,Start=0 确认,但问题依旧 |
| 直接上传 VMDK | 恢复模式,diskpart 看不到盘 |
| 查 KB3033929(SHA-2 补丁) | 该补丁不适用 2012 R2,排除 |
六、解决方案(待验证)
方案 1:导入 Red Hat 根 CA 证书到受信任根存储(推荐,正路)
virtio-win 的 ISO/驱动包中包含 Virtio_Win_Red_Hat_CA.cer 证书文件。
certutil -addstore -f Root "C:\virtio_drivers\Virtio_Win_Red_Hat_CA.cer"
或通过 certmgr.msc 手动导入到"本地计算机 → 受信任的根证书颁发机构"。
导入后重启,再装驱动,签名应能验过。不需要关签名校验,不需要测试模式水印。
来源:Issue #1617 中 Red Hat 开发者建议 “add it manually to trusted store”
方案 2:开启测试签名模式(兜底,解决根因 A 和 B)
bcdedit /set testsigning on
⚠️ Secure Boot 开启时无效;有"测试模式"水印。
来源:Issue #1617 中 Red Hat 开发者建议
方案 3:禁用内核完整性检查(比 test signing 更彻底)
bcdedit /set nointegritychecks on
⚠️ 同样需要 Secure Boot 关闭。
方案 4:关闭 Secure Boot / 切换 BIOS/MBR(解决根因 B)
如果源机是 UEFI 启动,需在华为云侧关闭 Secure Boot 或切换 BIOS/MBR。用 bcdedit /enum {current} 看 path 是否含 efi 来判断启动模式。
方案 5:使用更旧的 virtio-win 版本(辅助)
virtio-win-0.1.240 是最后一个官方支持 Win8 内核的版本:
//
⚠️ 单独换老版本不够,需配合方案 1(导入根 CA)。
方案 6:注入 WinRE + 转成 qcow2 上传(必须)
无论用哪个方案解决签名问题,还需要:
- 把 virtio 驱动注入 WinRE(
Dism /Mount-Wim+Dism /Add-Driver),否则恢复模式看不见盘 - 导出时转成 qcow2 再上传(
qemu-img convert),避免 VMDK 转换改写磁盘签名
七、完整正确流程(待验证)
1. VMware 源机:跑 Windows Update,装齐补丁
2. 重启
3. 导入 Red Hat 根 CA 证书:certutil -addstore -f Root "Virtio_Win_Red_Hat_CA.cer"
4. 装 virtio 驱动
5. 确认 pnputil -e 有 Red Hat 存储控制器条目
6. 确认 viostor Start=0
7. 注入 WinRE(DISM 挂载 Winre.wim + 注入驱动)
8. sysprep /oobe /generalize /shutdown
9. 删除所有快照,关机
10. 导出 .vmdk,转成 qcow2(qemu-img convert)
11. 验证分区表完整(qemu-nbd + fdisk -l)
12. 上传华为云 OBS,注册私有镜像
13. 部署验证
八、复盘:排查中犯的错误
| 错误 | 说明 |
|---|---|
| 把 KB3033929(Win7 补丁)套用到 2012 R2 | 2012 R2 出厂已带 SHA-256 支持,该补丁不适用 |
| 建议在 VMware 加 PVSCSI 盘触发 virtio 绑定 | VMware 没有 virtio 设备,PVSCSI ≠ virtio,绑不到 viostor |
| 用 CriticalDeviceDatabase 验证驱动匹配 | 该注册表键在 2008 R2 后退役,查不到不代表没装 |
| 推断"驱动没装进商店"是根因 | 驱动一开始就在商店里,不是根因 |
| 在 WinRE 的 diskpart 空结果上推断主系统驱动问题 | diskpart 空只证明 WinRE 没驱动,不代表主系统驱动有问题 |
| 推断 SHA-2 补丁缺失 | 2012 R2 原生支持 SHA-2,SHA-2 不是根因 |
教训:面对"按官方文档操作仍然报错"的情况,应该第一时间怀疑"文档推荐的驱动与当前 OS 版本不兼容",而不是假设用户操作有误。在确认驱动配置正确后,应转向驱动版本/签名兼容性方向,而非反复验证安装步骤。最终根因(根 CA 不受信任)在 GitHub Issue #1617 中有完全匹配的案例,应更早搜索社区 Issue。
本文持续更新,验证成功后补充最终结果。
- 点赞
- 收藏
- 关注作者
评论(0)