使用离散设备分配部署图形设备
了解如何使用离散设备分配 (DDA) 并通过 PowerShell 将整个 PCIe 设备传递给虚拟机 (VM)。 这样做可以从 VM 内部以高性能方式访问 NVMe 存储或图形卡等设备,同时能够应用设备本机驱动程序。 有关工作设备和可能的安全影响的详细信息,请参阅使用离散设备分配规划设备部署。
本文将引导你完成将设备与 DDA 配合使用的步骤:
先决条件
使用 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 限制。
以管理员身份登录到 Hyper-V 主机。
打开提升的 PowerShell 命令提示符。
使用以下 PowerShell cmdlet 配置 VM 的
Automatic Stop Action
,以启用 TurnOff:Set-VM -Name VMName -AutomaticStopAction TurnOff
图形设备的 VM 准备
如果以某种方式配置虚拟机,某些硬件的性能会更好。 有关你的硬件是否需要以下配置的详细信息,请联系硬件供应商。 有关详细信息,请参阅使用离散设备分配规划设备部署和这篇博客文章。
使用以下 cmdlet 在 CPU 上启用写入组合:
Set-VM -GuestControlledCacheTypes $true -VMName VMName
使用以下 cmdlet 配置 32 位内存映射 I/O (MMIO) 空间:
Set-VM -LowMemoryMappedIoSpace 3Gb -VMName VMName
使用以下 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。