QEMU
QEMU (Quick Emulator) — это свободное программное обеспечение с открытым исходным кодом, предназначенное для эмуляции аппаратного обеспечения различных вычислительных систем. QEMU позволяет запускать операционные системы и программы, разработанные для одной архитектуры (например, x86-64), на устройстве с другой архитектурой (например, ARM или RISC-V) или в изолированной виртуальной среде на той же архитектуре. Программа поддерживает как полную системную эмуляцию (эмуляцию целого компьютера), так и эмуляцию на уровне пользовательского пространства (user-mode эмуляция), что позволяет запускать отдельные приложения, скомпилированные для другой архитектуры.
История
Проект QEMU был основан французским программистом Фабрисом Белларом (Fabrice Bellard) в 2003 году. Первоначально QEMU разрабатывался как эмулятор, способный выполнять код для различных процессорных архитектур. В 2005 году Беллар выпустил версию 0.8.0, которая включала поддержку эмуляции нескольких гостевых систем одновременно.
В 2008 году компания Red Hat объявила о включении QEMU в состав своего проекта по виртуализации KVM (Kernel-based Virtual Machine). KVM, являющийся модулем ядра Linux, использует QEMU в качестве пользовательского интерфейса для управления виртуальными машинами. Это партнёрство значительно ускорило развитие QEMU, добавив поддержку аппаратной виртуализации (технологии Intel VT-x и AMD-V) и повысив производительность.
С 2011 года проект QEMU управляется сообществом разработчиков под эгидой организации Software Freedom Conservancy. Ключевыми разработчиками являются сотрудники Red Hat, IBM, Google и других компаний. В 2020 году вышла версия 5.0, которая принесла поддержку новых архитектур (например, RISC-V) и улучшения для эмуляции графических процессоров.
Архитектура и принцип работы
QEMU состоит из двух основных компонентов: эмулятора процессора (TCG — Tiny Code Generator) и набора эмулируемых устройств (виртуальных периферийных устройств).
Tiny Code Generator (TCG)
TCG — это динамический транслятор кода. Он преобразует машинные инструкции гостевой архитектуры (например, ARM) в инструкции хост-архитектуры (например, x86-64) во время выполнения. Этот процесс называется «двоичной трансляцией» (binary translation). TCG разбивает гостевой код на блоки (трансляционные блоки), транслирует их в промежуточное представление (IR — Intermediate Representation), а затем компилирует в машинный код хост-системы. Транслированные блоки кэшируются для ускорения повторного выполнения.
Эмуляция устройств
QEMU эмулирует широкий спектр аппаратных устройств, включая:
- Процессоры: x86, x86-64, ARM, AArch64, MIPS, PowerPC, SPARC, RISC-V, s390x и другие.
- Контроллеры памяти: эмуляция различных типов оперативной памяти, кэшей и контроллеров.
- Графические адаптеры: эмуляция VGA, Cirrus Logic, virtio-gpu, а также специализированных GPU для ускорения графики в гостевой системе.
- Сетевые карты: эмуляция Realtek RTL8139, Intel E1000, virtio-net.
- Дисковые контроллеры: IDE, SATA, SCSI, NVMe, virtio-blk.
- Звуковые карты: Sound Blaster 16, AC97, HDA.
- USB-контроллеры: эмуляция UHCI, EHCI, xHCI.
Режимы работы
QEMU поддерживает два основных режима работы:
Системная эмуляция (System Emulation)
В этом режиме QEMU эмулирует целый компьютер, включая процессор, память, периферийные устройства и BIOS. Гостевая операционная система (например, Windows, Linux, BSD) запускается как обычная программа на хост-системе. Этот режим позволяет:
- Запускать операционные системы, несовместимые с хост-архитектурой (например, Windows на ARM-устройстве).
- Тестировать и отлаживать операционные системы без физического оборудования.
- Выполнять изолированные вычисления в виртуальной среде.
Эмуляция пользовательского пространства (User-Mode Emulation)
В этом режиме QEMU эмулирует только процессор и системные вызовы (syscalls) гостевой архитектуры. Он позволяет запускать отдельные приложения, скомпилированные для другой архитектуры, без эмуляции всей операционной системы. Например, можно запустить программу для ARM на x86-64-системе. Этот режим используется для:
- Кросскомпиляции и тестирования программного обеспечения.
- Запуска устаревших или редких приложений.
- Выполнения кода в изолированном окружении.
Виртуализация с KVM
При использовании с KVM (Kernel-based Virtual Machine) QEMU переключается в режим аппаратной виртуализации. В этом режиме QEMU не эмулирует процессор, а передаёт управление гостевой операционной системе напрямую на физический процессор с помощью аппаратных расширений виртуализации (Intel VT-x или AMD-V). Это обеспечивает почти нативную производительность для гостевых систем, работающих на той же архитектуре, что и хост. QEMU в этом случае управляет виртуальными устройствами (дисками, сетью, графикой) и памятью.
Применение
QEMU широко используется в различных областях:
Разработка и тестирование программного обеспечения
- Кроссплатформенная разработка: Разработчики используют QEMU для тестирования приложений на разных архитектурах (ARM, MIPS, PowerPC) без необходимости иметь физическое оборудование.
- Отладка операционных систем: QEMU поддерживает GDB (GNU Debugger), что позволяет отлаживать ядро ОС и драйверы устройств.
- Тестирование безопасности: Исследователи используют QEMU для анализа вредоносного ПО в изолированной среде.
Облачные вычисления и виртуализация серверов
- Платформы виртуализации: QEMU является основой для многих облачных решений, включая OpenStack, oVirt и Proxmox VE.
- Виртуализация рабочего стола: QEMU используется в проектах по виртуализации рабочих столов (VDI — Virtual Desktop Infrastructure).
Эмуляция устаревших систем
- Ретрокомпьютинг: QEMU позволяет запускать старые операционные системы (например, MS-DOS, Windows 95, Mac OS 9) на современных компьютерах.
- Эмуляция игровых консолей: QEMU используется для эмуляции игровых консолей, таких как PlayStation 2 (через проект PCSX2) и Nintendo 64 (через проект Mupen64Plus).
Образование и исследования
- Изучение архитектуры компьютеров: QEMU используется в учебных курсах для демонстрации работы процессоров и операционных систем.
- Исследования в области виртуализации: QEMU служит платформой для экспериментов с новыми методами виртуализации и эмуляции.
Производительность и оптимизация
Производительность QEMU в режиме системной эмуляции без аппаратной виртуализации обычно составляет от 10% до 50% от нативной производительности хост-системы, в зависимости от сложности эмулируемой архитектуры и нагрузки. При использовании KVM производительность приближается к нативной (потери обычно составляют 1-5%).
Основные методы оптимизации:
- Кэширование трансляций: TCG кэширует транслированные блоки кода, что ускоряет повторное выполнение.
- Виртуализация устройств: Использование virtio-драйверов (паравиртуализированных устройств) снижает накладные расходы на эмуляцию ввода-вывода.
- Аппаратная виртуализация: Использование KVM для ускорения выполнения гостевого кода.
- Многопоточность: QEMU поддерживает многопоточную эмуляцию, что позволяет использовать несколько ядер процессора для ускорения эмуляции.
Инструменты командной строки
QEMU поставляется с набором утилит командной строки:
- qemu-system-<архитектура> (например, qemu-system-x86_64, qemu-system-arm) — основной инструмент для системной эмуляции.
- qemu-<архитектура> (например, qemu-arm, qemu-aarch64) — инструмент для эмуляции пользовательского пространства.
- qemu-img — утилита для создания, конвертации и управления образами дисков (поддерживает форматы qcow2, raw, vmdk, vdi и другие).
- qemu-nbd — утилита для монтирования образов дисков QEMU в хост-систему через Network Block Device.
- qemu-ga — агент гостевой системы, обеспечивающий взаимодействие между хостом и гостевой ОС.
Форматы образов дисков
QEMU поддерживает множество форматов образов дисков:
- raw — неформатированный образ, занимающий ровно столько места, сколько указано.
- qcow2 — формат с копированием при записи (copy-on-write), поддержкой сжатия, шифрования и снапшотов.
- vmdk — формат, используемый VMware.
- vdi — формат, используемый VirtualBox.
- vhd — формат, используемый Microsoft Hyper-V.
- qcow — устаревшая версия qcow2.
Лицензия и сообщество
QEMU распространяется под лицензией GNU General Public License (GPL) версии 2. Исходный код доступен на официальном сайте проекта и в репозиториях GitHub. Сообщество разработчиков активно поддерживает проект, выпуская новые версии каждые 3-4 месяца. Официальные релизы сопровождаются подробными списками изменений (changelog).
Интересные факты
- QEMU был первым эмулятором, который поддерживал динамическую двоичную трансляцию для нескольких архитектур одновременно.
- В 2005 году Фабрис Беллар использовал QEMU для эмуляции Windows XP на Linux, что стало одним из первых демонстраций кроссплатформенной эмуляции.
- QEMU используется в проекте Android Emulator (в составе Android SDK) для эмуляции ARM-устройств на x86-системах.
- В 2021 году QEMU добавил поддержку эмуляции процессоров архитектуры RISC-V, что способствовало развитию этой открытой архитектуры.
Источники
- Официальная документация QEMU (qemu.readthedocs.io)
- Исходный код QEMU (git.qemu.org)
- Статья «QEMU: A Fast and Portable Dynamic Translator» (Fabrice Bellard, 2005)
- Документация по KVM (linux-kvm.org)
- Книга «Virtualization with QEMU and KVM» (Red Hat, 2019)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →