Запуск Hyper-V в виртуальной машине со вложенной виртуализацией

Вложенная виртуализация — это компонент, который позволяет запускать Hyper-V в виртуальной машине (ВМ) Hyper-V. Это полезно для запуска эмулятора телефона Visual Studio на виртуальной машине и для тестирования конфигураций, для которых обычно требуется несколько узлов.

Примечание

Вложенная виртуализация поддерживается в Azure и в локальной среде. Но при использовании гипервизора стороннего производителя, например KVM, корпорация Майкрософт не может предоставить комплексную поддержку. Убедитесь, что ваш поставщик поддерживает этот сценарий. Screenshot of demonstrating nested virtualizations by running an emulator in another emulator.

Предварительные требования

Процессор Intel с технологиями VT-x и EPT.

  • Узел Hyper-V должен работать под управлением Windows Server 2016/Windows 10 или более поздней версии.
  • Версия конфигурации виртуальной машины 8.0 или более поздняя.

Процессор AMD EPYC/Ryzen или более новый.

  • Узел Hyper-V должен работать под управлением Windows Server 2022/Windows 11 или более поздней версии.
  • Версия конфигурации виртуальной машины 10.0 или более поздняя.

Примечание

В гостевой системе может использоваться любая поддерживаемая операционная система Windows на виртуальной машине. Более новые операционные системы Windows могут поддерживать компоненты паравиртуализации, повышающие производительность.

Настройка вложенной виртуализации

  1. Создайте виртуальную машину. Необходимые версии ОС и виртуальных машин см. в предварительных требованиях выше.
  2. Пока виртуальная машина находится в отключенном состоянии, запустите следующую команду на физическом узле Hyper-V. В виртуальной машине будет включена вложенная виртуализация.
Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true
  1. Запустите виртуальную машину.
  2. Установите Hyper-V в виртуальной машине так же, как на физическом сервере. Дополнительные сведения об установке Hyper-V см. в разделе Установка Hyper-V.

Отключение вложенной виртуализации

Вы можете отключить вложенную виртуализацию в остановленной виртуальной машине следующей командой PowerShell:

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

Изменение размера динамической памяти и памяти для среды выполнения

При запуске Hyper-V в виртуальной машине в ней должна быть отключена настройка памяти. Это означает, что даже если динамическая память включена, ее объем не будет изменяться. Для виртуальных машин без динамической памяти все попытки изменить объем памяти включенной машины завершатся сбоем.

Обратите внимание, что само включение вложенной виртуализации не повлияет на изменение размера динамической памяти или памяти для среды выполнения. Несовместимость происходит, только если Hyper-V выполняется в виртуальной машине.

Параметры сетей

Существуют два параметра для сетей со вложенными виртуальными машинами:

  1. спуфинг MAC-адресов;
  2. Сеть NAT

Спуфинг MAC-адресов

Чтобы сетевые пакеты перенаправлялись через два виртуальных коммутатора, необходимо включить спуфинг MAC-адресов на первом (L1) уровне виртуального коммутатора. Это можно сделать с помощью следующей команды PowerShell.

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

Преобразование сетевых адресов (NAT)

Второй параметр связан с преобразованием сетевых адресов (NAT). Этот подход рекомендуется для случаев, когда спуфинг MAC-адресов невозможен, например в общедоступной облачной среде.

Сначала необходимо создать виртуальный коммутатор NAT в виртуальной машине узла ("средняя" виртуальная машина). Обратите внимание, что IP-адреса приведены только в качестве примера и будут разниться в зависимости от сред:

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

Далее назначьте IP-адрес для сетевого адаптера:

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

Каждая вложенная виртуальная машина должна иметь назначенный IP-адрес и шлюз. Обратите внимание, что IP-адрес шлюза должен указывать на адаптер NAT из предыдущего действия. Можно также назначить 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>

Принцип работы вложенной виртуализации

Современные процессоры поддерживают аппаратные функции, которые делают виртуализацию быстрее и надежнее. Hyper-V использует эти расширения процессора (например, Intel VT-x и AMD-V) для выполнения виртуальных машин. Как правило, после запуска Hyper-V другое программное обеспечение блокируется с помощью этих возможностей процессора. Это предотвращает запуск Hyper-V на гостевых виртуальных машинах.

Вложенная виртуализация предоставляет поддержку этих аппаратных функций гостевым виртуальным машинам.

На схеме ниже показана роль Hyper-V без вложения. Низкоуровневая оболочка Hyper-V полностью контролирует возможности аппаратной виртуализации (оранжевая стрелка) и скрывает их от операционной системы.

Diagram of the levels of Hyper V with nested virtualization disabled.

На следующей схеме показана роль Hyper-V с включенной вложенной виртуализацией. В этом случае Hyper-V предоставляет расширения аппаратной виртуализации виртуальным машинам. Если вложение включено, гостевая виртуальная машина может установить собственную низкоуровневую оболочку и запускать свои гостевые виртуальные машины.

Diagram of the levels of Hyper V with nested virtualization enabled

Сторонние приложения виртуализации

Приложения виртуализации, отличные от Hyper-V, не поддерживаются в виртуальных машинах Hyper-V и скорее всего приведут к сбою. Сюда входит любое программное обеспечение, требующее расширений виртуализации оборудования.