Distribuire dispositivi di grafica usando l'assegnazione di dispositivi discreta
Informazioni su come usare l'assegnazione di dispositivi discreti (Discrete Device Assignment, DDA) per passare un intero dispositivo PCIe in una macchina virtuale (VM) con PowerShell. In questo modo è possibile accedere ad alte prestazioni ai dispositivi, ad esempio archiviazione NVMe o schede grafiche dall'interno di una macchina virtuale, pur essendo in grado di applicare i driver nativi del dispositivo. Per ulteriori informazioni sui dispositivi che funzionano e sulle possibili implicazioni per la sicurezza, consultare Pianificare la distribuzione dei dispositivi utilizzando l'assegnazione di dispositivi discreti.
In questo articolo viene illustrata la procedura necessaria per usare un dispositivo con DDA:
- Configurare la VM per DDA
- Smontare il dispositivo dalla partizione host
- Assegnare il dispositivo alla macchina virtuale guest
Prerequisiti
Prima di poter usare la DDA per distribuire i dispositivi grafici, è necessario disporre degli elementi seguenti.
Un host Hyper-V con Windows Server 2016 o versioni successive.
Una VM che esegue uno dei sistemi operativi seguenti:
Windows Server 2016 o versioni successive.
Windows 10 o versione successiva.
Vedere Pianificare la distribuzione di dispositivi con Discrete Device Assignment per verificare che l'hardware sia compatibile con la DDA.
- Eseguire lo script PowerShell SurveyDDA.ps1. per verificare che il server sia configurato correttamente. Lo script visualizza anche i dispositivi che possono essere passati con l'assegnazione di dispositivi discreti.
Privilegi di amministratore per l'host Hyper-V.
(Facoltativo) Anche se non è obbligatorio, se Single Root I/O Virtualization (SR-IOV) non è abilitato o supportato, è possibile che si verifichino problemi quando si usa la DDA per distribuire i dispositivi grafici.
Configurare la macchina virtuale per la DDA
Il primo passaggio della soluzione consiste nell'indirizzare le restrizioni di DDA per le macchine virtuali.
Accedere all'host Hyper-V come amministratore.
Apri un prompt di PowerShell con privilegi elevati.
Configurare
Automatic Stop Action
di una macchina virtuale per abilitare TurnOff con il cmdlet di PowerShell seguente:Set-VM -Name VMName -AutomaticStopAction TurnOff
Preparazione delle macchine virtuali per i dispositivi grafici
Alcuni hardware offrono prestazioni migliori se la macchina virtuale è configurata in un certo modo. Per sapere se sono necessarie le configurazioni seguenti per l'hardware, contattare il fornitore dell'hardware. Per ulteriori informazioni, consultare Pianificare la distribuzione dei dispositivi utilizzando l'assegnazione di dispositivi discreti e questo post di blog.
Abilitare la combinazione di scrittura nella CPU usando il cmdlet seguente:
Set-VM -GuestControlledCacheTypes $true -VMName VMName
Configurare lo spazio di I/O mappato alla memoria (MMIO) a 32 bit usando il cmdlet seguente:
Set-VM -LowMemoryMappedIoSpace 3Gb -VMName VMName
Configurare uno spazio MMIO maggiore di 32 bit usando il cmdlet seguente:
Set-VM -HighMemoryMappedIoSpace 33280Mb -VMName VMName
Suggerimento
I valori dello spazio MMIO visualizzati sono valori ragionevoli da impostare per l'esperimento con una singola GPU. Se dopo l'avvio della macchina virtuale il dispositivo segnala un errore relativo a risorse non sufficienti, sarà probabilmente necessario modificare questi valori. Per altre informazioni su come calcolare con precisione i requisiti di MMIO, consultare Pianificare la distribuzione dei dispositivi utilizzando l'assegnazione di dispositivi discreti.
Smontare il dispositivo dalla partizione host
Seguire le istruzioni riportate in questa sezione per smontare il dispositivo dalla partizione host.
Installare il driver di partizionamento (facoltativo)
DDA offre ai fornitori di hardware la possibilità di fornire un driver di mitigazione della sicurezza con i propri dispositivi. Questo driver non corrisponde al driver di dispositivo installato nella macchina virtuale guest. È a discrezione del fornitore di hardware fornire questo driver. Ma se è disponibile un driver, installarlo prima di smontare il dispositivo dalla partizione host. Contattare il fornitore dell'hardware per verificare se ha un driver di mitigazione.
Se non viene fornito alcun driver di partizionamento, durante lo smontaggio è necessario usare l'opzione -Force
per ignorare l'avviso di sicurezza. Per ulteriori informazioni sulle implicazioni per la sicurezza, consultare Pianificare la distribuzione dei dispositivi utilizzando l'assegnazione di dispositivi discreti.
Individuare il percorso del dispositivo
Il percorso PCI è necessario per smontare e montare il dispositivo dall'host. Un percorso di esempio è simile al seguente: PCIROOT(20)#PCI(0300)#PCI(0000)#PCI(0800)#PCI(0000)
. Per ulteriori informazioni sull'individuazione del percorso, consultare Pianificare la distribuzione dei dispositivi utilizzando l'assegnazione di dispositivi discreti.
Disattivare il dispositivo
Usando Gestione dispositivi o PowerShell, assicurarsi che il dispositivo sia Disabilitato.
Smontare il dispositivo
A seconda che il fornitore abbia fornito un driver di mitigazione, è necessario usare o meno l'opzione -Force
, come illustrato di seguito:
Se è stato installato un driver di mitigazione, usare il cmdlet seguente:
Dismount-VMHostAssignableDevice -LocationPath $locationPath
Se non è stato installato un driver di mitigazione, usare il cmdlet seguente:
Dismount-VMHostAssignableDevice -Force -LocationPath $locationPath
Assegnare il dispositivo alla macchina virtuale guest
Il passaggio finale consiste nell'indicare a Hyper-V che una macchina virtuale deve avere accesso al dispositivo. Specificare il percorso e il nome della macchina virtuale.
Add-VMAssignableDevice -LocationPath $locationPath -VMName VMName
Completare le attività nella macchina virtuale
Dopo che un dispositivo è stato montato correttamente in una macchina virtuale, è possibile avviare la macchina virtuale e interagire con il dispositivo come se fosse in esecuzione in un sistema bare metal. È ora possibile installare i driver del fornitore di hardware nella macchina virtuale e le applicazioni sono in grado di visualizzare l'hardware. È possibile verificarlo aprendo Gestione dispositivi nella macchina virtuale guest e verificando che l'hardware sia disponibile.
Rimuovere un dispositivo e restituirlo all'host
Se si vuole ripristinare lo stato originale del dispositivo, è necessario arrestare la macchina virtuale ed eseguire questo comando:
# Remove the device from the VM
Remove-VMAssignableDevice -LocationPath $locationPath -VMName VMName
# Mount the device back in the host
Mount-VMHostAssignableDevice -LocationPath $locationPath
È quindi possibile abilitare di nuovo il dispositivo in Gestione dispositivi e il sistema operativo host sarà in grado di interagire di nuovo con il dispositivo.
Esempio: montare una GPU in una VM
Questo esempio usa PowerShell per configurare una macchina virtuale denominata ddatest1 per prendere la prima GPU disponibile dal produttore NVIDIA e assegnarla alla macchina virtuale.
# 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
Risolvere i problemi relativi al montaggio di una GPU
Se si passa una GPU in una VM, ma Servizi Desktop remoto o un'applicazione non riconosce la GPU, verificare la presenza dei seguenti problemi comuni.
Assicurarsi di installare la versione più recente del driver supportato dal fornitore della GPU e che il driver non segnali errori. È possibile farlo controllando lo stato del dispositivo in Gestione dispositivi.
Assicurarsi che il dispositivo disponga di spazio MMIO sufficiente allocato all'interno della macchina virtuale. Per ulteriori informazioni, consultare spazio MMIO.
Assicurarsi di usare una GPU supportata dal fornitore in questa configurazione. Ad esempio, alcuni fornitori impediscono il funzionamento delle schede consumer quando vengono passate a una macchina virtuale.
Assicurarsi che l'applicazione supporti l'esecuzione all'interno di una macchina virtuale e che l'applicazione supporti sia la GPU che i driver associati. Alcune applicazioni hanno elenchi consentiti di GPU e ambienti.
Se si usa il ruolo Host sessione Desktop remoto o Servizi Multipoint Windows nel guest, è necessario assicurarsi che sia impostata una voce di Criteri di gruppo specifica per consentire l'uso della GPU predefinita. Utilizzare un oggetto Criteri di gruppo applicato al guest (o l'Editor Criteri di gruppo locali sul guest). Passare al seguente elemento Criteri di gruppo:
Configurazione computer\Modelli amministratore\Componenti di Windows\Servizi Desktop remoto\Host sessione Desktop remoto\Ambiente sessione remota\Usa schede grafiche hardware per tutte le sessioni di Servizi Desktop remoto.
Impostare il valore di Criteri di gruppo su Abilitato, quindi riavviare la VM una volta applicato il criterio.