使用离散设备分配部署图形设备

了解如何使用离散设备分配 (DDA) 并通过 PowerShell 将整个 PCIe 设备传递给虚拟机 (VM)。 这样做可以从 VM 内部以高性能方式访问 NVMe 存储或图形卡等设备,同时能够应用设备本机驱动程序。 有关工作设备和可能的安全影响的详细信息,请参阅使用离散设备分配规划设备部署

本文将引导你完成将设备与 DDA 配合使用的步骤:

  1. 为 DDA 配置 VM
  2. 从主机分区中卸载设备
  3. 将设备分配到来宾 VM

先决条件

使用 DDA 部署图形设备之前,需具备以下对象。

  • 运行 Windows Server 2016 或更高版本的 Hyper-V 主机。

  • 运行以下某一操作系统的 VM:

    • Windows Server 2016 或更高版本。

    • Windows 10 或更高版本。

  • 查看规划使用离散设备分配的设备部署,以确保硬件与 DDA 兼容。

    • 运行 SurveyDDA.ps1 PowerShell 脚本以确定服务器是否配置正确。 此脚本还可显示通过使用离散设备分配可进行传递的设备。
  • Hyper-V 主机的管理权限。

  • (可选)虽然并非必需,但如果未启用或支持单根 I/O 虚拟化 (SR-IOV),则在使用 DDA 来部署图形设备时可能会出现问题。

为 DDA 配置 VM

该解决方案的第一步是解决 VM 的 DDA 限制。

  1. 以管理员身份登录到 Hyper-V 主机。

  2. 打开提升的 PowerShell 命令提示符。

  3. 使用以下 PowerShell cmdlet 配置 VM 的 Automatic Stop Action,以启用 TurnOff

    Set-VM -Name VMName -AutomaticStopAction TurnOff
    

图形设备的 VM 准备

如果以某种方式配置虚拟机,某些硬件的性能会更好。 有关你的硬件是否需要以下配置的详细信息,请联系硬件供应商。 有关详细信息,请参阅使用离散设备分配规划设备部署和这篇博客文章

  1. 使用以下 cmdlet 在 CPU 上启用写入组合:

    Set-VM -GuestControlledCacheTypes $true -VMName VMName
    
  2. 使用以下 cmdlet 配置 32 位内存映射 I/O (MMIO) 空间:

    Set-VM -LowMemoryMappedIoSpace 3Gb -VMName VMName
    
  3. 使用以下 cmdlet 配置 32 位以上 MMIO 空间:

    Set-VM -HighMemoryMappedIoSpace 33280Mb -VMName VMName
    

    提示

    显示的 MMIO 空间值是为使用单个 GPU 进行实验而设置的合理值。 如果在启动 VM 后,设备报告与资源不足相关的错误,则可能需要修改这些值。 有关如何精确计算 MMIO 需求的详细信息,请参阅使用离散设备分配规划设备部署

从主机分区中卸载设备

按照本部分中的说明从主机分区中卸载设备。

安装分区驱动程序(可选)

DDA 使硬件供应商能够为其设备提供安全缓解驱动程序。 此驱动程序与安装在来宾 VM 中的设备驱动程序不同。 是否提供此驱动程序由硬件供应商自行决定。 但是,如果他们提供了驱动程序,则请在从主机分区卸载此设备之前安装该驱动程序。 请联系硬件供应商,了解他们是否有缓解驱动程序。

如果未提供分区驱动程序,则在卸载过程中必须使用 -Force 选项来绕过安全警告。 有关安全影响的详细信息,请参阅使用离散设备分配规划设备部署

查找设备的位置路径

需要 PCI 位置路径才能从主机中卸载和装载设备。 示例位置路径如下所示:PCIROOT(20)#PCI(0300)#PCI(0000)#PCI(0800)#PCI(0000)。 有关查找位置路径的详细信息,请参阅使用离散设备分配规划设备部署

禁用设备

使用设备管理器或 PowerShell,确保设备已禁用

卸载设备

你是否必须使用 -Force 选项取决于供应商是否提供了缓解驱动程序,如下所示:

  • 如果已安装缓解驱动程序,请使用以下 cmdlet:

    Dismount-VMHostAssignableDevice -LocationPath $locationPath
    
  • 如果未安装缓解驱动程序,请使用以下 cmdlet:

    Dismount-VMHostAssignableDevice -Force -LocationPath $locationPath
    

