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

了解如何使用 PowerShell 使用离散设备分配 (DDA) 将整个 PCIe 设备传递到虚拟机 (VM) 中。 这样做允许从 VM 中对 NVMe 存储 或显卡等设备进行高性能访问,同时能够应用设备的本机驱动程序。 有关正常工作的设备以及可能的安全隐患的更多信息,请参阅 使用离散设备分配规划部署设备

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

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

先决条件

在使用 DDA 部署图形设备之前,您需要满足以下条件。

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

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

    • Windows Server 2016 或更高版本。

    • Windows 10 或更高版本。

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

    • 运行 SurveyDDA.ps1。 PowerShell 脚本来确定服务器配置是否正确。 该脚本还显示哪些设备可以使用 Discrete Device Assignment 传递。
  • Hyper-V 主机的管理权限。

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

为 DDA 配置 VM

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

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

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

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

    Set-VM -Name VMName -AutomaticStopAction TurnOff
    

图形设备的 VM 准备

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

  1. 使用以下 cmdlet 在 CPU 上启用 Write-Combining:

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

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

    Set-VM -HighMemoryMappedIoSpace 33280Mb -VMName VMName
    

    小窍门

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

从 host 分区中卸载设备

按照本节中的说明从 host 分区中卸载设备。

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

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

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

找到设备的位置路径

从主机卸载和挂载设备需要 PCI 位置路径。 位置路径示例如下所示: PCIROOT(20)#PCI(0300)#PCI(0000)#PCI(0800)#PCI(0000). 有关查找位置路径的更多信息,请参阅 Plan for Deploying Devices Using Discrete Device Assignment

禁用设备

使用设备管理器或 PowerShell 确保设备处于 Disabled 状态。

卸载设备

根据供应商是否提供了缓解驱动程序,您必须使用或不使用该 -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 的 VM,以获取制造商 NVIDIA 提供的第一个 GPU 并将其分配到 VM 中。

# 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 组件\远程桌面服务\远程桌面会话主机\远程会话环境\对所有远程桌面服务会话使用硬件图形适配器

    将 Group Policy 值设置为 Enabled,然后在应用策略后重新启动 VM。