W10/WS2016: Nested Virtualization

image

La Nested Virtualization è una funzionalità che consente di eseguire Hyper-V all’interno di una macchina virtuale Hyper-V. Può essere utile in fase di test per configurazioni che normalmente richiedono più host, come ad esempio creazione di cluster.

Prerequisiti

  • L’host e il guest Hyper-V devono eseguire  Windows 10/Windows Server 2016 anniversary update o versioni successive.
  • Configurazione della macchina virtuale 8.0 o versione successiva.
  • Un processore Intel con tecnologia VT-x ed EPT, l’annidamento è attualmente solo per Intel.

Abilitare la Nested Virtualization

  1. Creare una macchina virtuale. 
  2. Con la macchina virtuale in stato non attivo, eseguire il seguente comando nell’host Hyper-V fisico. In questo modo viene abilitata per la macchina virtuale.
Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true

Dopodiché avviare la macchina virtuale e installare Hyper-V all’interno della macchina virtuale, proprio come si farebbe per un server fisico.

Disabilitare la Nested Virtualization

È possibile disabilitare la Nested Virtualization per una macchina virtuale arrestata con il comando PowerShell seguente:

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

Opzioni di rete

Sono disponibili due opzioni di rete :

  1. Spoofing degli indirizzi MAC
  2. Reti NAT
Spoofing degli indirizzi MAC

Per poter instradare i pacchetti di rete attraverso due commutatori virtuali, è necessario abilitare lo spoofing degli indirizzi MAC nel primo livello (L1) di commutatore virtuale. Tale operazione può essere completata 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 nested VM 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 "Ethernet" | New-NetIPAddress -IPAddress 192.168.100.2 -DefaultGateway 192.168.100.1 -AddressFamily IPv4 -PrefixLength 24
Netsh interface ip add dnsserver “Ethernet” address=<my DNS server>