QEMU: что это, как работает и где используется
QEMU: что это, как работает и где используется
QEMU (Quick Emulator) — это свободный эмулятор и виртуализатор с открытым исходным кодом. Он умеет запускать операционные системы и программы, написанные для одной архитектуры, на другой — например, ARM-прошивку на x86-ПК или MIPS-бинарник на современном ноутбуке. QEMU лежит в основе огромного количества инфраструктуры: от эмуляции роутеров и отладки ядер до облачных платформ и Android-эмулятора.
Что такое QEMU простыми словами
QEMU — это программа, которая создаёт виртуальную машину: программную копию компьютера с процессором, памятью, дисками, сетью и периферией. Внутри этой машины можно запустить почти любую ОС.
Ключевая особенность QEMU — он работает в двух принципиально разных режимах:
- Полная эмуляция (TCG) — QEMU программно переводит инструкции гостевой архитектуры в инструкции хоста. Медленно, но работает везде и для любой архитектуры.
- Аппаратная виртуализация (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, гость ходит в интернет | быстрый тест, разработка |
tap | L2-мост в хост, гость в одной сети с хостом | серверы, нормальная сеть |
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.socklibvirt — стандартный слой управления для серверной виртуализации. 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 / LXD | QEMU для виртуальных машин (наряду с LXC) |
| Android Emulator | форк Google QEMU |
| Firecracker | собственный VMM (не QEMU), но идеологически наследник |
| Cloud Hypervisor | современный Rust-VMM, тоже «наследник» |
| crosvm | VMM ChromeOS, использует часть кода QEMU |
| GNU Guix / NixOS | qemu-system для тестов и образов |
| GitHub Actions / GitLab CI | qemu-user-static для multi-arch |
| Firmadyne / FAT / EMBA | эмуляция прошивок роутеров |
| AFL++ | QEMU-режим для fuzzing бинарников без исходников |
QEMU vs другие решения
| QEMU | VirtualBox | VMware Workstation | Firecracker | Cloud Hypervisor | |
| Открытый код | ✅ GPLv2 | частично | ❌ | ✅ Apache 2.0 | ✅ Apache 2.0 |
| Полная эмуляция чужих архитектур | ✅ | ❌ | ❌ | ❌ | ❌ |
| KVM-ускорение | ✅ | ❌ | ❌ | ✅ | ✅ |
| Десктопный опыт | средний | лучший | лучший | ❌ | ❌ |
| Серверная автоматизация | ✅ | ограниченная | ограниченная | ✅ | ✅ |
| Минимальный оверхед | средний | высокий | высокий | очень низкий | низкий |
| Живая миграция | ✅ | ❌ | ✅ | ❌ | ✅ |
QEMU — не самый быстрый и не самый удобный для десктопа, но самый универсальный и лучше всех интегрируется в инфраструктуру.
Полезные ссылки
Официальные ресурсы
- Сайт: qemu.org
- Документация: qemu-project.gitlab.io/qemu
- Wiki: wiki.qemu.org
- Репозиторий: gitlab.com/qemu-project/qemu
- Зеркало на GitHub: github.com/qemu/qemu
- Список рассылки и архивы: lists.nongnu.org/archive/html/qemu-devel
- Баг-трекер: gitlab.com/qemu-project/qemu/-/issues
Смежные проекты
- libvirt: libvirt.org, github.com/libvirt/libvirt
- KVM: linux-kvm.org
- virtio: docs.oasis-open.org/virtio
- QEMU Guest Agent: wiki.qemu.org/Features/QAPI/GuestAgent
- qemu-user-static: github.com/multiarch/qemu-user-static
- Firecracker: firecracker-microvm.github.io, github.com/firecracker-microvm/firecracker
- Cloud Hypervisor: cloudhypervisor.org, github.com/cloud-hypervisor/cloud-hypervisor
- crosvm: crosvm.dev, github.com/google/crosvm
- Proxmox VE: proxmox.com, git.proxmox.com
- oVirt: ovirt.org
- OpenStack Nova: docs.openstack.org/nova
Образы и готовые сборки
- Cloud images (Ubuntu, Debian, Fedora, Alpine): cloud-images.ubuntu.com, cloud.debian.org/images/cloud
- OpenWrt для QEMU: downloads.openwrt.org/releases (x86-64 и armvirt)
- Buildroot / Yocto — сборка своих образов для QEMU
- qemu-efi / OVMF — UEFI-прошивка для гостей: пакет
ovmfв дистрибутивах
Обучение и статьи
- Официальный «QEMU documentation»: qemu-project.gitlab.io/qemu/system/index.html
- «Programming virtio» и «Virtio internals» в wiki QEMU
- Книга «Mastering KVM Virtualization» (Amit Shah и др.)
- Блог Stefan Hajnoczi (мейнтейнер QEMU): blog.vmsplice.net
- Доклады с KVM Forum: www.linux-kvm.org/page/KVM_Forum
Инструменты вокруг 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, даже если ни разу не запускали его вручную.