Вложенная виртуализация Hyper-V — первый шаг

Автор статьи — Михаил Комаров, MVP — Cloud and Datacenter Management


Добрый день! Цель сегодняшней статьи — рассказать о реализации вложенной виртуализации на платформе Hyper-V. Не секрет, что Hyper-V не поддерживал вложенную виртуализацию в отличие от других производителей. С выходом сборки Windows Server 2016 Technical Preview 4 (TP4), которая предназначена для желающих попробовать новый функционал, ситуация изменилась. Демонстрации вложенной виртуализации можно увидеть в записи доклада «Один доклад, один ноутбук, один датацентр» мероприятия Microsoft TechDay 2015.


Все демонстрации были проведены на HP Blade Gen 8, с базовым процессором Intel Xeon E5 2670 и объёмом оперативной памяти 32 GB.

Выбор этой системы был обусловлен желанием показать, насколько невысоким может быть порог вхождения в технологии виртуализации. В общем обычная система по сегодняшним меркам, когда у большинства дома стоят Intel Core i3 и выше, и объем оперативной памяти стартует от 8GB. Это значит, что Вы при необходимости сможете использовать вложенную виртуализацию.


Напомним классический вариант виртуализации. Если у нас есть физический хост с поддержкой технологии виртуализации на уровне чипсета и процессора и включенными в BIOS необходимыми опциями, то получаем следующую картину:

b1a48e178ab641d08c3e84141301e67f.png

На нулевом уровне здесь физический хост, а на первом уровне — тонкий слой программного обеспечения, называемый гипервизором. Также на первом уровне находится раздел с корневой операционной системой и разделы для виртуальных машин. Проиллюстрируем с использованием утилиты CoreInfo от Марка Руссиновича поведение параметров процессора, связанных с виртуализацией. В таблице приведены первые несколько строк работы утилиты CoreInfo.

b37a340741e0412a9e04185bdbd317fd.png

До включения роли Hyper-V в операционную систему передавался параметр процессора, связанный с виртуализацией. Это видно по двум строкам в левой части таблицы. Первый параметр — отсутствие гипервизора, второй — флаг, ответственный за виртуализацию. После включения роли гипервизора посмотрим снова на свойства процессора в корневом разделе и увидим следующее: гипервизор включен, и флаг, связанный с виртуализацией, не транслируется в раздел корневой операционной системы. Также обратим внимание на значение Microprocessor signature, которое в нашем случае 0000710 и связано с физическим процессором.

Перейдем ко вложенной виртуализации.

140d328d9b3849d29899b67f26190c97.png

Из рисунка видно, что необходимо пробрасывать флаг, связанный с виртуализацией, в гостевую ОС. То есть, в общем случае, мы должны сообщить гипервизору на первом уровне, что необходимо включить поддержку виртуализации в разделяемом процессоре для виртуальной машины. Для этого необходимо запустить скрипт, который изменяет некоторые свойства виртуальной машины. Одно из основных свойств, которое изменяет скрипт, это поведение процессора виртуальной машины. // Set-VMProcessor -VMName $vmName -ExposeVirtualizationExtensions $true //. Про остальные параметры поговорим чуть позже. Проиллюстрируем поведение параметров процессора, связанных с виртуализацией, на виртуальной машине. В таблице выведены первые несколько строк работы утилиты CoreInfo.

df2c704e0b464b768fc418a134e8bb0f.png

Из таблицы видно, что виртуальная машина «понимает», что работает из-под гипервизора. Но до запуска скрипта флаг, связанный с виртуализацией, не передаётся. Далее отработал скрипт, который изменил свойства нашей виртуальной машины и ее процессора и флаг, связанный с виртуализацией, появился. Далее мы включили роль Hyper-V, после этого возник тонкий слой виртуализации и наша операционная система переместилась в свой корневой раздел, флаг виртуализации исчез. Также обратим внимание на значение Microprocessor signature, которое в нашем случае стало FFFFFFFF, что указывает на виртуализацию процессора. Далее мы создали виртуальную машину внутри виртуальной машины и для чистоты эксперимента запустили утилиту CoreInfo.

eab53edabe9a422285fe604a18765f18.png

В общем-то, ожидаемый результат — присутствие гипервизора и отсутствие флага виртуализации на первом этапе и присутствие флага виртуализации на втором. В итоге имеем вот такое решение.

63f5a1f7060748c586380b7325fce0fe.png


Теперь поговорим о некоторых ограничения данной технологии в TP4 для включенной вложенной виртуализации на первом уровне виртуальной машины:

  • Поддержка реализована пока только для процессоров Intel с поддержкой EPT (SLAT).
  • Динамическая память должна быть отключена.
  • Изменение размера памяти приводит к ошибкам.
  • Снимки на работающей виртуальной машине не допустимы.
  • Live migration приводит к ошибкам.
  • Сохранение, восстановление может привести к ошибкам.
  • Необходимо включить MAC spoofing в свойствах сетевого адаптера.


Пошаговая инструкция выглядит так:

  1. Устанавливаем сборку на физический хост, с включенными параметрами виртуализации.
  2. Создаём виртуальную машину, в которой будем включать виртуализацию. Желательно выделить этой машине не менее 4GB оперативной памяти, иначе нужно подправить скрипт. Виртуальная машина должна быть выключена!
  3. Запускаем скрипт на физическом хосте, указывая имя ранее созданной виртуальной машины. Ссылка на скрипт находится в конце статьи.
  4. Включаем роль Hyper-V в виртуальной машине.
  5. Создаем новую виртуальную машину, используя Hyper-V manager в ранее созданной виртуальной машине.


В итоге имеем решение, которое позволит делать многие вещи на одном физическом хосте. Например, кластер, собранный из Hyper-V хостов, что уменьшит количество используемого оборудования как дома, так и в учебных классах.
Windows Server Technical Preview
Анонс поддержки вложенной виртуализации от продуктовой группы (англ.)
Ссылка на утилиту CoreInfo
Ссылка на скрипт на GitHub

Спасибо за внимание,
Михаил Комаров
MVP — Cloud and Datacenter Management

© Habrahabr.ru