> For the complete documentation index, see [llms.txt](https://docs.verge.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.verge.io/knowledge-base/zh/virtual-machines/virtio-win-mssql-compatibility.md).

# VirtIO-Win 驱动程序与 MS SQL Server 工作负载的兼容性

## 概述

{% hint style="info" %}
**要点**

* virtio-win **v0.1.285** 以及 **v0.1.292** 在以下组件中存在竞态条件 `vioscsi` 以及 `viostor` 存储驱动，在负载很重的 MS SQL Server 虚拟机上会显现出来
* **v0.1.271** 是受影响提交之前的最后一个版本，也是运行数据库负载的 Windows 来宾的推荐版本
* 症状在以下环境中最明显 **Windows Server 2025** 在持续并行 I/O 下的来宾
* 上游修复已于 2026 年 1 月落地；后续包含该修复的 virtio-win 版本也应是安全的——在大范围部署前请先验证构建版本
* 在更改存储驱动之前，请先为虚拟机创建快照并停止 SQL Server 服务
  {% endhint %}

在 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](https://github.com/virtio-win/kvm-guest-drivers-windows/issues/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 服务在持续高负载运行数天后卡死

{% hint style="info" %}
**这些消息看起来像是损坏，但通常并不是**

SQL Server 报告 **重试** 结果，第二次尝试成功。 `DBCC CHECKDB` 通常会返回干净结果——磁盘上的数据库页是完整的。由于重复的 SRB ID，驱动在第一次读取时传递了错误的缓冲区，而第二次读取返回了正确的数据。持续的重试仍然表明存在真实问题，即使未检测到损坏也应予以处理。
{% endhint %}

## 前提条件

* 在 VergeOS 上运行 MS SQL Server（或类似 I/O 密集型数据库负载）的 Windows 虚拟机
* Windows 来宾的管理权限
* 在更改任何驱动之前为虚拟机创建的快照
* 该 **virtio-win v0.1.271 ISO** 已上传到你的 VergeOS 环境下的 **文件**。归档 ISO 可从以下位置获取： [Fedora People 上的 stable-virtio 归档](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/)

## 识别已安装的 VirtIO 驱动版本

在更改任何内容之前，请先确认来宾当前运行的是哪个 virtio-win 构建版本。

1. **打开设备管理器**
   * 右键开始菜单并选择 **设备管理器**.
2. **找到 VirtIO 存储控制器**
   * 展开 **存储控制器**.
   * 右键单击 **Red Hat VirtIO SCSI 控制器** （用于 vioscsi）或 **Red Hat VirtIO SCSI 直通控制器** / **Red Hat VirtIO SCSI 磁盘设备** （用于 viostor）并选择 **属性**.
3. **检查驱动版本和日期**
   * 切换到 **驱动程序** 选项卡。
   * 记下 **驱动版本** 以及 **驱动日期** 字段。
4. **与源 ISO 进行交叉比对**
   * 驱动版本标记遵循 `100.<minor>.<build>.<revision>` 格式，其中尾随的修订组件由 virtio-win ISO 版本构建而成。例如，来自 `vioscsi` 驱动程序 **virtio-win 0.1.285** 的通常以 `.28500`; **0.1.271** 的通常以 `.27100`.
   * 如果你不确定已安装驱动是由哪个 ISO 生成的，请在来宾中挂载候选 ISO，并将其 `vioscsi.inf` / `viostor.inf` `DriverVer` 行与设备管理器中显示的值进行比较。

{% hint style="success" %}
**同时检查 vioscsi 和 viostor**

上游 bug 同时影响 `vioscsi` （Virtio SCSI）和 `viostor` （Virtio block）驱动。如果虚拟机为操作系统盘使用一种总线类型，为数据盘使用另一种，请验证两个控制器。
{% endhint %}

## 推荐版本

| 版本                               | 状态                                                                |
| -------------------------------- | ----------------------------------------------------------------- |
| **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 仓库](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/)，较旧版本则可从以下位置获取： [archive-virtio 目录](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/).

