Концепции и теория виртуализации [351.1]

Рейтинг: 79.6% · 15 голосов
Специализация LPIC-3 305 (v3.0): KVM/QEMU и libvirt, Xen, образы дисков, контейнеры (namespaces/cgroups, LXC/LXD, Docker), оркестрация (Compose, Swarm, Kubernetes, Helm), Vagrant/Packer/cloud-init.
Ответить
Аватара пользователя
Sergey_Sysadmin
Сообщения: 134
Зарегистрирован: 11 май 2026, 05:31

Концепции и теория виртуализации [351.1]

Сообщение Sergey_Sysadmin »

Оглавление курса (16)
  1. Введение в LPIC-3 305: виртуализация и контейнеризация
  2. Концепции и теория виртуализации [351.1] (вы здесь)
  3. Xen [351.2]
  4. QEMU и KVM [351.3]
  5. Управление ВМ через libvirt [351.4, часть 1]
  6. libvirt: виртуальные сети и пулы хранилищ [351.4, часть 2]
  7. Управление образами дисков ВМ [351.5]
  8. Концепции контейнеризации [352.1]
  9. LXC и LXD [352.2]
  10. Docker: образы и контейнеры [352.3, часть 1]
  11. Docker: тома, сети, логирование, ресурсы [352.3, часть 2]
  12. Оркестрация контейнеров
  13. Облачные инструменты: OpenStack и Terraform [353.1]
  14. Packer [353.2]
  15. cloud-init [353.3]
  16. Vagrant [353.4]
Урок 1. Концепции и теория виртуализации [351.1]

Прежде чем поднимать первую виртуалку на KVM или запускать контейнер в podman, нужно разложить по полкам сам зоопарк технологий: чем полная виртуализация отличается от паравиртуализации, почему гипервизор типа 1 быстрее типа 2, где проходит граница между эмуляцией и виртуализацией и зачем в современном ядре вообще нужны расширения VT-x и AMD-V. Этот урок решает задачу архитектора: выбрать правильный инструмент под нагрузку и не наступить на грабли оверкоммита и NUMA в проде. Дальше будут конкретные команды и конфиги libvirt, но без этой картины в голове они превратятся в копипасту.

Изображение

Как это работает

Виртуализация - это иллюзия отдельной машины, которую гипервизор продаёт гостевой ОС. Гость думает, что владеет процессором, памятью и устройствами, а на деле делит их с соседями. Ключевая проблема: на x86 часть инструкций исторически вела себя по-разному в нулевом и третьем кольце защиты, но не вызывала исключения при выполнении из гостя. Поэтому изоляцию приходилось городить программно.

Полная виртуализация (full virtualization) даёт гостю немодифицированную ОС: она не знает, что виртуализирована. Раньше это достигалось бинарной трансляцией опасных инструкций на лету (так делал ранний VMware). Паравиртуализация (paravirtualization) идёт другим путём: ядро гостя пропатчено и вместо привилегированных инструкций делает гипервызовы (hypercalls) напрямую к гипервизору. Это быстрее, но требует поддержки в госте - классика Xen PV. В 2026 чистый PV почти вымер, остались паравиртуальные драйверы (virtio, Xen PVHVM) поверх аппаратной виртуализации.

Аппаратная виртуализация (Intel VT-x, AMD-V, она же AMD SVM) добавила новый режим работы CPU - root и non-root. Гость крутится в non-root прямо на железе, а при попытке выполнить привилегированную операцию процессор делает VM exit и передаёт управление гипервизору. Это убрало нужду в бинарной трансляции. Сверху лежат расширения для памяти: EPT у Intel и NPT (RVI) у AMD - аппаратная трансляция гостевых адресов без дорогих shadow page tables.

Эмуляция - это не виртуализация. Эмулятор интерпретирует или транслирует чужую архитектуру: QEMU без KVM честно эмулирует ARM на x86, выполняя каждую инструкцию программно. Медленно, но кроссплатформенно. Виртуализация же гоняет родные инструкции гостя прямо на CPU - возможна только когда архитектуры гостя и хоста совпадают.

Гипервизор типа 1 (bare-metal) ставится прямо на железо и сам является минимальной ОС: VMware ESXi, Xen, Microsoft Hyper-V. Тип 2 (hosted) работает как приложение поверх обычной ОС: VirtualBox, VMware Workstation. KVM - особый случай: это модуль ядра Linux, который превращает само ядро в гипервизор типа 1, поэтому в экзамене его относят к типу 1, хотя рядом крутится полноценный Linux.

Контейнеры - это вообще не виртуализация железа. Они делят одно ядро хоста, а изоляция строится на namespaces (что процесс видит) и cgroups (сколько ресурсов берёт). Нет гостевой ОС, нет гипервизора, нет эмуляции устройств - отсюда мгновенный старт и почти нулевой оверхед, но и общее ядро как единая точка отказа и поверхность атаки.

Оверкоммит - это продажа ресурсов больше, чем есть физически, в расчёте что не все попросят сразу. CPU-оверкоммит: суммарно vCPU больше, чем ядер хоста; планировщик ядра тасует их, но при пике растёт steal time. Память-оверкоммит опаснее: если все гости разом займут обещанное, вмешается OOM killer. Сглаживают это ballooning (virtio-balloon - драйвер в госте по команде хоста отдаёт страницы обратно) и KSM (ksmd ищет одинаковые страницы памяти у разных гостей и склеивает их).

NUMA - это про то, что у многосокетного сервера память приклеена к конкретному CPU, и доступ к чужой памяти (remote) дороже своей (local). Если vCPU гостя бегает по одной NUMA-ноде, а его память лежит на другой - получаем просадку. Поэтому крупные гости пинят к нодам и применяют NUMA-aware размещение.

