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