Вложенная виртуализация (Nested Virtualization) позволяет запустить Hyper-V внутри виртуальной машины и создать в таком гипервизоре Hyper-V еще несколько виртуальных машин. Чаще всего вложенная виртуализация используется в различных стендах, лабах и тестовых средах.
Microsoft Hyper-V поддерживает вложенную виртуализацию начиная с Windows Server 2016. Если попытаться установить роль Hyper-V внутри ВМ на гостевом Hyper-V с Windows Server 2012 R2, вы получите ошибку:
Hyper-V can not be installed: The hypervisor is already running.
Эта ошибка связана с тем что хостовой Hyper-V специально маскировал от гостевых ОС наборы аппаратных инструкций (Virtualization Extensions) Intel VT-x и AMD-V.
В Windows Server 2016 архитектура Hyper-V была изменена. Изменились и требования к процессорам. Теперь для работы вложенной виртуализации кроме поддержки Intel VT-x, процессор должен поддерживать Intel EPT (предоставляет виртуальным машинам прямой доступ к памяти, минуя гипервизор).
Другие ограничения при использовании вложенной виртуализации:
- В хостовой и гостевой Hyper-V должны быть установлены Windows Server 2016 или Windows 10 с ролью Hyper-V;
- Версия виртуального оборудования Hyper-V (VM hardware version) 8.0 и выше;
- Для виртуальных машин, запушенных во вложенной виртуализации не поддерживается динамическая память, динамическая миграция, снимки ВМ и состояние Save/Restore.
Рассмотрим, как включить и использовать вложенную виртуализацию в Windows Server 2016.
Прежде всего вам нужно обновить версию конфигурации ВМ Hyper-V для которой вы хотите включить вложенную виртуализацию до версии 8.0 или выше (виртуальная машина должна быть выключена). Для этого запустите консоль Hyper-V Manager, найдите ВМ, щелкните по ней правой кнопкой и выберите Upgrade Configuration Version.
Также вы можете обновить HW версию виртуальной машины через PowerShell:
Update-VMVersion -Name ‘WinSrv2016Test’
Вы можете обновить версию виртуального оборудования сразу для всех ВМ на хосте:
Get-VM | Update-VMVersion
Теперь для выбранной виртуальной машины нужно включить поддержку вложенной виртуализации. По умолчанию гипервизор маскирует от гостевых ОС аппаратные наборы инструкций, отвечающих за виртуализацию. Чтобы исправить это, воспользуйтесь командой:
Set-VMProcessor -VMName VMName -ExposeVirtualizationExtensions $true
Т.к. для вложенных Hyper-V не поддерживается динамическая память, вы должны отключить эту опцию в настройках ВМ (VM -> Settings -> Memory -> снимите чекбокс Enable Dynamic Memory).
Или вы можете отключить динамическую память через PowerShell:
Set-VMMemory 'WinSrv2016Nested' -DynamicMemoryEnabled $false
Если вы планируете предоставлять доступ вложенным виртуальным машинам во внешнюю сеть, хостовой Hyper-V может увидеть несколько MAC адресов на единственном сетевом адаптере виртуальной машины. Поэтому вам нужно разрешить спуфинг MAC-адресов для сетевого адаптера ВМ.
Откройте свойства ВМ в консоли Hyper-V, найдите сетевой адаптер ВМ и в секции Advanced features включите опцию Enable MAC address spoofing.
Также вы можете включить эту опцию через PowerShell:
Get-VMNetworkAdapter -VMName 'WinSrv2016Test' | Set-VMNetworkAdapter -MacAddressSpoofing On
Для быстрой проверки ВМ и включения динамической памяти вы можете использовать готовый скрипт Enable-NestedVm.ps1.
Invoke-WebRequest https://raw.githubusercontent.com/Microsoft/Virtualization-Documentation/master/hyperv-tools/Nested/Enable-NestedVm.ps1 -OutFile ~/Enable-NestedVm.ps1 ~/Enable-NestedVm.ps1 -VmName 'WinSrv2016Test'
Теперь вам осталось установить роль Hyper-V в виртуальной машине (Install-WindowsFeature -Name Hyper-V -IncludeManagementTools -Restart
) и вы можете создавать вложенные виртуальные машины.