Виртуализация

Что такое Nested virtualisation?

Определение

Nested virtualisation lets a virtual machine itself run virtual machines, by exposing the processor virtualisation extensions to the guest. It is required for Proxmox VE, VM-based CI jobs and some Docker configurations. Many providers disable it, which is the usual reason those workloads fail elsewhere.

Почему Nested virtualisation важен

Он обязателен для Proxmox VE, CI-задач на основе VM и некоторых конфигураций Docker. Многие провайдеры отключают его, что обычно и является причиной сбоев таких нагрузок в других местах.

Nested virtualisation на практике

Когда вы используете вложенную виртуализацию, вы загружаете гипервизор внутри гостевой системы KVM и передаёте расширения виртуализации хостового CPU. Вам нужно проверить /proc/cpuinfo в гостевой системе на наличие флагов svm или vmx. Если они отсутствуют, ваш внутренний гипервизор переходит на программную эмуляцию, что может снизить производительность на порядок. Возможно, вам также придётся включить тип CPU «host» вместо общего, чтобы получить эти флаги. Если ошибётесь, ваша нагрузка Proxmox или CI будет еле ползти.

Что люди часто понимают неправильно в отношении Nested virtualisation

Люди предполагают, что вложенная виртуализация нужна только для запуска полных ОС вроде Windows в ВМ. Исправление: она также ломает стандартный оверлейный сетевой стek Docker и некоторые модули ядра, потому что они зависят от функций виртуализации внутри гостевой системы. Так что контейнерная нагрузка может не работать у провайдера, отключившего вложенность, даже если вы не собирались запускать ВМ.

Nested virtualisation — частые вопросы

Можно ли запускать Docker внутри вложенной ВМ?

Да, и это самая частая причина, по которой людям нужна вложенная виртуализация. Стандартный мостовой сетевой стek Docker использует iptables и модули ядра, которые могут вести себя иначе без раскрытых расширений CPU. Наши планы KVM включают вложенную виртуализацию, поэтому ваши контейнеры Docker работают как ожидается.

Как проверить, включена ли вложенная виртуализация?

Внутри вашей ВМ выполните grep -E '(svm|vmx)' /proc/cpuinfo. Если вы видите эти флаги, вложенность доступна. Если нет, гипервизор их не раскрывает, что обычно означает, что провайдер отключил это.

Больше из раздела «виртуализация»

KVM
KVM — это полная аппаратная виртуализация, встроенная в ядро Linux, предоставляющая каждому гостю собственное ядро и аппаратно-обеспеченную изоляцию от других арендаторов.
OpenVZ
OpenVZ — это контейнерная виртуализация, в которой каждый экземпляр разделяет ядро хоста, поэтому гости не могут загружать модули ядра или запускать другую операционную систему.
LXC
LXC — это нативная контейнеризация Linux, которая изолирует процессы с помощью namespace и cgroups, разделяя ядро хоста.
Гипервизор
Гипервизор — это программный слой, который создаёт и запускает виртуальные машины, распределяя между ними физические CPU, память и ввод-вывод.
vCPU
vCPU — это виртуальный процессор, предоставляемый гостевой системе, поддерживаемый временем планирования на физическом ядре или потоке.
cloud-init
cloud-init — стандартный механизм настройки виртуальной машины при первой загрузке, использующий метаданные, предоставляемые платформой.