Eseguire Hyper-V in una macchina virtuale con la virtualizzazione annidata

La virtualizzazione annidata è una funzionalità che consente di eseguire Hyper-V all'interno di una macchina virtuale (VM) Hyper-V. Ciò è utile per l'esecuzione di un emulatore di telefono di Visual Studio in una macchina virtuale o per il test di configurazioni che normalmente richiedono più host.

Nota

La virtualizzazione annidata è supportata sia in Azure che in locale. Tuttavia, se si usa un hypervisor non Microsoft, ad esempio KVM, Microsoft non può fornire supporto end-to-end. Assicurarsi che il fornitore supporti questo scenario. Screenshot della dimostrazione delle virtualizzazione annidate eseguendo un emulatore in un altro emulatore.

Prerequisiti

Processore Intel con tecnologia VT-x e EPT

  • L'host Hyper-V deve essere Windows Server 2016/Windows 10 o maggiore
  • Configurazione della macchina virtuale versione 8.0 o successiva

Processore AMD EPYC/Ryzen o versioni successive

  • L'host Hyper-V deve essere Windows Server 2022/Windows 11 o versione successiva
  • Configurazione della macchina virtuale versione 10.0 o successiva

Nota

Il guest può essere qualsiasi sistema operativo guest supportato da Windows. I sistemi operativi Windows più recenti possono supportare illuminazione che migliorano le prestazioni.

Configurare la virtualizzazione nidificata

  1. Creare una macchina virtuale. Vedere i prerequisiti sopra per le versioni di sistema operativo e macchina virtuale necessarie.
  2. Con la macchina virtuale in stato non attivo, eseguire comando seguente nell'host Hyper-V fisico. In questo modo viene abilitata la virtualizzazione nidificata per la macchina virtuale.
Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true
  1. Avviare la macchina virtuale.
  2. Installare Hyper-V all'interno della macchina virtuale, proprio come si farebbe per un server fisico. Per altre informazioni, vedere Installare Hyper-V in Windows 10.

Disabilitare la virtualizzazione nidificata

È possibile disabilitare la virtualizzazione nidificata per una macchina virtuale arrestata con il comando PowerShell seguente:

Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $false

Ridimensionamento della memoria dinamica e della memoria di runtime

Quando Hyper-V è in esecuzione all'interno di una macchina virtuale, la macchina virtuale deve essere disattivata per regolare la quantità di memoria. Ciò significa che anche se la memoria dinamica è abilitata, la quantità di memoria non subirà fluttuazioni. Per le macchine virtuali senza la memoria dinamica abilitata, qualsiasi tentativo di modificare la quantità di memoria mentre è attivata avrà esito negativo.

Si noti che la semplice attivazione della virtualizzazione nidificata non ha alcun effetto sul ridimensionamento della memoria dinamica o della memoria di runtime. L'incompatibilità si verifica solo durante l'esecuzione di Hyper-V nella macchina virtuale.

Opzioni di rete

Sono disponibili due opzioni di rete con le macchine virtuali annidate:

  1. Spoofing degli indirizzi MAC
  2. Reti NAT

Spoofing degli indirizzi MAC

Per instradare i pacchetti di rete tramite due commutatori virtuali, lo spoofing degli indirizzi MAC deve essere abilitato sul primo livello (L1) del commutatore virtuale. Tale operazione può essere eseguita con il comando di PowerShell seguente.

Get-VMNetworkAdapter -VMName <VMName> | Set-VMNetworkAdapter -MacAddressSpoofing On

Network Address Translation (NAT)

La seconda opzione si basa sulla modalità NAT (Network Address Translation). Questo approccio è adatto ai casi in cui lo spoofing degli indirizzi MAC non è possibile, ad esempio in un ambiente cloud pubblico.

In primo luogo è necessario creare un commutatore NAT virtuale nella macchina host virtuale, ovvero la VM "intermedia". Si noti che gli indirizzi IP sono soltanto esempi e possono variare a seconda degli ambienti:

New-VMSwitch -Name VmNAT -SwitchType Internal
New-NetNat –Name LocalNAT –InternalIPInterfaceAddressPrefix “192.168.100.0/24”

Successivamente occorre assegnare un indirizzo IP alla scheda di rete:

Get-NetAdapter "vEthernet (VmNat)" | New-NetIPAddress -IPAddress 192.168.100.1 -AddressFamily IPv4 -PrefixLength 24

A ogni macchina virtuale annidata deve essere assegnato un indirizzo IP e un gateway. Si noti che l'IP del gateway deve puntare alla scheda NAT del passaggio precedente. È anche possibile assegnare un server DNS:

Get-NetAdapter "vEthernet (VmNat)" | New-NetIPAddress -IPAddress 192.168.100.2 -DefaultGateway 192.168.100.1 -AddressFamily IPv4 -PrefixLength 24
Netsh interface ip add dnsserver “vEthernet (VmNat)” address=<my DNS server>

Come funziona la virtualizzazione annidata

I processori moderni includono funzionalità hardware che rendono la virtualizzazione più veloce e sicura. Hyper-V si basa su queste estensioni del processore per eseguire le macchine virtuali (ad esempio Intel VT-x e AMD-V). In genere una volta avviato, Hyper-V impedisce ad altri software di utilizzare queste funzionalità del processore. Pertanto le macchine virtuali guest non possono eseguire eseguire Hyper-V.

La virtualizzazione annidata rende questo supporto hardware disponibile per le macchine virtuali guest.

Il diagramma seguente mostra Hyper-V senza nidificazione. L'hypervisor Hyper-V assume il controllo completo delle funzionalità di virtualizzazione hardware (freccia arancione) e non le espone al sistema operativo guest.

Diagramma dei livelli di Hyper V con virtualizzazione annidata disabilitata.

Il diagramma seguente mostra Hyper-V con la virtualizzazione annidata abilitata. In questo caso, Hyper-V espone le estensioni di virtualizzazione hardware alle macchine virtuali. Se la funzione di nidificazione è abilitata, una macchina virtuale guest può installare un hypervisor ed eseguire macchine virtuali guest.

Diagramma dei livelli di Hyper V con virtualizzazione annidata abilitata

App di virtualizzazione di terze parti

Le applicazioni di virtualizzazione diverse da Hyper-V non sono supportate nelle macchine virtuali Hyper-V ed è probabile che generino errori. È incluso qualsiasi software che richiede estensioni di virtualizzazione hardware.