## 降级到 virtio-win v0.1.271

{% hint style="warning" %}
**先创建快照**

在更改来宾中的任何 virtio 驱动之前，请先为虚拟机创建 VergeOS 快照。存储栈是启动关键组件——如果更换驱动后 Windows 无法挂载磁盘，这个快照就是你的回滚点。
{% endhint %}

1. **在来宾中停止 MS SQL Server 服务**
   * 从提升权限的 PowerShell 或“服务”控制台中，停止 **SQL Server (MSSQLSERVER)** 服务以及任何依赖服务（SQL Agent、全文、Reporting Services 等），以便在更改存储驱动前让 I/O 静止。
2. **挂载 virtio-win v0.1.271 ISO**
   * 在 VergeOS 中，编辑虚拟机并附加 **virtio-win-0.1.271.iso** 作为 CD/DVD 设备。
   * 确认该 ISO 在 Windows 中可见（通常会显示为下一个可用盘符）。
3. **卸载当前的 virtio-win 来宾工具**
   * 打开 **设置 → 应用 → 应用和功能** （或 **控制面板中的“程序和功能”** 位于来宾中。
   * 找到 **Virtio-win-guest-tools** 并选择 **卸载**。按提示操作，如有要求则重启。
   * 如果卸载失败或回滚并报错 `0x80070643` （这是删除 virtio-win-guest-tools 时的已知问题），请使用微软的 [程序安装和卸载疑难解答](https://support.microsoft.com/topic/fix-problems-that-block-programs-from-being-installed-or-removed-cca7d1b6-65a9-3d98-426b-e9f927e1eb4d) 在继续前清理注册信息。
4. **重启 VM**
   * 重启 Windows，以释放所有正在使用的驱动文件。虚拟机仍应能够启动——在安装新包之前，Windows 会保留存储驱动二进制文件。
5. **从 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 以及来宾代理。
6. **再次重启虚拟机**
   * 重启 Windows，使存储和网络栈在降级后的驱动上重新加载。
7. **验证新的驱动版本**
   * 返回到 **设备管理器 → 存储控制器**，打开 VirtIO 控制器的 **属性 → 驱动程序** 选项卡，并确认 **驱动版本** 现在反映的是 v0.1.271 构建（通常以 `.27100`).
   * 为任何其他 VirtIO 控制器以及 **Red Hat VirtIO 以太网适配器** 在 **网络适配器**.
8. **启动 MS SQL Server 服务**
   * 启动 SQL Server 服务及其依赖项，并确认数据库能正常联机。
9. **在负载下监控**
   * 恢复正常工作负载，并观察 SQL Server 错误日志和 Windows 应用程序日志中是否出现上述读重试消息。持续运行且没有重试即为成功标准。

## 故障排除

{% hint style="warning" %}
**常见问题**

* **安装程序报告“已安装较新版本”** —— 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 支持确认具体构建版本。
  {% endhint %}

## 其他资源

* [在 Windows 恢复控制台中加载 Virtio 驱动程序](/knowledge-base/zh/virtual-machines/loading-virtio-drivers-in-windows-recovery-console.md)
* [数据库最佳实践](/knowledge-base/zh/system-administration/database-best-practices.md)
* [虚拟机快照和还原](/automate-protect-and-extend/backup-and-dr/vm-snapshots-restores.md)
* [virtio-win 问题 #1453 —— SRB ID 竞态的上游报告](https://github.com/virtio-win/kvm-guest-drivers-windows/issues/1453)
* [稳定版 virtio-win ISO 下载](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/)
* [归档 virtio-win ISO 下载](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/)

## 反馈

{% hint style="info" %}
**需要帮助吗？**

如果你在 Windows MS SQL 虚拟机上看到读重试消息或不稳定现象，并且不确定安装了哪个 virtio-win 版本——或者应该升级到哪个版本——请在生产环境中更改驱动之前联系 [VergeOS 支持团队](/support-and-services.md) 。
{% endhint %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.verge.io/knowledge-base/zh/virtual-machines/virtio-win-mssql-compatibility.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
