KVM: nested virtualization VM-entry failure — Решение вложенной виртуализации
Архитектура ошибки и симптомы сбоя
Ошибка «KVM: nested virtualization VM-entry failure» (сопровождающаяся статусом nested_vmx_entry_failed или VM-instruction error) возникает при использовании вложенной виртуализации (L0 хост -> L1 гипервизор -> L2 гость, например, запуск Minikube/EVE-NG/Proxmox внутри KVM). Ошибка указывает на то, что физический процессор отклонил инструкцию входа в виртуальный режим VMLAUNCH / VMRESUME (Intel VT-x) или VMRUN (AMD-V) из-за неконсистентного состояния полей структуры управления виртуальной машиной VMCS (Virtual Machine Control Structure) или отсутствия обязательных процессорных инструкций.
Диагностическая таблица параметров сбоя
| Параметр | Значение | Инженерный смысл сбоя |
|---|---|---|
| VMCS / VMCB | Control Data Structure | Аппаратная структура памяти, описывающая контекст процессора L1 и L2 гостя. |
| VM-entry Failure | Hardware VMX Trap | Аппаратный отказ процессора перейти к исполнению инструкций вложенной ВМ. |
| L0 / L1 / L2 Levels | Virtualization Layers | L0 — Bare Metal хост, L1 — промежуточная ВМ, L2 — вложенная целевая ВМ. |
Пошаговое дерево решений и сценарии траблшутинга
Сценарий 1: Проверка включения вложенной виртуализации на L0 хосте
# Для процессоров Intel:
cat /sys/module/kvm_intel/parameters/nested
# Вывод должен быть 'Y' или '1'
# Для процессоров AMD:
cat /sys/module/kvm_amd/parameters/nested
# Вывод должен быть '1'Сценарий 2: Активация Nested Virtualization в модулях ядра
Создайте конфигурационный файл для включения вложенной виртуализации:
# Для Intel (/etc/modprobe.d/kvm-nested.conf):
options kvm_intel nested=1
options kvm_intel enable_shadow_vmcs=1
options kvm_intel ept=1
# Для AMD (/etc/modprobe.d/kvm-nested.conf):
options kvm_amd nested=1
# Перезагрузка модуля (без перезагрузки хоста):
sudo modprobe -r kvm_intel && sudo modprobe kvm_intelСценарий 3: Настройка режима процессора host-passthrough в QEMU/libvirt
В конфигурации виртуальной машины L1 обязательно включите сквозную передачу всех инструкций CPU:
# В XML-конфигурации домена libvirt (virsh edit L1_VM):
<cpu mode='host-passthrough' check='none'>
<topology sockets='1' dies='1' cores='4' threads='2'/>
<feature policy='require' name='vmx'/>
</cpu>ITSTM выполнит корректную конфигурацию гипервизоров для Nested Virtualization, настроит Shadow VMCS и обеспечит стабильную работу тестовых сред.
Частые вопросы (FAQ)
Почему режим CPU host-model вызывает VM-entry failure во вложенных машинах?
Режим host-model может маскировать некоторые аппаратные флаги управления VMX/SVM или биты управления EPT. Режим host-passthrough передает процессорные возможности физического кристалла на 100% без искажений.
Что такое Shadow VMCS в процессорах Intel?
Shadow VMCS — это аппаратная технология Intel, позволяющая гипервизору L1 читать и модифицировать поля VMCS без постоянных выходов из виртуального режима (VM-Exit) в хост L0, что ускоряет вложенную виртуализацию в несколько раз.
Можно ли запустить вложенную виртуализацию KVM внутри гипервизора Hyper-V или ESXi?
Да. В Hyper-V необходимо выполнить PowerShell команду Set-VMProcessor -VMName <VM> -ExposeVirtualizationExtensions $true, а в VMware ESXi включить флаг 'Expose hardware assisted virtualization to guest OS'.
Как проверить доступность флагов VMX/SVM внутри виртуальной машины L1?
Выполните команду egrep -c '(vmx|svm)' /proc/cpuinfo. Ненулевое значение подтверждает, что процессор гостя видит аппаратные инструкции виртуализации.