使用离散设备分配规划设备部署

适用范围:Windows Server 2022、 Microsoft Hyper-V Server 2019、Windows Server 2019、Microsoft Hyper-V Server 2016、Windows Server 2016

使用离散设备分配可以从虚拟机 (VM) 内部直接访问物理外围组件快速互连 (PCIe) 硬件。 本文讨论可以使用的设备类型、主机系统要求、对 VM 施加的限制和安全影响。

对于离散设备分配,Microsoft 支持两个设备类型:图形适配器和 NVMe 存储设备。 其他设备也许可以正常工作,并且硬件供应商能够提供对这些设备的支持声明。 对于其他设备,请联系具体的硬件供应商以获取支持。

若要了解其他 GPU 虚拟化方法,请参阅在 Windows Server 中规划 GPU 加速。 如果你已准备好尝试离散设备分配,可转到使用离散设备分配部署图形设备使用离散设备分配部署 NVMe 存储设备

支持的 VM 和来宾操作系统

第 1 代或第 2 代 VM 支持离散设备分配。 支持的来宾包括:

有关详细信息,请参阅 Windows Server 和 Windows 上 Hyper-V 支持的 Linux 和 FreeBSD 虚拟机

系统要求

系统必须满足 Windows Server 的硬件要求Windows Server 上 Hyper-V 的系统要求。 离散设备分配还要求使用能够授予操作系统控制权来配置 PCIe 结构(本机 PCI Express 控制)的服务器类硬件。 此外,PCIe 根复合体必须支持访问控制服务 (ACS),使 Hyper-V 能够强制所有 PCIe 流量通过输入-输出内存管理单元。

这些功能通常不会直接在服务器的 BIOS 中公开,而往往会隐藏在其他设置后面。 如果 SR-IOV 支持和 BIOS 中需要同样的功能,你可能需要设置“启用 SR-IOV”。如果无法在 BIOS 中确定如何正确设置,请与系统供应商联系。

要帮助确保硬件能够进行离散设备分配,可在已启用 Hyper-V 的主机上运行计算机配置文件脚本。 脚本测试服务器是否已正确设置,以及哪些设备能够进行离散设备分配。

设备要求

并非每个 PCIe 设备都可用于离散设备分配。 使用传统 (INTx) PCI 中断的早期设备不受支持。 有关详细信息,请参阅离散设备分配 - 计算机和设备。 还可以运行计算机配置文件脚本来显示哪些设备能够用于离散设备分配。

设备制造商可以联系其 Microsoft 代表获取更多详细信息。

设备驱动程序

离散设备分配会将整个 PCIe 设备传入来宾 VM。 在 VM 中装载设备之前,不需要安装主机驱动程序。 对于主机,唯一的要求是可以确定设备的 PCIe 位置路径。 可以安装设备的驱动程序来帮助识别设备。 未在主机上安装设备驱动程序的 GPU 可能显示为 Microsoft 基本渲染设备。 如果安装了设备驱动程序,则可能会显示该 GPU 的制造商和型号。

在来宾中装载设备后,可以在来宾 VM 中照常安装制造商的设备驱动程序。

VM 限制

由于离散设备分配实现方式的性质,连接设备时 VM 的某些功能会受到限制。 以下功能不可用:

  • VM 保存/还原
  • VM 的实时迁移
  • 动态内存的使用
  • 将 VM 添加到高可用性 (HA) 群集

安全性

离散设备分配会将整个设备传入 VM。 这种传入意味着可从来宾操作系统访问该设备的所有功能。 某些功能(例如固件更新)可能会对系统的稳定性造成不利影响。 从主机中卸载设备时,系统会向管理员显示大量警告。 你应只在 VM 租户受信任的情况下使用离散设备分配。

如果管理员希望将设备与不受信任的租户一起使用,设备制造商可以创建一个可安装在主机上的设备缓解驱动程序。 请联系设备制造商,详细了解他们是否提供设备缓解驱动程序。

如果你想要绕过对未安装设备缓解驱动程序的设备的安全检查,必须将 -Force 参数传递给 Dismount-VMHostAssignableDevice cmdlet。 进行此传递会更改该系统的安全配置文件。 应只在原型制作期间或受信任的环境中进行此更改。

