Bootstrap

QEMU: что это, как работает и где используется

QEMU: что это, как работает и где используется

QEMU: что это, как работает и где используется

QEMU (Quick Emulator) — это свободный эмулятор и виртуализатор с открытым исходным кодом. Он умеет запускать операционные системы и программы, написанные для одной архитектуры, на другой — например, ARM-прошивку на x86-ПК или MIPS-бинарник на современном ноутбуке. QEMU лежит в основе огромного количества инфраструктуры: от эмуляции роутеров и отладки ядер до облачных платформ и Android-эмулятора.


Что такое QEMU простыми словами

QEMU — это программа, которая создаёт виртуальную машину: программную копию компьютера с процессором, памятью, дисками, сетью и периферией. Внутри этой машины можно запустить почти любую ОС.

Ключевая особенность QEMU — он работает в двух принципиально разных режимах:

  1. Полная эмуляция (TCG) — QEMU программно переводит инструкции гостевой архитектуры в инструкции хоста. Медленно, но работает везде и для любой архитектуры.
  2. Аппаратная виртуализация (KVM, Xen, HVF, WHPX) — QEMU делегирует исполнение кода гостя процессору хоста через гипервизор. Быстро, но только для «родной» архитектуры.

Именно эта двойственность делает QEMU универсальным инструментом: один и тот же бинарник может и эмулировать MIPS-роутер, и запускать Windows 11 на KVM почти на скорости железа.


Как QEMU устроен внутри

Архитектура QEMU модульная, и это важно понимать, чтобы ориентироваться в его возможностях.

Основные компоненты

КомпонентРоль
TCG (Tiny Code Generator)Динамический переводчик инструкций гостя в код хоста. Основа полной эмуляции.
AcceleratorsУскорители: KVM, Xen, HVF (macOS), WHPX (Windows), NVMM (NetBSD).
QOM (QEMU Object Model)Объектная модель устройств и машин.
Block layerСлой работы с дисками: qcow2, raw, VMDK, VHDX, NBD, RBD, iSCSI.
Netdev / NICСетевые бэкенды: tap, user (SLIRP), socket, vhost-net, VFIO.
QMP (QEMU Monitor Protocol)JSON-протокол управления виртуальной машиной.
HMPЧеловеческий монитор (интерактивная консоль).
Device modelЭмуляция тысяч устройств: от ISA-контроллеров до PCIe и virtio.

Как происходит исполнение

☯

Terminal:

⌕

≡

✕
Гостевая ОС → инструкция гостевой архитектуры
        │
        ├─ если accel=KVM и архитектура совпадает → CPU выполняет напрямую
        │
        └─ если accel=TCG → перевод в IR → генерация кода хоста → кэш → исполнение

TCG переводит не по одной инструкции, а блоками (translation blocks), кэширует результат и инвалидирует кэш при самописном коде (self-modifying code). Именно поэтому полная эмуляция QEMU заметно быстрее наивных интерпретаторов, но всё равно в 5–50 раз медленнее нативной.

virtio — почему QEMU в облаках быстрый

Эмуляция реальных устройств (например, Intel e1000 или IDE-контроллера) дорогая: каждое обращение гостя к регистру устройства вызывает выход в хост (VM exit). Решение — virtio: полувиртуализированные устройства, где гость и хост общаются через общие кольцевые буферы, а выходы в хост минимизированы.

Основные virtio-устройства:

  • virtio-blk, virtio-scsi — диски;
  • virtio-net — сеть (с vhost-net обработка уходит в ядро);
  • virtio-gpu — графика;
  • virtio-fs — общий доступ к файлам хоста (замена 9p);
  • virtio-balloon — управление памятью;
  • virtio-vsock — сокеты между гостем и хостом без сети.

Практически весь облачный стек (OpenStack, Proxmox, oVirt, AWS Nitro во многом) построен вокруг virtio.


Два режима работы QEMU

1. System emulation (системная эмуляция)

QEMU запускает целую операционную систему с виртуальным железом. Это то, что обычно называют «виртуальной машиной».

☯

Terminal:

⌕

≡

✕
qemu-system-x86_64 \
  -enable-kvm \
  -m 4096 \
  -smp 4 \
  -drive file=disk.qcow2,if=virtio \
  -netdev user,id=n0 -device virtio-net-pci,netdev=n0 \
  -cdrom ubuntu.iso

