Вложенная виртуализация 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 необходимыми опциями, то получаем следующую картину:
На нулевом уровне здесь физический хост, а на первом уровне — тонкий слой программного обеспечения, называемый гипервизором. Также на первом уровне находится раздел с корневой операционной системой и разделы для виртуальных машин. Проиллюстрируем с использованием утилиты CoreInfo от Марка Руссиновича поведение параметров процессора, связанных с виртуализацией. В таблице приведены первые несколько строк работы утилиты CoreInfo.
До включения роли Hyper-V в операционную систему передавался параметр процессора, связанный с виртуализацией. Это видно по двум строкам в левой части таблицы. Первый параметр — отсутствие гипервизора, второй — флаг, ответственный за виртуализацию. После включения роли гипервизора посмотрим снова на свойства процессора в корневом разделе и увидим следующее: гипервизор включен, и флаг, связанный с виртуализацией, не транслируется в раздел корневой операционной системы. Также обратим внимание на значение Microprocessor signature, которое в нашем случае 0000710 и связано с физическим процессором.
Перейдем ко вложенной виртуализации.
Из рисунка видно, что необходимо пробрасывать флаг, связанный с виртуализацией, в гостевую ОС. То есть, в общем случае, мы должны сообщить гипервизору на первом уровне, что необходимо включить поддержку виртуализации в разделяемом процессоре для виртуальной машины. Для этого необходимо запустить скрипт, который изменяет некоторые свойства виртуальной машины. Одно из основных свойств, которое изменяет скрипт, это поведение процессора виртуальной машины. // Set-VMProcessor -VMName $vmName -ExposeVirtualizationExtensions $true //. Про остальные параметры поговорим чуть позже. Проиллюстрируем поведение параметров процессора, связанных с виртуализацией, на виртуальной машине. В таблице выведены первые несколько строк работы утилиты CoreInfo.
Из таблицы видно, что виртуальная машина «понимает», что работает из-под гипервизора. Но до запуска скрипта флаг, связанный с виртуализацией, не передаётся. Далее отработал скрипт, который изменил свойства нашей виртуальной машины и ее процессора и флаг, связанный с виртуализацией, появился. Далее мы включили роль Hyper-V, после этого возник тонкий слой виртуализации и наша операционная система переместилась в свой корневой раздел, флаг виртуализации исчез. Также обратим внимание на значение Microprocessor signature, которое в нашем случае стало FFFFFFFF, что указывает на виртуализацию процессора. Далее мы создали виртуальную машину внутри виртуальной машины и для чистоты эксперимента запустили утилиту CoreInfo.
В общем-то, ожидаемый результат — присутствие гипервизора и отсутствие флага виртуализации на первом этапе и присутствие флага виртуализации на втором. В итоге имеем вот такое решение.
Теперь поговорим о некоторых ограничения данной технологии в TP4 для включенной вложенной виртуализации на первом уровне виртуальной машины:
- Поддержка реализована пока только для процессоров Intel с поддержкой EPT (SLAT).
- Динамическая память должна быть отключена.
- Изменение размера памяти приводит к ошибкам.
- Снимки на работающей виртуальной машине не допустимы.
- Live migration приводит к ошибкам.
- Сохранение, восстановление может привести к ошибкам.
- Необходимо включить MAC spoofing в свойствах сетевого адаптера.
Пошаговая инструкция выглядит так:
- Устанавливаем сборку на физический хост, с включенными параметрами виртуализации.
- Создаём виртуальную машину, в которой будем включать виртуализацию. Желательно выделить этой машине не менее 4GB оперативной памяти, иначе нужно подправить скрипт. Виртуальная машина должна быть выключена!
- Запускаем скрипт на физическом хосте, указывая имя ранее созданной виртуальной машины. Ссылка на скрипт находится в конце статьи.
- Включаем роль Hyper-V в виртуальной машине.
- Создаем новую виртуальную машину, используя Hyper-V manager в ранее созданной виртуальной машине.
В итоге имеем решение, которое позволит делать многие вещи на одном физическом хосте. Например, кластер, собранный из Hyper-V хостов, что уменьшит количество используемого оборудования как дома, так и в учебных классах.
Windows Server Technical Preview
Анонс поддержки вложенной виртуализации от продуктовой группы (англ.)
Ссылка на утилиту CoreInfo
Ссылка на скрипт на GitHub
Спасибо за внимание,
Михаил Комаров
MVP — Cloud and Datacenter Management