PCIe 位置路径

需要 PCIe 位置路径才能从主机中卸载和装载设备。 一个位置路径示例是 PCIROOT(20)#PCI(0300)#PCI(0000)#PCI(0800)#PCI(0000)计算机配置文件脚本也会返回 PCIe 设备的位置路径。

使用设备管理器获取位置路径

Screenshot of the device manager, showing the selections for finding a device path.

  1. 打开设备管理器并找到设备。
  2. 右键单击该设备并选择“属性”。
  3. 在“详细信息”选项卡上展开“属性”下拉菜单,然后选择“位置路径”。
  4. 右键单击以“PCIROOT”开头的条目,然后选择“复制”以获取该设备的位置路径。

MMIO 空间

某些设备(尤其是 GPU)需要为 VM 分配更多的 MMIO 空间,以便可以访问该设备的内存。 默认情况下,最初为每个 VM 分配 128 MB 的低 MMIO 空间和 512 MB 的高 MMIO 空间。 但是,某个设备可能需要更多 MMIO 空间,或者可能有多个设备直通,因而各种要求导致超过了这些值。 更改 MMIO 空间非常简单,可以使用以下命令在 PowerShell 中执行:

Set-VM -LowMemoryMappedIoSpace 3Gb -VMName $vm
Set-VM -HighMemoryMappedIoSpace 33280Mb -VMName $vm

确定要分配多少 MMIO 空间的最简单方法是使用计算机配置文件脚本。 要下载并运行计算机配置文件脚本,请在 PowerShell 控制台中运行以下命令:

curl -o SurveyDDA.ps1 https://raw.githubusercontent.com/MicrosoftDocs/Virtualization-Documentation/live/hyperv-tools/DiscreteDeviceAssignment/SurveyDDA.ps1
.\SurveyDDA.ps1

对于可分配的设备,该脚本会显示给定设备的 MMIO 要求。 以下脚本输出是一个示例:

NVIDIA GRID K520
Express Endpoint -- more secure.
    ...
    And it requires at least: 176 MB of MMIO gap space
...

低 MMIO 空间仅由 32 位操作系统和使用 32 位地址的设备使用。 在大多数情况下,设置 VM 的高 MMIO 空间就足够了,因为 32 位配置并不常见。

重要

向 VM 分配 MMIO 空间时,请务必指定足够的 MMIO 空间。 MMIO 空间应为以下两项之和:所有需要分配的设备所请求的 MMIO 空间,以及其他虚拟设备(需要几 MB 的 MMIO 空间)的缓冲区。 使用之前所述的默认 MMIO 值作为低 MMIO 和高 MMIO(分别为 128 MB 和 512 MB)的缓冲区。

考虑上一示例。 如果你分配了单个 K520 GPU,请将 VM 的 MMIO 空间设置为计算机配置文件脚本输出的值加上缓冲区:176 MB + 512 MB。 如果你分配了三个 K520 GPU,请将 MMIO 空间设置为基本量 176 MB 的三倍加上缓冲区,即 528 MB + 512 MB。

要更深入地了解 MMIO 空间,请参阅技术社区博客中的离散设备分配 - GPU

计算机配置文件脚本

要确定服务器配置是否正确,以及可以使用离散设备分配传递哪些设备,可以运行 SurveyDDA.ps1. PowerShell 脚本。

在使用该脚本之前,请确保已安装 Hyper-V 角色,并在 PowerShell 命令窗口中使用管理员特权运行该脚本。

如果错误地将系统配置为支持离散设备分配,该工具会显示错误消息,其中包含有关该问题的详细信息。 如果系统配置正确,该工具将枚举位于 PCIe 总线上的所有设备。

对于找到的每个设备,该工具会显示该设备是否可用于离散设备分配。 如果设备被识别为与离散设备分配兼容,该脚本会提供原因。 成功将某个设备识别为兼容时,会显示该设备的位置路径。 此外,如果该设备需要 MMIO 空间,则也会显示此要求。

Screenshot of the requirements displayed in SurveyDDA.ps1.