Поддерживаемые архитектуры (список огромный): x86, x86_64, ARM, AArch64, RISC-V, MIPS, PowerPC, s390x, SPARC, LoongArch, HPPA, m68k, SH4, Alpha, MicroBlaze, OpenRISC и другие.

2. User-mode emulation (эмуляция пользовательского режима)

Здесь QEMU запускает отдельный процесс чужой архитектуры, транслируя системные вызовы в вызовы хоста. Это qemu-user (qemu-mipsel, qemu-arm, qemu-aarch64 и т.д.).

☯

Terminal:

⌕

≡

✕
qemu-mipsel ./device_client_linux_mipsle my-slug 8080

Именно так в вашей статье про RT-AC51U можно тестировать MIPS-бинарник на x86-ПК, не имея под рукой роутера. User-mode работает через binfmt_misc, что позволяет запускать чужие бинарники «прозрачно», как будто они родные.


QEMU и KVM: кто кого использует

Частое заблуждение: «QEMU и KVM — это одно и то же». На самом деле:

  • KVM — модуль ядра Linux, дающий доступ к аппаратным расширениям виртуализации (Intel VT-x, AMD-V).
  • QEMU — userspace-программа, которая использует KVM как ускоритель.

Без QEMU (или другого VMM вроде crosvm, Firecracker, Cloud Hypervisor) KVM сам по себе бесполезен: он лишь предоставляет API. QEMU — самый функциональный потребитель этого API.

☯

Terminal:

⌕

≡

✕
┌─────────────────────────────┐
│  Гостевая ОС                │
├─────────────────────────────┤
│  QEMU (userspace)           │  ← устройства, миграция, QMP
├─────────────────────────────┤
│  /dev/kvm                   │  ← API гипервизора
├─────────────────────────────┤
│  KVM (модуль ядра Linux)    │
├─────────────────────────────┤
│  CPU с VT-x / AMD-V         │
└─────────────────────────────┘

Основные сценарии использования

Виртуализация серверов

QEMU — «движок» под Proxmox VE, oVirt, OpenStack (через libvirt и Nova), Incus/LXD (частично). Даже если вы не запускаете qemu-system-* вручную, вы почти наверняка используете QEMU через эти платформы.

Разработка и отладка ядер

QEMU умеет подключаться к GDB и отлаживать ядро Linux, FreeBSD, RTOS. Стандартный сценарий для embedded-разработчика:

☯

Terminal:

⌕

≡

✕
qemu-system-arm -M versatilepb -kernel zImage -append "console=ttyAMA0" -s -S
# затем в другом терминале: gdb vmlinux → target remote :1234

Эмуляция встраиваемых устройств

QEMU поддерживает десятки плат: raspi3b, raspi4b, virt (ARM/RISC-V), malta (MIPS), ppce500, sifive_u и т.д. Это позволяет разрабатывать прошивки и драйверы без реального железа.

Для роутеров на MIPS/ARM удобны машины malta и virt, а также готовые образы OpenWrt для QEMU (openwrt-x86-64-generic-ext4-combined.img). Кстати, проверить, как ведёт себя device_client_linux_mipsle на MIPS, можно именно так — через qemu-system-mipsel -M malta.

CI/CD и тестирование

QEMU используется в GitLab CI, GitHub Actions (через qemu-user), Buildkite для кросс-архитектурного тестирования. Docker-образ multiarch/qemu-user-static — самый частый способ запускать ARM-контейнеры на x86.

Эмуляция старых платформ

QEMU умеет запускать DOS, Windows 3.1/95/98, OS/2, старые версии Linux, Solaris, IRIX-подобные системы. Это популярный способ ностальгии и ретро-разработки.

Android Emulator

Официальный Android Emulator — это QEMU с сильно переработанным форком (Google QEMU), с проприетарными ускорителями и графикой.

Безопасность и malware-анализ

QEMU с изоляцией (KVM, -sandbox) используется для анализа вредоносного ПО, эмуляции прошивок (Firmadyne, FAT, EMBA) и fuzzing (AFL++ имеет QEMU-режим).


Установка

Linux (Debian/Ubuntu)

☯

Terminal:

⌕

≡

