QEMU и KVM [351.3]

Рейтинг: 65.7% · 17 голосов
Специализация 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

QEMU и KVM [351.3]

Сообщение 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]
Урок 3. QEMU и KVM [351.3]

QEMU - это рабочая лошадка под почти всеми гипервизорами Linux, которые вы видели: и libvirt, и облачные стенды, и тестовые виртуалки в CI запускают именно qemu-system. Задача этого урока - научиться запускать виртуальную машину голой командой qemu-system, понимать, чем эмуляция отличается от аппаратного ускорения KVM, и осознанно собирать модель устройств (virtio), управлять памятью и процессором, делать снимки и пробрасывать железо. Когда вы понимаете слой QEMU напрямую, вы перестаёте бояться XML libvirt - он всего лишь генерирует ту же командную строку.

Изображение

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

QEMU сам по себе - чистый эмулятор. Он умеет программно изображать целый компьютер: процессор чужой архитектуры, чипсет, шины, диски, сетевые карты. Эмуляция универсальна (можно запустить ARM на x86), но медленна, потому что каждую инструкцию гостя QEMU транслирует в инструкции хоста через свой движок TCG (Tiny Code Generator).

KVM - это модуль ядра Linux (kvm.ko плюс kvm-intel.ko или kvm-amd.ko), который превращает процессор в гипервизор через расширения Intel VT-x или AMD-V. Когда архитектура гостя совпадает с хостом, QEMU отдаёт исполнение инструкций напрямую железу, а сам остаётся только в роли эмулятора устройств ввода-вывода и менеджера машины. Отсюда правило: QEMU - это устройства и оркестровка, KVM - это быстрый CPU. Признак работы KVM - устройство /dev/kvm и опция -accel kvm (или -enable-kvm).

Ключевая идея производительности - паравиртуализация virtio. Эмулировать реальную сетевую карту Intel e1000 дорого: гость думает, что пишет в регистры железа, и каждый доступ ловится гипервизором. Драйверы virtio устроены иначе - гость заранее знает, что он виртуален, и общается с хостом через кольцевые буферы в общей памяти (virtqueue). Это убирает массу лишних выходов в гипервизор. Поэтому диски делают virtio-blk или virtio-scsi, сеть - virtio-net, а память можно отдавать обратно через virtio-balloon.

QEMU-машина управляется через мониторы. HMP (human monitor) - текстовый интерактивный интерфейс для человека (info block, savevm). QMP - это JSON-протокол, через который с QEMU разговаривает libvirt и автоматика. Снимки бывают двух видов: внутренние (savevm, живут внутри qcow2, требуют формата qcow2) и внешние (отдельный overlay-файл поверх базового). Снимок состояния с памятью даёт мгновенный откат живой машины, снимок только диска - точку для бэкапа.

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

Установка пакетов отличается по семействам.

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

# Debian 13 / Ubuntu 24.04 LTS
sudo apt install qemu-system-x86 qemu-utils

# RHEL 10 / Fedora 41+
sudo dnf install qemu-kvm qemu-img
Проверяем, что ускорение вообще возможно и модуль загружен.

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

# поддержка VT-x/AMD-V процессором
grep -E -o 'vmx|svm' /proc/cpuinfo | sort -u

# модули и устройство
lsmod | grep kvm
ls -l /dev/kvm
Создаём диск в формате qcow2 (тонкий, растёт по мере записи) и запускаем гостя с современным набором устройств.

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

qemu-img create -f qcow2 disk.qcow2 20G

qemu-system-x86_64 \
  -machine q35,accel=kvm \
  -cpu host -smp 4 -m 4G \
  -drive file=disk.qcow2,if=virtio,format=qcow2 \
  -cdrom debian-13.iso \
  -netdev user,id=n0,hostfwd=tcp::2222-:22 \
  -device virtio-net-pci,netdev=n0 \
  -nographic
Разберём важное. Машина q35 - это современный чипсет с PCIe (наследник i440fx, который годится только для старых гостей). -cpu host отдаёт гостю все флаги физического процессора - максимум скорости, но машина не переедет на хост с другим CPU вживую; для миграции берут именованную модель, например -cpu Haswell-v4. -smp 4 задаёт 4 vCPU, можно детально: -smp sockets=1,cores=4,threads=1. Сеть user (SLIRP) не требует прав root и через hostfwd пробрасывает порт хоста 2222 на 22 гостя; для продакшена используют tap-интерфейс и мост.

Войти в монитор из -nographic можно сочетанием Ctrl-a c (переключение консоль/монитор), Ctrl-a x - выход. Снимки внутри qcow2:

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

