Microsoft has quietly slipped nested virtualization into Windows 10 build 10565, or in other words, Microsoft has included the ability to run Hyper-V on a Hyper-V virtual machine (VM) guest.
Although this technology is primarily intended for enabling Hyper-V Containers in Windows Server 2016 because server and client operating systems share the same core code, this feature has cropped up in Windows 10 before making an official appearance in the Windows Server technical preview, which last saw a refresh in August.
To make this technology work, Microsoft is virtualizing Intel VT-x and AMD-V hardware features that are normally hidden from the OS running in a guest VM. It should also be noted that only Intel VT-x based systems are supported in the current build. For more information on Windows Server Containers, see What are Windows Server Containers? on the Petri IT Knowledgebase.
In advance of the public preview of Hyper-V Containers on Windows Server 2016, this early glimpse of nested Hyper-V has a list of known issues and only supports Hyper-V on Hyper-V. Stated differently, no other hypervisor can be installed on a Hyper-V guest VM. Furthermore, only Windows 10 build 10565 or later versions are supported as guest and host operating systems for the time being.
Dynamic memory must be disabled, and if networking is required, MAC spoofing must be enabled, which can be achieved using the Set-VMNetworkAdapter cmdlet as shown below, replacing the value of the –VMName parameter with the name of a VM host, which will support nested virtualization.
Set-VMNetworkAdapter -VMName ‘My VM’ -MacAddressSpoofing On
It’s also worth noting that save, restore, and checkpoint operations will fail on hosts where nested virtualization is enabled, as well as attempts to resize runtime memory.
Microsoft has provided a PowerShell script for enabling nested virtualization on host VMs (Enable-NestedVm.ps1), and another for checking the current nested virtualization configuration status of VM hosts (Get-NestedVirtStatus.ps1), both of which can be downloaded from GitHub.
Both scripts must be run with elevated privileges, and the name of the VM host to be configured for nested virtualization must be passed to the Enable-NestedVm.ps1 script as shown below, replacing the value of the –VMName parameter with the name of the VM to be configured.
Enable-NestedVm.ps1 -VmName ‘My VM’
Don’t forget before trying nested virtualization, you’ll need plenty of available RAM. And although there’s no minimum requirement given by Microsoft, anything less than 4GB is likely to be a non-starter.