使用離散裝置指派部署圖形裝置

適用於:Windows Server 2022、Windows Server 2019、Microsoft Hyper-V Server 2019、Windows Server 2016、Microsoft Hyper-V Server 2016

從 Windows Server 2016 開始,您可以使用離散裝置指派 (DDA),將整個 PCIe 裝置傳遞到虛擬機器 (VM)。 這樣做可讓您從 VM 內高效存取 NVMe 儲存體或圖形卡等裝置,同時能夠套用裝置的原生驅動程式。 如需工作裝置和可能安全性隱患的詳細資訊,請參閱規劃使用離散裝置指派部署裝置

重要

雖然不是必要,但如果未啟用或支援單一根目錄 I/O 虛擬化 (SR-IOV),當您使用 DDA 部署圖形裝置時,可能會遇到問題。

搭配 DDA 使用裝置有三個步驟:

  1. 設定 DDA 的 VM
  2. 從主機分割區中卸載裝置
  3. 將裝置指派給客體 VM

您可以系統管理員身分在 Windows PowerShell 主控台上執行主機上的所有命令。

設定 VM 以進行 DDA

解決方案中的第一個步驟是解決 VM 的 DDA 限制。 使用下列 PowerShell Cmdlet 設定 VM 的 Automatic Stop Action,以啟用 TurnOff

Set-VM -Name VMName -AutomaticStopAction TurnOff

針對圖形裝置準備 VM

如果 VM 是以特定方式設定,某些硬體的執行效果會更好。 如需您是否需要下列硬體設定的詳細資料,請聯繫硬體廠商。 如需詳細資訊,請參閱規劃使用離散裝置指派部署裝置和此部落格文章

  1. 使用下列 Cmdlet,在 CPU 上啟用 Write-Combining:

    Set-VM -GuestControlledCacheTypes $true -VMName VMName
    
  2. 使用下列 Cmdlet 設定 32 位元 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 的 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 廠商支援的最新版驅動程式,且驅動程式未回報錯誤。 您可以這樣做,方法是檢查裝置管理員中的裝置狀態。

  • 確定您的裝置在 VM 內配置了足夠的 MMIO 空間。 如需詳細資訊,請參閱 MMIO 空間

  • 確定您使用的是廠商支援在此設定中使用的 GPU。 例如,有些廠商會防止其取用卡在傳遞至 VM 時運作。

  • 確定應用程式支援在 VM 內執行,以及應用程式同時支援 GPU 及其相關聯的驅動程式。 某些應用程式具有 GPU 和環境的允許清單。

  • 如果您在客體上使用遠端桌面工作階段主機角色或 Windows Multipoint 服務,則必須確定特定群組原則項目已設定為允許使用預設 GPU。 使用套用至客體的群組原則物件 (或客體上的本機群組原則編輯器) 瀏覽至下列群組原則項目:

    電腦設定\系統管理員範本\Windows 元件\遠端桌面服務\遠端桌面工作階段主機\遠端工作階段環境\針對所有遠端桌面服務工作階段使用硬體圖形介面卡

    將 [群組原則] 值設定為 Enabled,然後一旦套用了原則,就重新啟動 VM。