Команды и примеры

Первое, что проверяет инженер на новом хосте - поддержку аппаратной виртуализации в CPU:

Код: Выделить всё

# vmx - это Intel VT-x, svm - AMD-V
grep -E -o 'vmx|svm' /proc/cpuinfo | sort -u
# человекочитаемая сводка и проверка готовности к KVM
lscpu | grep -i virtual
Утилита kvm-ok и установка проверочных пакетов различаются по семействам:

Код: Выделить всё

# Debian 13 / Ubuntu 24.04
apt install cpu-checker libvirt-clients
kvm-ok

# RHEL 10 / Fedora 41+
dnf install libvirt-client
virt-host-validate
Проверяем, что модули KVM реально загружены ядром:

Код: Выделить всё

lsmod | grep kvm
# ожидаем kvm_intel или kvm_amd плюс базовый kvm
Смотрим текущий оверкоммит памяти и состояние KSM:

Код: Выделить всё

# 0 - эвристика, 1 - всегда разрешать, 2 - строгий учёт по ratio
cat /proc/sys/vm/overcommit_memory
cat /sys/kernel/mm/ksm/run            # 1 = KSM активен
cat /sys/kernel/mm/ksm/pages_sharing  # сколько страниц реально склеено
NUMA-топология хоста и распределение памяти по нодам:

Код: Выделить всё

numactl --hardware     # сколько нод, сколько памяти на каждой
numastat               # промахи и попадания по нодам
Частые грабли
  • Флаги vmx/svm есть в /proc/cpuinfo, но виртуализация выключена в BIOS/UEFI (Intel VT-x / AMD SVM Mode) - модуль kvm_intel загрузится, но машины будут падать или работать через эмуляцию. Всегда проверяйте virt-host-validate.
  • Путаница тип 1 и тип 2 на экзамене: KVM это тип 1, потому что гипервизор живёт в ядре, хоть рядом и крутится Linux. VirtualBox - тип 2.
  • Эмуляцию называют виртуализацией. Если QEMU запущен без -enable-kvm (или без accel=kvm), он эмулирует CPU программно - производительность падает в десятки раз, а вы думаете что виртуализируете.
  • Память-оверкоммит без ballooning и swap на проде - первый же пик нагрузки приводит к OOM killer, который убивает гостя целиком, а не освобождает страницы аккуратно.
  • Игнор NUMA на двухсокетном сервере: гость с памятью на чужой ноде теряет проценты производительности на ровном месте, и это не видно в top.
  • KSM экономит память, но тратит CPU на сканирование и считается утечкой для криптонагрузок - на хостах с секретами его часто отключают по соображениям безопасности (side-channel).
Мини-лаба
  • На своём хосте определите вендора CPU и тип поддержки: выполните grep по vmx/svm в /proc/cpuinfo и зафиксируйте результат.
  • Установите проверочные утилиты для своего семейства (cpu-checker в Debian/Ubuntu или libvirt-client в RHEL/Fedora) и прогоните kvm-ok либо virt-host-validate.
  • Проверьте загруженные модули через lsmod | grep kvm и определите, intel у вас или amd.
  • Посмотрите текущий режим vm.overcommit_memory и статус KSM в /sys/kernel/mm/ksm/run.
  • Выполните numactl --hardware и нарисуйте на бумаге топологию: сколько нод, сколько памяти и ядер на каждой.
  • Сформулируйте письменно для своего железа: какой тип гипервизора вы будете использовать и почему, и где у вас риск оверкоммита.
Контрольные вопросы
  • В чём принципиальная разница между полной виртуализацией и паравиртуализацией, и почему вторая исторически была быстрее до появления VT-x?
  • Почему KVM относят к гипервизорам типа 1, хотя он работает внутри полноценной ОС Linux?
  • Чем эмуляция отличается от виртуализации, и в каком единственном случае возможна именно виртуализация, а не эмуляция?
  • Что физически происходит в процессоре при VM exit, и какую роль играют EPT/NPT?
  • Как ballooning и KSM помогают при оверкоммите памяти, и в чём риск каждого из них?
  • Почему на многосокетном сервере важно учитывать NUMA при размещении крупного гостя?
👍3 ❤️2 🔥2 😄 🤔
Аватара пользователя
options
Сообщения: 1
Зарегистрирован: 14 май 2026, 06:46

Re: Концепции и теория виртуализации [351.1]

Сообщение options »

Долго не мог уложить в голову почему KVM это тип 1 а не 2 раз поверх линукса. Дошло когда прочитал что vmx-режим включается прямо в железе, а линукс тут просто управляющая прослойка. virt-host-validate сразу показал что в биосе у меня VT-x была выключена, поправил - заработало.
👍1 ❤️1 🔥2 😄 🤔
Аватара пользователя
basedwarlock
Сообщения: 1
Зарегистрирован: 11 май 2026, 11:20

Re: Концепции и теория виртуализации [351.1]

Сообщение basedwarlock »

А KSM реально стоит включать на хосте где гоняю разные проекты клиентов? Слышал про side-channel атаки через дедупликацию страниц, или это паранойя для домашней лабы?
👍1 ❤️1 🔥1 😄 🤔1
Ответить
← Предыдущая глава
Введение в LPIC-3 305: виртуализация и контейнеризация
Следующая глава →
Xen [351.2]

Все главы курса «LPIC-3 305: виртуализация и контейнеризация»

Поделиться темой: ✈ Telegram VK
  • Похожие темы

Вернуться в «LPIC-3 305: виртуализация и контейнеры»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость