Этот урок задаёт систему координат для всего курса. LPIC-3 305 - не про одну машину и даже не про сервис на нескольких машинах, как было в LPIC-2. Здесь вы становитесь архитектором инфраструктуры: решаете, на чём вообще запускать рабочую нагрузку - в полноценной виртуальной машине, в контейнере или вынести в облако через provisioning. Это три разных способа нарезать ресурсы одного железа, и выбор между ними определяет безопасность, плотность и стоимость всей платформы. Разберём, чем эти три мира отличаются по механике, как устроен сам экзамен 305-300, как курс связан с отдельными курсами Docker и Kubernetes, и как поднять стенд с вложенной виртуализацией, на котором мы проживём весь материал.

Как это работает
Виртуализация и контейнеризация решают одну задачу - разделить ресурсы хоста между изолированными нагрузками - но на разных уровнях стека. Полная виртуализация (KVM, QEMU, libvirt, исторически Xen) даёт каждой нагрузке отдельное гостевое ядро. Гипервизор эмулирует или пробрасывает оборудование, гость думает, что владеет целым компьютером. Изоляция максимальная: можно крутить Windows рядом с Linux, можно упасть гостевым ядром, не задев хост. Цена - накладные расходы: каждая VM тащит своё ядро, свою память, свой загрузчик.
Контейнеризация (namespaces, cgroups, LXC/LXD, Docker, Podman) не создаёт второе ядро. Все контейнеры делят ядро хоста, а изоляцию даёт сам ядерный механизм: namespaces режут видимость (свой список процессов, своя сеть, своя файловая система), cgroups режут потребление (сколько CPU и памяти можно взять), а seccomp, SELinux и AppArmor режут права. Контейнер стартует за миллисекунды и почти не ест лишнего, поэтому на одном хосте их влезают сотни. Расплата - общее ядро: ядерная уязвимость или несовместимость ядра бьёт по всем контейнерам сразу.
Cloud provisioning - это третий угол, не способ изоляции, а способ доставки. cloud-init, Packer и Vagrant отвечают на вопрос не "как изолировать", а "как из голого образа за секунды получить настроенную машину". Packer печёт золотой образ, cloud-init донастраивает его при первой загрузке (ключи, пользователи, сеть), Vagrant поднимает воспроизводимый локальный стенд. Эти инструменты одинаково работают и над VM, и над облачными инстансами.
Правило выбора на 2026 год простое. Нужна жёсткая изоляция, чужое ядро или эмуляция железа (Windows-гость, другой дистрибутив ядра, доверенная мультиарендность) - берём VM. Нужна плотность, скорость и одинаковое ядро для всех (микросервисы, stateless-нагрузки, CI) - берём контейнеры. На практике их комбинируют: Kubernetes-узлы сами часто живут внутри VM, получая и плотность контейнеров, и границу безопасности гипервизора.
Команды и примеры
Экзамен один - 305-300, версия 3.0 - и покрывает три блока тем. Тема 351 - полная виртуализация (концепции, KVM/QEMU/libvirt, образы дисков, обзор Xen). Тема 352 - контейнеризация (ядерные основы, LXC/LXD, Docker, оркестрация: Compose, Swarm, Kubernetes, Helm). Тема 353 - развёртывание и provisioning (cloud-init, Packer, Vagrant, обзорно OpenStack и Terraform). 60 вопросов на 90 минут, есть fill-in-the-blank, где имя демона, ключа или директивы надо вписать по памяти. Для действительности LPIC-3 нужен активный LPIC-2.
Первым делом проверяем, что хост вообще тянет аппаратную виртуализацию:
Код: Выделить всё
# Поддержка VT-x / AMD-V в процессоре (число больше 0 - хорошо)
grep -Ec '(vmx|svm)' /proc/cpuinfo
# Готовность KVM: пакет и устройство
lsmod | grep kvm
ls -l /dev/kvm
Код: Выделить всё
# Debian / Ubuntu
apt-get install qemu-system libvirt-daemon-system virtinst
# RHEL / Fedora / AlmaLinux / Rocky (dnf5 в RHEL 10 и свежей Fedora)
dnf install qemu-kvm libvirt virt-install
Код: Выделить всё
# Debian / Ubuntu
apt-get install podman # docker ставится из репозитория Docker отдельно
# RHEL / Fedora
dnf install podman
Код: Выделить всё
# Intel: проверить и включить вложенность
cat /sys/module/kvm_intel/parameters/nested # должно стать Y
echo "options kvm_intel nested=1" > /etc/modprobe.d/kvm-nested.conf
# AMD: то же для kvm_amd
cat /sys/module/kvm_amd/parameters/nested
echo "options kvm_amd nested=1" > /etc/modprobe.d/kvm-nested.conf
# применить: перезагрузить модуль или хост
modprobe -r kvm_intel && modprobe kvm_intel
Код: Выделить всё
systemctl status libvirtd # сокет-активируемый, может стартовать по запросу
virsh list --all
podman info | grep -i graphDriver
- Путать изоляцию контейнера с изоляцией VM. Контейнер делит ядро хоста - это не песочница уровня гипервизора, и для недоверенного кода один контейнер недостаточен без дополнительной границы.
- Забыть включить nested на верхнем гипервизоре. Внутренние VM тихо падают или работают на программной эмуляции в десятки раз медленнее, а человек думает, что сломан libvirt.
- Игнорировать BIOS/UEFI. VT-x или AMD-V бывают выключены в прошивке, и /dev/kvm не появится, сколько пакетов ни ставь.
- Считать Docker и Kubernetes одним и тем же. Docker - это движок одного хоста, Kubernetes - оркестратор кластера поверх движков; на экзамене 352 это разные подтемы с разными весами.
- Лить cloud-init там, где он не предусмотрен. Он отрабатывает один раз при первой загрузке образа; повторно настроить уже живую систему им не выйдет без сброса состояния.
- Брать цели LPI за описание современного стека. Xen и Swarm в целях есть, но в проде 2026 это KVM и Kubernetes; учим для экзамена, в работу несём актуальное.
- На своём хосте выполните grep -Ec '(vmx|svm)' /proc/cpuinfo и убедитесь, что аппаратная виртуализация доступна; если ноль - включите её в UEFI.
- Включите вложенную виртуализацию для своего CPU (kvm_intel или kvm_amd) и подтвердите значением Y в /sys/module.
- Поднимите внутри основного стенда две вложенные VM: одну на Debian 13 или Ubuntu 24.04 LTS, вторую на RHEL 10, AlmaLinux или Fedora 41+.
- На каждой установите стек виртуализации штатным менеджером (apt на одной, dnf на другой) и проверьте появление /dev/kvm.
- На той же машине поднимите один контейнер через podman run и сравните время старта контейнера и время загрузки вложенной VM.
- Создайте изолированную libvirt-сеть без блока forward, чтобы тестовые сервисы не утекали наружу, и подключите к ней обе вложенные машины.
- Снимите снапшоты чистых систем - к ним будем откатываться перед каждой следующей лабой курса.
- Чем принципиально отличается изоляция полной виртуализации от изоляции контейнера на уровне ядра?
- Какие три блока тем (351-353) входят в экзамен 305-300 и что покрывает каждый?
- Какие два ядерных механизма дают контейнеру изоляцию видимости и ограничение ресурсов, и за что отвечает каждый?
- Зачем нужна вложенная виртуализация и как проверить, что она включена для Intel и для AMD?
- В чём разница ролей cloud-init, Packer и Vagrant в задаче provisioning?
- Почему Docker и Kubernetes на экзамене 352 - это разные подтемы, и какую задачу решает каждый?