Bereitstellen von Grafikgeräten mithilfe diskreter Gerätezuweisung (Discrete Device Assignment, DDA)

Gilt für: Windows Server 2022, Windows Server 2019, Microsoft Hyper-V Server 2019, Windows Server 2016, Microsoft Hyper-V Server 2016

Ab Windows Server 2016 können Sie die diskrete Gerätezuweisung Discrete Device Assignment, DDA) verwenden, um ein gesamtes PCIe-Gerät an eine virtuelle Maschine (VM) zu übergeben. Dies ermöglicht einen leistungsstarken Zugriff auf Geräte wie den NVMe-Speicher oder auf Grafikkarten von einer VM aus, wobei die nativen Treiber des Geräts genutzt werden können. Weitere Informationen zu funktionierenden Geräten und möglichen Sicherheitsauswirkungen, finden Sie unter Planen der Bereitstellung von Geräten mithilfe diskreter Gerätezuweisung.

Wichtig

Auch wenn es nicht erforderlich ist, treten möglicherweise Probleme auf, wenn E/A-Virtualisierung mit Einzelstamm (Single Root I/O Virtualization, SR-IOV) nicht aktiviert oder unterstützt wird, wenn Sie DDA zum Bereitstellen von Grafikgeräten verwenden.

Es sind drei Schritte erforderlich, um ein Gerät mithilfe von DDA zu nutzen:

  1. Konfigurieren der VM für DDA
  2. Aufheben der Einbindung des Geräts in die Hostpartition
  3. Zuweisen des Geräts zur Gast-VM

Sie können sämtliche Befehle auf dem Host an einer Windows PowerShell-Konsole als Administrator ausführen.

Konfigurieren der VM für DDA

Der erste Schritt zur Lösung besteht darin, DDA-Einschränkungen für die VMs zu beheben. Konfigurieren Sie die Automatic Stop Action eines virtuellen Computers, um TurnOff mit dem folgenden PowerShell-Cmdlet zu aktivieren:

Set-VM -Name VMName -AutomaticStopAction TurnOff

VM-Vorbereitung für Grafikgeräte

Bestimmte Hardware funktioniert besser, wenn der virtuelle Computer auf eine bestimmte Weise konfiguriert ist. Wenn Sie Details dazu benötigen, ob die folgenden Konfigurationen für Ihre Hardware erforderlich sind, wenden Sie sich bitte an den Hardwarehersteller. Weitere Details finden Sie unter Planen der Bereitstellung von Geräten mit diskreter Gerätezuweisung und in diesem Blogbeitrag.

  1. Aktivieren Sie Write-Combining auf der CPU mithilfe des folgenden Cmdlets:

    Set-VM -GuestControlledCacheTypes $true -VMName VMName
    
  2. Konfigurieren Sie den 32-Bit-MMIO-Bereich mithilfe des folgenden Cmdlets:

    Set-VM -LowMemoryMappedIoSpace 3Gb -VMName VMName
    
  3. Konfigurieren Sie den Bereich oberhalb des 32-Bit-MMIO-Bereichs mithilfe des folgenden Cmdlets:

    Set-VM -HighMemoryMappedIoSpace 33280Mb -VMName VMName
    

    Tipp

    Die oben genannten MMIO-Bereichswerte sind vernünftige Werte für das Experimentieren mit einer einzelnen GPU. Wenn das Gerät nach dem Starten der VM einen Fehler im Zusammenhang mit unzureichenden Ressourcen meldet, müssen Sie diese Werte wahrscheinlich ändern. Weitere Informationen zur genauen Berechnung der MMIO-Anforderungen finden Sie unter Planen der Bereitstellung von Geräten mithilfe diskreter Gerätezuweisung.

Aufheben der Einbindung des Geräts in der Hostpartition

Folgen Sie den Anweisungen in diesem Abschnitt, um die Bereitstellung des Geräts in der Hostpartition aufzuheben.

Installieren des Partitionierungstreibers (optional)

Das DDA bietet Hardwareanbietern die Möglichkeit, zusammen mit ihren Geräten einen Treiber zur Bedrohungsminderung bereitzustellen. Dieser Treiber ist nicht mit dem Gerätetreiber identisch, der auf der Gast-VM installiert wird. Die Entscheidung, diesen Treiber bereitzustellen, liegt beim Hardwareanbieter. Wenn dieser jedoch einen Treiber bereitstellt, installieren Sie ihn, bevor Sie die Bereitstellung des Geräts in der Hostpartition aufheben. Wenden Sie sich an den Hardwarehersteller, um zu erfahren, ob ein Treiber zur Bedrohungsminderung verfügbar ist.

Wenn kein Partitionierungstreiber bereitgestellt wird, müssen Sie während der Aufhebung der Einbindung die Option „-Force“ verwenden, um die Sicherheitswarnung zu umgehen. Weitere Informationen über die möglichen Sicherheitsauswirkungen, finden Sie unter Planen der Bereitstellung von Geräten mithilfe diskreter Gerätezuweisung.

Suchen des Speicherortpfads des Geräts