✕
sudo apt install qemu-system qemu-user qemu-utils qemu-kvm libvirt-daemon-system virtinst

Fedora / RHEL

☯

Terminal:

⌕

≡

✕
sudo dnf install @virtualization qemu-user-static

macOS

☯

Terminal:

⌕

≡

✕
brew install qemu

На Apple Silicon QEMU использует ускоритель HVF (Hypervisor.framework) для ARM64-гостей.

Windows

Официальные сборки — на qemu.org/download. Ускоритель — WHPX (Windows Hypervisor Platform) или HAXM (устарел).


Работа с дисками: qcow2 и qemu-img

qemu-img — утилита для работы с образами. Формат qcow2 — «родной» для QEMU и почти всегда предпочтителен:

  • разреженность: файл занимает место только под реальные данные;
  • снапшоты: внутренние и внешние;
  • сжатие и шифрование (LUKS);
  • copy-on-write: мгновенные клоны через backing file.

☯

Terminal:

⌕

≡

✕
# создать диск на 20 ГБ
qemu-img create -f qcow2 disk.qcow2 20G

# конвертировать из raw в qcow2
qemu-img convert -f raw -O qcow2 disk.raw disk.qcow2

# увеличить размер
qemu-img resize disk.qcow2 +10G

# информация
qemu-img info disk.qcow2

Снапшоты

☯

Terminal:

⌕

≡

✕
# создать
qemu-img snapshot -c before-upgrade disk.qcow2

# список
qemu-img snapshot -l disk.qcow2

# откатить
qemu-img snapshot -a before-upgrade disk.qcow2

Внешние снапшоты (-drive file=disk.qcow2,snapshot=on или через QMP) удобнее для длинных цепочек и бэкапов.


Сеть

QEMU предлагает несколько сетевых бэкендов.

БэкендЧто даётКогда использовать
user (SLIRP)NAT без прав root, гость ходит в интернетбыстрый тест, разработка
tapL2-мост в хост, гость в одной сети с хостомсерверы, нормальная сеть
socketсоединение QEMU↔QEMUмиграция, распределённые тесты
vhost-netобработка virtio-net в ядремаксимальная производительность
passthrough (VFIO)физическая NIC в гостяроутеры, DPDK, SR-IOV

Пример с tap и мостом:

☯

Terminal:

⌕

≡

✕
sudo ip tuntap add dev tap0 mode tap
sudo ip link set tap0 up
sudo ip link set tap0 master br0

qemu-system-x86_64 -enable-kvm -m 2G \
  -netdev tap,id=n0,ifname=tap0,script=no,downscript=no \
  -device virtio-net-pci,netdev=n0

Графика и доступ

  • SPICE — протокол удалённого доступа с пробросом USB, аудио, видео. Стандарт для десктопных ВМ.
  • VNC — простой и универсальный, встроен в QEMU.
  • GTK/SDL — локальное окно.
  • virtio-gpu + VirGL — 3D-ускорение в гостя.
  • virtio-gpu + Venus/Venus — Vulkan-ускорение (новое, активно развивается).
  • GPU passthrough (VFIO) — физическая видеокарта в гостя (игры, ML).

☯

Terminal:

⌕

≡

✕
qemu-system-x86_64 -enable-kvm -m 4G \
  -vga virtio -display gtk,gl=on \
  -device virtio-vga-gl

Управление: QMP, HMP и libvirt

HMP — интерактивная консоль (Ctrl+Alt+2 в окне QEMU или -monitor stdio):

☯

Terminal:

⌕

≡

✕
(qemu) info status
(qemu) info block
(qemu) savevm snap1

QMP — JSON-протокол для автоматизации. Через него работают libvirt, Proxmox, oVirt, OpenStack. Пример:

☯

Terminal:

⌕

≡

✕
qemu-system-x86_64 ... -qmp unix:/tmp/qmp.sock,server,nowait
echo '{"execute":"qmp_capabilities"}{"execute":"query-status"}' | socat - UNIX-CONNECT:/tmp/qmp.sock

libvirt — стандартный слой управления для серверной виртуализации. XML-описание ВМ, virsh, API для Python/Go/Java. Proxmox использует собственный слой (qemu-server), но концептуально близок.


Миграция

