VMware Windows Server 2012 R2 迁移华为云:virtio 驱动签名问题排查实录

举报
yd_284811271 发表于 2026/10/25 11:39:06 2026/10/25
【摘要】 状态:根因已确认,解法已找到,待验证日期:2026-10-25环境:VMware Workstation → 华为云 Flexus 实例,Windows Server 2012 R2 一、问题概述把 VMware Workstation 里的 Windows Server 2012 R2 虚拟机,迁移到华为云 Flexus 实例。按华为云文档要求预先安装 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 上传(必须)

无论用哪个方案解决签名问题,还需要:

  1. 把 virtio 驱动注入 WinRE(Dism /Mount-Wim + Dism /Add-Driver),否则恢复模式看不见盘
  2. 导出时转成 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。


本文持续更新,验证成功后补充最终结果。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。