Der PCI-Speicherortpfad ist für die Einbindung des Geräts in den Host und die Aufhebung erforderlich. Ein beispielhafter Speicherortpfad sieht folgendermaßen aus: PCIROOT(20)#PCI(0300)#PCI(0000)#PCI(0800)#PCI(0000). Weitere Informationen zum Suchen des Speicherortpfads finden Sie unter Planen der Bereitstellung von Geräten mithilfe diskreter Gerätezuweisung.

Deaktivieren des Geräts

Vergewissern Sie sich mithilfe des Geräte-Managers oder von PowerShell, dass das Gerät deaktiviert ist.

Aufheben der Geräteeinbindung

Je nachdem, ob der Anbieter einen Treiber zur Bedrohungsminderung bereitgestellt hat, müssen Sie entweder die Option „-Force“ verwenden oder nicht, wie hier gezeigt wird:

  • Wenn ein Treiber zur Bedrohungsminderung installiert wurde, verwenden Sie das folgende Cmdlet:

    Dismount-VMHostAssignableDevice -LocationPath $locationPath
    
  • Wenn kein Treiber zur Bedrohungsminderung installiert wurde, verwenden Sie das folgende Cmdlet:

    Dismount-VMHostAssignableDevice -Force -LocationPath $locationPath
    

Zuweisen des Geräts zur Gast-VM

Der letzte Schritt besteht darin, Hyper-V mitzuteilen, dass eine VM Zugriff auf das Gerät haben soll. Geben Sie den Speicherortpfad und den Namen der VM an.

Add-VMAssignableDevice -LocationPath $locationPath -VMName VMName

Ausführen von Aufgaben auf der VM

Nachdem ein Gerät erfolgreich in eine VM eingebunden wurde, können Sie diese VM starten und mit dem Gerät interagieren, als ob Sie es auf einem Bare-Metal-System ausgeführen würden. Sie können jetzt die Treiber des Hardwareherstellers auf der VM installieren, und Anwendungen können die Hardware erkennen. Sie können dies überprüfen, indem Sie den Geräte-Manager auf der Gast-VM öffnen und sehen, dass die Hardware jetzt angezeigt wird.

Entfernen eines Geräts und Zurückgeben an den Host

Wenn Sie das Gerät wieder in den ursprünglichen Zustand versetzen möchten, müssen Sie die VM beenden und folgenden Befehl erteilen:

# Remove the device from the VM
Remove-VMAssignableDevice -LocationPath $locationPath -VMName VMName
# Mount the device back in the host
Mount-VMHostAssignableDevice -LocationPath $locationPath

Anschließend können Sie das Gerät im Geräte-Manager erneut aktivieren, und das Hostbetriebssystem kann wieder mit dem Gerät interagieren.

Einbinden einer GPU auf einer VM

In diesem Beispiel verwenden wir PowerShell, um eine VM mit dem Namen ddatest1 zu konfigurieren, um die erste vom Hersteller NVIDIA verfügbare GPU auszuwählen und sie der VM zuzuweisen.

# 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

Behandeln von Problemen beim Einbinden einer GPU

Wenn Sie eine GPU an eine VM übergeben haben, sie aber von Remotedesktop oder einer Anwendung nicht erkannt wird, prüfen Sie, ob eines der folgenden gängigen Probleme vorliegt:

  • Vergewissern Sie sich, dass Sie die aktuellste Version des vom GPU-Anbieter unterstützten Treibers installiert haben und dass der Treiber keine Fehler meldet. Sie können dies tun, indem Sie den Gerätestatus im Geräte-Manager überprüfen.

  • Vergewissern Sie sich, dass Ihrem Gerät genügend MMIO-Speicherplatz innerhalb der VM zugeordnet ist. Weitere Informationen finden Sie unter MMIO-Bereich.

  • Achten Sie darauf, eine GPU zu verwenden, deren Einsatz in dieser Konfiguration vom Anbieter unterstützt wird. Beispielsweise blockieren einige Anbieter die Nutzung ihrer Consumerkarten, wenn sie an eine VM übergeben werden.

  • Vergewissern Sie sich, dass die Anwendung die Ausführung innerhalb einer VM unterstützt und dass die Anwendung sowohl die GPU als auch die zugehörigen Treiber unterstützt. Für manche Anwendungen bestehen Positivlisten mit GPUs und Umgebungen.

  • Wenn Sie die Rolle „Remotedesktop-Sitzungshost“ oder „Windows Multipoint Services“ auf dem Gast verwenden, müssen Sie sicherstellen, dass ein bestimmter Gruppenrichtlinieneintrag festgelegt ist, um die Verwendung der Standard-GPU zuzulassen. Verwenden Sie ein Gruppenrichtlinienobjekt, das auf den Gast (oder den lokalen Gruppenrichtlinienobjekt-Editor auf dem Gast) angewendet wird, um zum folgenden Gruppenrichtlinienelement zu navigieren:

    Computerkonfiguration\Administrative Vorlagen\Windows-Komponenten\Remotedesktopdienste\Remotedesktop-Sitzungshost\Remotesitzungsumgebung\Hardwaregrafikadapter für alle Sitzungen mit Remotedesktopdiensten verwenden.

    Legen Sie den Wert der Gruppenrichtlinie auf Aktiviert fest, und starten Sie dann die VM neu, nachdem die Richtlinie angewendet wurde.