QEMU умеет живую миграцию ВМ между хостами без остановки гостя:

  • pre-copy: память копируется на целевой хост, «грязные» страницы досылаются;
  • post-copy: старт на целевом хосте сразу, память догружается по требованию;
  • multifd: параллельная передача памяти несколькими потоками;
  • RDMA-миграция для больших ВМ.

☯

Terminal:

⌕

≡

✕
# на источнике
(qemu) migrate -d tcp:target-host:4444

Живая миграция — фундамент отказоустойчивости в облаках и при обслуживании гипервизоров.


QEMU в экосистеме: кто его использует

Проект / продуктРоль QEMU
Proxmox VEосновной движок KVM-ВМ
oVirt / RHEVчерез libvirt
OpenStack Novaчерез libvirt
Incus / LXDQEMU для виртуальных машин (наряду с LXC)
Android Emulatorфорк Google QEMU
Firecrackerсобственный VMM (не QEMU), но идеологически наследник
Cloud Hypervisorсовременный Rust-VMM, тоже «наследник»
crosvmVMM ChromeOS, использует часть кода QEMU
GNU Guix / NixOSqemu-system для тестов и образов
GitHub Actions / GitLab CIqemu-user-static для multi-arch
Firmadyne / FAT / EMBAэмуляция прошивок роутеров
AFL++QEMU-режим для fuzzing бинарников без исходников

QEMU vs другие решения

QEMUVirtualBoxVMware WorkstationFirecrackerCloud Hypervisor
Открытый код✅ GPLv2частично❌✅ Apache 2.0✅ Apache 2.0
Полная эмуляция чужих архитектур✅❌❌❌❌
KVM-ускорение✅❌❌✅✅
Десктопный опытсреднийлучшийлучший❌❌
Серверная автоматизация✅ограниченнаяограниченная✅✅
Минимальный оверхедсреднийвысокийвысокийочень низкийнизкий
Живая миграция✅❌✅❌✅

QEMU — не самый быстрый и не самый удобный для десктопа, но самый универсальный и лучше всех интегрируется в инфраструктуру.


Полезные ссылки

Официальные ресурсы

Смежные проекты

Образы и готовые сборки

Обучение и статьи

Инструменты вокруг QEMU

  • virt-manager — GUI для libvirt: virt-manager.org
  • virt-install / virt-v2v / virt-p2v — из пакета virtinst и libguestfs
  • libguestfs — работа с дисками ВМ без запуска: libguestfs.org
  • qemu-img — входит в состав QEMU
  • qemu-nbd — экспорт образа как NBD-устройства
  • guestfish — shell для libguestfs

Итог

QEMU — это фундаментальный слой виртуализации и эмуляции с открытым кодом. Он умеет то, чего не умеют проприетарные аналоги: запускать код любой архитектуры на любой другой, отлаживать ядра, эмулировать роутеры и промышленные контроллеры. При этом в паре с KVM он превращается в полноценный гипервизор серверного класса, на котором держатся Proxmox, OpenStack и значительная часть облачной инфраструктуры.

Если вы работаете с embedded, роутерами на OpenWrt или старыми бинарниками (как в случае с MIPS-клиентом dix.su) — QEMU даёт возможность протестировать всё это на обычном ПК, не покупая железо. Если вы администрируете серверы — вы почти наверняка уже используете QEMU, даже если ни разу не запускали его вручную.

Свежие статьи

Windows 11 в голом QEMU/KVM на MX Linux: один скрипт, без virt-manager
17
окт

Windows 11 в голом QEMU/KVM на MX Linux: один скрипт, без virt-manager

Windows 11 в QEMU/KVM на MX Linux: пошаговая инструкция со всеми отличиями от Debian-ВМ. Разбираем, зачем нужны UEFI-прошивка OVMF и эмулятор TPM 2.0 (swtpm), как подключить второй ISO virtio-win.iso, почему установщик не видит диск и как подгрузить драйвер viostor\w11\amd64, как создать локальную учётку без интернета (start ms-cxh:localonly) и почему вместо virtio-tablet берём usb-tablet. Плюс разбор частых проблем: диск не виден, сети нет на этапе OOBE, часы сдвинуты — и способы их решения. Всё проверено на практике, с готовым скриптом win11.sh и командами для remote-viewer.

Прочитать