VirtIO-Win 驱动与 MS SQL Server 工作负载的兼容性
影响在高 I/O 负载下运行 MS SQL Server 的 Windows 虚拟机的已知 virtio-win 驱动兼容性问题,包括推荐版本、验证步骤和干净降级流程。
概述
在 VergeOS 上运行 MS SQL Server 的 Windows 虚拟机,如果来宾使用 virtio-win v0.1.285 或 v0.1.292,就可能产生一串 SQL Server“读重试”日志条目——在某些情况下,持续负载运行数天后还会导致 SQL Server 服务卡死。根本原因是以下组件中的非原子 SRB ID 分配 vioscsi/viostor Storport miniport,它允许当 Windows 将 I/O 并行分发到多个 CPU 时发出重复 ID(上游跟踪为 virtio-win 问题 #1453).
该行为在以下版本上最容易复现 Windows Server 2025 因为其 Storport 实现比早期 Windows Server 版本更激进地并行化 StartIo 。旧版 Windows 来宾同样暴露于该错误,但触发频率更低。
将来宾的 virtio-win 驱动降级到 v0.1.271 是一个稳定的解决方法。针对底层竞态条件的修复已合并到上游并随较新的 virtio-win 构建发布,因此后续包含该修复的版本也应是安全的——在事件处理中途升级前,请先与 VergeOS 支持确认你环境中的哪些构建是已知良好的。
症状
如果你怀疑 VergeOS Windows 虚拟机存在此问题,请在来宾的以下位置查找 应用程序 事件日志和 SQL Server 错误日志:
读重试消息,其中 期望 以及 实际 值相同,例如:
对文件 '*.mdf' 在偏移量 0x... 处的读取在失败 1 次后成功,错误为:校验和不正确(期望值:0xad4c6778;实际值:0xad4c6778)
对文件 '*.mdf' 在偏移量 0x... 处的读取在失败 1 次后成功,错误为:页 ID 不正确(期望值 1:29669944;实际值 1:29669944)
未找到 ID 对应的 SRB来自vioscsi源SQL Server 服务在持续高负载运行数天后卡死
前提条件
在 VergeOS 上运行 MS SQL Server(或类似 I/O 密集型数据库负载)的 Windows 虚拟机
Windows 来宾的管理权限
在更改任何驱动之前为虚拟机创建的快照
该 virtio-win v0.1.271 ISO 已上传到你的 VergeOS 环境下的 文件。归档 ISO 可从以下位置获取: Fedora People 上的 stable-virtio 归档
识别已安装的 VirtIO 驱动版本
在更改任何内容之前,请先确认来宾当前运行的是哪个 virtio-win 构建版本。
打开设备管理器
右键开始菜单并选择 设备管理器.
找到 VirtIO 存储控制器
展开 存储控制器.
右键单击 Red Hat VirtIO SCSI 控制器 (用于 vioscsi)或 Red Hat VirtIO SCSI 直通控制器 / Red Hat VirtIO SCSI 磁盘设备 (用于 viostor)并选择 属性.
检查驱动版本和日期
切换到 驱动程序 选项卡。
记下 驱动版本 以及 驱动日期 字段。
与源 ISO 进行交叉比对
驱动版本标记遵循
100.<minor>.<build>.<revision>格式,其中尾随的修订组件由 virtio-win ISO 版本构建而成。例如,来自vioscsi驱动程序 virtio-win 0.1.285 的通常以.28500; 0.1.271 的通常以.27100.如果你不确定已安装驱动是由哪个 ISO 生成的,请在来宾中挂载候选 ISO,并将其
vioscsi.inf/viostor.infDriverVer行与设备管理器中显示的值进行比较。
同时检查 vioscsi 和 viostor
上游 bug 同时影响 vioscsi (Virtio SCSI)和 viostor (Virtio block)驱动。如果虚拟机为操作系统盘使用一种总线类型,为数据盘使用另一种,请验证两个控制器。
推荐版本
v0.1.271
推荐的解决方法。 受影响提交之前的最后一个版本;已确认在高强度 SQL 负载下稳定。
v0.1.285
避免使用。 包含 vioscsi/viostor SRB ID 竞态;会在繁忙的 SQL 虚拟机上产生读重试错误。
v0.1.292
避免使用。 与 v0.1.285 相同的缺陷。
构建版本 在上游修复之后 (2026 年 1 月及之后)
原则上应是安全的。部署前请先与 VergeOS 支持确认具体构建版本。
稳定版 virtio-win ISO 下载可从以下位置获取: Fedora People stable-virtio 仓库,较旧版本则可从以下位置获取: archive-virtio 目录.
降级到 virtio-win v0.1.271
先创建快照
在更改来宾中的任何 virtio 驱动之前,请先为虚拟机创建 VergeOS 快照。存储栈是启动关键组件——如果更换驱动后 Windows 无法挂载磁盘,这个快照就是你的回滚点。
在来宾中停止 MS SQL Server 服务
从提升权限的 PowerShell 或“服务”控制台中,停止 SQL Server (MSSQLSERVER) 服务以及任何依赖服务(SQL Agent、全文、Reporting Services 等),以便在更改存储驱动前让 I/O 静止。
挂载 virtio-win v0.1.271 ISO
在 VergeOS 中,编辑虚拟机并附加 virtio-win-0.1.271.iso 作为 CD/DVD 设备。
确认该 ISO 在 Windows 中可见(通常会显示为下一个可用盘符)。
卸载当前的 virtio-win 来宾工具
打开 设置 → 应用 → 应用和功能 (或 控制面板中的“程序和功能” 位于来宾中。
找到 Virtio-win-guest-tools 并选择 卸载。按提示操作,如有要求则重启。
如果卸载失败或回滚并报错
0x80070643(这是删除 virtio-win-guest-tools 时的已知问题),请使用微软的 程序安装和卸载疑难解答 在继续前清理注册信息。
重启 VM
重启 Windows,以释放所有正在使用的驱动文件。虚拟机仍应能够启动——在安装新包之前,Windows 会保留存储驱动二进制文件。
从 v0.1.271 ISO 安装 virtio-win-guest-tools
从已挂载的 v0.1.271 ISO 中运行
virtio-win-guest-tools.exe(或virtio-win-gt-x64.msi)并以管理员身份运行。使用默认组件选择完成安装程序。这会以 v0.1.271 构建重新安装 vioscsi、viostor、NetKVM 以及来宾代理。
再次重启虚拟机
重启 Windows,使存储和网络栈在降级后的驱动上重新加载。
验证新的驱动版本
返回到 设备管理器 → 存储控制器,打开 VirtIO 控制器的 属性 → 驱动程序 选项卡,并确认 驱动版本 现在反映的是 v0.1.271 构建(通常以
.27100).为任何其他 VirtIO 控制器以及 Red Hat VirtIO 以太网适配器 在 网络适配器.
启动 MS SQL Server 服务
启动 SQL Server 服务及其依赖项,并确认数据库能正常联机。
在负载下监控
恢复正常工作负载,并观察 SQL Server 错误日志和 Windows 应用程序日志中是否出现上述读重试消息。持续运行且没有重试即为成功标准。
故障排除
常见问题
安装程序报告“已安装较新版本” —— virtio-win MSI 不支持原地降级。请先完成卸载步骤(并重启),然后再运行 v0.1.271 安装程序。
卸载失败并报错 0x80070643 —— 这是 virtio-win-guest-tools 的一个已知怪癖。请使用微软的 程序安装和卸载疑难解答 来清除失败的安装程序状态,重启后再次尝试安装 v0.1.271。
更改驱动后虚拟机无法启动 —— 恢复先决条件中创建的快照,并在首先完全停止 SQL Server 服务后重新尝试该过程。
存储控制器在设备管理器中显示黄色感叹号 —— 驱动未能正确加载。右键单击该控制器,选择 更新驱动程序 → 浏览我的计算机,然后指向 v0.1.271 ISO 中与你的 Windows 版本匹配的文件夹(例如
vioscsi\2k25\amd64用于 Windows Server 2025)。降级后读重试消息仍然存在 —— 请验证 两个
vioscsi以及viostor(无论虚拟机使用哪一个)现在都在设备管理器中显示 v0.1.271 构建。如果确实如此而消息仍持续出现,请抓取一份新的应用程序日志和 SQL Server 错误日志样本,并联系 VergeOS 支持。有更新的 virtio-win 版本可用 —— 2026 年 1 月之后发布的版本可能包含上游修复,并且比继续停留在 v0.1.271 更适合作为长期方案。向生产数据库虚拟机推广前,请先与 VergeOS 支持确认具体构建版本。
其他资源
反馈
最后更新于
这有帮助吗?