# из HMP-монитора живой машины
(qemu) savevm snap1
(qemu) info snapshots
(qemu) loadvm snap1

# офлайн, утилитой
qemu-img snapshot -l disk.qcow2
qemu-img snapshot -c snap2 disk.qcow2
Внешний снимок диска (overlay поверх базы, база остаётся неизменной):

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

qemu-img create -f qcow2 -b base.qcow2 -F qcow2 overlay.qcow2
Проброс PCI-устройства (например GPU) через VFIO - устройство сначала отвязывают от хостового драйвера, затем отдают гостю:

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

-device vfio-pci,host=0000:01:00.0
Связь с libvirt: на этом же QEMU работает virsh. Посмотреть, в какую командную строку libvirt разворачивает ваш XML, можно так:

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

virsh domxml-to-native qemu-argv --domain myvm
Частые грабли
  • Машина запустилась, но тормозит как улитка - значит KVM не подхватился и работает чистый TCG. Проверьте /dev/kvm, права (группа kvm), и что в BIOS/UEFI включена виртуализация. Добавляйте accel=kvm и не надейтесь на дефолт.
  • Гость не видит диск или сеть при -if=virtio - в установщике или ядре нет драйверов virtio. Старые или нестандартные ОС лечатся переключением на if=ide / -device e1000, либо подгрузкой virtio-драйверов.
  • savevm падает с ошибкой - внутренние снимки требуют qcow2 для ВСЕХ дисков машины. На raw или на проброшенном блочном устройстве внутренний снимок невозможен.
  • -cpu host ломает живую миграцию между разными моделями процессоров. Для кластера фиксируйте именованную модель или baseline.
  • Запуск qemu-system из-под обычного пользователя для tap-сети и VFIO упирается в права. libvirt решает это через отдельного пользователя qemu и polkit - вручную нужны capabilities или root.
  • Путаница i440fx и q35: на старом i440fx нет нормального PCIe, проброс устройств и горячее подключение работают хуже. По умолчанию сейчас берут q35.
Мини-лаба
  • Установите qemu-system-x86 / qemu-kvm и проверьте наличие /dev/kvm и флага vmx или svm.
  • Создайте qcow2-диск на 20G и поднимите гостя из ISO с machine q35,accel=kvm, -cpu host, virtio-диском и virtio-net, проброс порта 2222 на 22.
  • Завершите установку гостя, зайдите по ssh -p 2222 на localhost.
  • Войдите в HMP-монитор (Ctrl-a c), выполните info block и info kvm, убедитесь, что ускорение активно.
  • Сделайте внутренний снимок savevm clean, измените что-нибудь в госте, затем откатитесь через loadvm clean.
  • Создайте внешний overlay поверх базового диска и запустите гостя уже с overlay, проверив, что база не меняется.
  • Дополнительно: опишите ту же машину в libvirt и сравните вывод virsh domxml-to-native qemu-argv со своей командной строкой.
Контрольные вопросы
  • В чём принципиальная разница ролей QEMU и KVM при запуске x86-гостя на x86-хосте, и какой признак говорит, что KVM реально используется?
  • Почему virtio-устройства быстрее эмуляции реальной карты, и через какой механизм гость и хост обмениваются данными?
  • Когда вы выберете -cpu host, а когда именованную модель CPU, и какое ограничение накладывает первый вариант?
  • Чем внутренний снимок qcow2 отличается от внешнего overlay, и какие требования у каждого из них?
  • Какие шаги нужны, чтобы пробросить PCI-устройство в гостя, и какая подсистема ядра за это отвечает?
  • Чем машина q35 предпочтительнее i440fx и в каких случаях ещё берут i440fx?
👍5 ❤️1 🔥 😄 🤔3
Аватара пользователя
khwang
Сообщения: 1
Зарегистрирован: 15 май 2026, 01:57

Re: QEMU и KVM [351.3]

Сообщение khwang »

А обязательно q35 ставить? У меня старая винда как гость в virt-manager по дефолту i440fx подцепила и вроде работает
👍1 ❤️1 🔥 😄 🤔
Аватара пользователя
shelly99
Сообщения: 1
Зарегистрирован: 14 май 2026, 03:04

Re: QEMU и KVM [351.3]

Сообщение shelly99 »

Поймал тормоза именно как в граблях - оказалось забыл accel=kvm и оно молча на TCG свалилось. info kvm в мониторе сразу показал disabled, спасибо
👍1 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Xen [351.2]
Следующая глава →
Управление ВМ через libvirt [351.4, часть 1]

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

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

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

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

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