将设备分配到来宾 VM

最后一步是告知 Hyper-V VM 应有权访问设备。 指定 VM 的位置路径和名称。

Add-VMAssignableDevice -LocationPath $locationPath -VMName VMName

在 VM 上完成任务

设备成功装载到 VM 中后,现在可以启动该 VM 并与设备进行交互,就像在裸机系统上运行时一样。 你现在可以在 VM 中安装硬件供应商的驱动程序,并且应用程序能够看到该硬件。 可以通过在来宾 VM 中打开设备管理器并看到硬件可用来验证这一点。

删除设备并将其返回到主机

如果要将设备恢复为其原始状态,则需要停止 VM 并发出以下命令:

# Remove the device from the VM
Remove-VMAssignableDevice -LocationPath $locationPath -VMName VMName

# Mount the device back in the host
Mount-VMHostAssignableDevice -LocationPath $locationPath

然后,可以在设备管理器中重新启用设备,主机操作系统将能够再次与设备进行交互。

示例 - 将 GPU 装载到 VM

此示例使用 PowerShell 配置名为 ddatest1 的虚拟机,以获取制造商 NVIDIA 提供的第一个 GPU,并将其分配到虚拟机中。

# Configure the VM for a Discrete Device Assignment
$vm = "ddatest1"
# Set automatic stop action to TurnOff
Set-VM -Name $vm -AutomaticStopAction TurnOff
# Enable Write-Combining on the CPU
Set-VM -GuestControlledCacheTypes $true -VMName $vm
# Configure 32 bit MMIO space
Set-VM -LowMemoryMappedIoSpace 3Gb -VMName $vm
# Configure Greater than 32 bit MMIO space
Set-VM -HighMemoryMappedIoSpace 33280Mb -VMName $vm

# Find the Location Path and disable the Device
# Enumerate all PNP Devices on the system
$pnpdevs = Get-PnpDevice -presentOnly
# Select only those devices that are Display devices manufactured by NVIDIA
$gpudevs = $pnpdevs | Where-Object {$_.Class -like "Display" -and $_.Manufacturer -like "NVIDIA"}
# Select the location path of the first device that's available to be dismounted by the host.
$locationPath = ($gpudevs | Get-PnpDeviceProperty DEVPKEY_Device_LocationPaths).data[0]
# Disable the PNP Device
Disable-PnpDevice -InstanceId $gpudevs[0].InstanceId

# Dismount the Device from the Host
Dismount-VMHostAssignableDevice -Force -LocationPath $locationPath

# Assign the device to the guest VM.
Add-VMAssignableDevice -LocationPath $locationPath -VMName $vm

排查装载 GPU 时出现的问题

如果将 GPU 传递到 VM,但远程桌面服务或应用程序无法识别此 GPU,则请检查是否存在以下常见问题。

  • 请务必安装 GPU 供应商的最新版本的受支持驱动程序,并确保此驱动程序未报告任何错误。 可以通过在“设备管理器”中检查设备状态来完成此操作。

  • 确保你的设备在虚拟机中分配了足够的 MMIO 空间。 有关详细信息,请参阅 MMIO 空间

  • 确保你使用的是供应商支持在此配置中使用的 GPU。 例如,在传递到 VM 的情况下,一些供应商会阻止其消费级显卡在这种情况下运行。

  • 确保应用程序支持在 VM 中运行,并且确保应用程序支持 GPU 及其关联的驱动程序。 某些应用程序具有 GPU 和环境的允许列表。

  • 如果你在来宾上使用远程桌面会话主机角色或 Windows Multipoint 服务,则必须确保将特定组策略项设置为允许使用默认 GPU。 使用应用于来宾(或来宾上的本地组策略编辑器)的组策略对象。 导航到以下组策略项:

    “计算机配置”\“管理员模板”\“Windows 组件”\“远程桌面服务”\“远程桌面会话主机”\“远程会话环境”\“针对所有远程桌面服务会话使用硬件图形适配器”

    将“组策略”值设为已启用,然后在应用此策略后重新启动 VM。