Эмуляция систем с помощью QEMU

Машина внутри машины

QEMU - это приложение с открытым исходным кодом, полностью эмулирующее персональный компьютер. Помимо эмуляции процессора, QEMU позволяет эмулировать также все необходимые подсистемы, такие как сетевые адаптеры и видеоплаты. Он также может эмулировать более продвинутые вещи, такие как симметричные многопроцессорные системы (вплоть до 255 процессоров) и другие процессорные архитектуры, такие как АРМ или PowerPC. В этой статье рассматривается QEMU и его архитектура, и показывается, как эмулировать гостевую операционную систему на Linux-хосте

М. Тим Джонс, инженер-консультант, Emulex

M. Tim JonesM. Тим Джонс (M. Tim Jones) является архитектором встраиваимого программного обеспечения и автором работ: Программирование Приложений под GNU/Linux, Программирование AI-приложений и Использование BSD-сокетов в различных языках программирования. Он имеет опыт разработки процессоров для геостационарных космических летательных аппаратов, а также разработки архитектуры встраиваемых систем и сетевых протоколов. Сейчас Тим работает инженером-консультантом в корпорации Эмулекс (Emulex Corp.) в г.Лонгмонт, Колорадо.



18.01.2008

Что такое QEMU?

Не будет преувеличением сказать, что виртуализация - это очень востребованная в настоящее время технология. Сегодня по запросу слова виртуализация в поисковой системе выдается примерно 22 миллиона результатов. Например, только за один месяц корпорация EMC объявила о выводе на рынок ценных бумаг подразделения VMware, Citrix System объявила о планах покупки XenSource, появилось множество новых компаний в сегменте виртуализации. На этом, как оказалось, колоссальном рынке постоянно обнаруживаются новые ниши. Но за всеми разговорами о первоначальных публичных предложениях и поглощениях в области виртуализации в эти дни легко забыть о некоторых других уже существующих технологиях виртуализации.

В этой статье будет представлено одно из наиболее интересных приложений виртуализации, не фигурирующее на первых полосах новостей - QEMU. QEMU - это приложение, которое можно применять для многих целей. Его можно использовать для виртуализации гостевой операционной системы или в качестве полнофункционального машинного эмулятора, запускающего операционные системы, предназначенные для процессора хост-системы или других процессорных архитектур.


Краткое введение в технологию виртуализации

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

Под виртуализацией в этой статье подразумевается виртуализация платформы. Для физического оборудования, контролирующая программа может быть операционной системой-хозяином или гипервизором (см. Рисунок 1). В некоторых случаях сама хозяйская операционная система и является гипервизором. Гостевые операционные системы "проживают" на гипервизоре. В некоторых случаях гостевые операционные системы ориентированы на тот же процессор, что и контролирующая программа, но в других случаях платформы могут быть отличными (например, гостевая система PowerPC работает на x86 платформе).

Рисунок 1. Базовая архитектура виртуализации платформы
Рисунок 1. Базовая архитектура виртуализации платформы

Реализовать виртуализацию можно множеством путей, но наиболее часто встречаются три основных метода. Первый называется "родной" (или полной) виртуализацией. В этом варианте гипервизор реализует основные элементы изоляции, отделяя физическое оборудование от гостевой операционной системы. Этот подход впервые был продемонстрирован в 1966 году в операционной системе виртуальных машин/виртуальной памяти IBM® CP - 40, а сейчас тот же метод используется в VMware ESX Server.

Другой популярный метод виртуализации называется паравиртуализацией. В случае паравиртуализации контролирующая программа реализует интерфейса прикладных программ (API) гипервизора, который используется гостевой операционной системой. Паравиртуализацию используют Xen и Linux Kernel-based Virtual Machine (KVM).

Третий полезный метод называется эмуляцией. Эмуляция, как видно из названия, виртуализует гостевую платформу благодаря полной имитации аппаратной среды. Эмуляция осуществляется в различных формах, даже в пределах одного и того же приложения. Примерами виртуализации посредством эмуляции -являются QEMU и Bochs.


Архитектура QEMU

Рассмотрим, как QEMU обеспечивает эмуляцию. В этом разделе описываются два режима работы QEMU, а также некоторые интересные аспекты динамического транслятора QEMU.

Основные операции QEMU

QEMU поддерживает два режима эмуляции: пользовательский режим [User-mode] и системный режим [System-mode]. Пользовательский режим эмуляции позволяет процессу, созданному на одном процессоре, работать на другом (выполняется динамический перевод инструкций для принимающего процессора и конвертация системных вызовов Linux). Системный режим эмуляции позволяет эмулировать систему целиком, включая процессор и разнообразную периферию.

При эмуляции кода для x86 на хост-системе с архитектурой x86 можно достичь эффективности, близкой к родной, с помощью так называемого акселератора QEMU. Он позволяет исполнять эмулируемый код непосредственно на центральном процессоре хоста (на Linux через модуль ядра).

Но что делает QEMU действительно интересным с технической точки зрения, так это его быстрый и компактный динамический транслятор [dynamic translator]. Динамический транслятор позволяет выполнять во время исполнения переводить инструкции целевого (гостевого) процессора в инструкции центрального процессора хоста для обеспечения эмуляции. Это может быть сделано методом грубой силы (просто заменяя инструкции одного процессора другими), но это не всегда легко сделать, а в некоторых случаях одна инструкция может потребовать нескольких инструкций или даже изменений в их порядке следования для транслируемой архитектуры.

QEMU обеспечивает динамическую трансляцию преобразованием целевой инструкции в микрооперации. Эти микрооперации представляют собой элементы С-кода, которые компилируются в объекты. Затем вступает в дело основной транслятор. Он отображает целевые инструкции на микрооперации для динамической трансляции. Такой подход не только эффективен, но и обеспечивает переносимость.

Динамический транслятор QEMU также кэширует блоки транслируемого кода для снижения накладных расходов транслятора. Когда блок целевого кода встречается впервые, он переводится и хранится в виде транслированного блока [translated block]. Кэш QEMU хранит недавно переведенные блоки в буфере объемом 16 МБ. QEMU может даже поддерживать самомодифицирующийся код, аннулируя транслированные блоки в кэше.

Узнать больше о деталях внутреннего устройства QEMU и ее динамическом трансляторе можно в интересной статье Фабриса Белларда [Fabrice Bellard] (автора QEMU), представленной в разделе Ресурсы.

Поддерживаемые периферийные устройства

Использование QEMU в качестве эмулятора персонального компьютера обеспечивает поддержку разнообразных периферийных устройств. Естественно, сюда входят стандартные периферийные устройства - эмулятор аппаратного видеоадаптера (VGA), мыши и клавиатуры PS/2, интерфейс IDE для жестких дисков, интерфейс CD-ROM и эмуляция дисковода. Кроме того, QEMU имеет возможность эмуляции сетевых адаптеров NE2000 (PCI), последовательных портов, многочисленных звуковых плат и контроллера PCI Universal Host Controller Interface (UHCI) Universal Serial Bus (USB) (с виртуальным USB концентратором). Также поддерживается до 255 процессоров с поддержкой симметричной многопроцессорности (SMP).

Помимо стандартных PC и ISA PC (без шины PCI), QEMU может эмулировать и другие аппаратные платформы, не связанные с ПК, такие как базовые платы АРМ Versatile (с использованием 926E) и платы на основе Malta million instructions per second (MIPS). В настоящее время ведется работа по реализации поддержки ряда других платформ, включая Power Macintosh G3 (Blue & White) и Sun 4u.


Сборка и установка QEMU

Сборка и установка QEMU выполняется очень просто с помощью стандартных инструментов GNU. После скачивания и разархивирования дистрибутива QEMU нужно выполнить configure, make, а затем make install (см. листинг 1).

Листинг 1. Сборка эмулятора QEMU
$ wget http://fabrice.bellard.free.fr/qemu/qemu-0.9.0.tar.gz
$ tar xfvz qemu-0.9.0.tar.gz
$ cd qemu-0.9.0
$ ./configure
$ make
$ make install
$

Этот процесс создает не только загружаемый образ qemu для текущей целевой архитектуры, но и образы для других архитектур, включая ARM, MIPS, PowerPC, 68k и SPARC. После этого можно загрузить ядро Linux уже собранным для различных целевых архитектур.

Если гостевая и операционная система хоста нацелены на одну архитектуру, то можно увеличить скорость до близкой к родной, используя акселератор QEMU (KQEMU). KQEMU - это драйвер (модуль ядра для Linux), позволяющий пользовательскому коду и коду ядра запускаться напрямую на центральном процессоре хоста. Собрать акселератор QEMU также просто, как и сам QEMU (см. листинг 2).

Листинг 2. Сборка акселератора QEMU
$ wget http://fabrice.bellard.free.fr/qemu/kqemu-1.3.0pre11.tar.gz
$ tar xvfz kqemu-1.3.0pre11.tar.gz
$ cd kqemu-1.3.0pre11
$ ./configure
$ make
$ make install

KQEMU можно скомпилировать и установить на множестве операционных систем, включая Microsoft® Windows®, FreeBSD® и Linux. После сборки акселератора QEMU его нужно установить в Linux, используя следующую команду:

$ insmod kqemu.ko
$

Использование QEMU

Теперь рассмотрим использование QEMU для виртуализации другой машины в типичной среде настольного ПК под GNU/Linux. Эмуляция другой машины похожа на начало работы с только что купленным новым компьютером. Первый шаг - это установка операционной системы. Новый компьютер, конечно, должен иметь место для установки операционной системы, поэтому необходим жесткий диск.

QEMU предоставляет специальную команду для создания жесткого диска, которая называется qemu-img. Эта утилита создает образы различных форматов, но лучший (для qemu) из них называется qcow (или qemu copy-on-write). Преимуществом данного формата является то, что образ эмулируемого диска не обязательно должен занимать физический файл такого же объема. Другими словами, формат допускает пропуски, что позволяет сделать образ диска более компактным. Например, пустой образ диска объемом 4 ГБ займет всего 16 КБ.

Для quemu-img необходимо указать операцию (create для создания нового образа диска), формат (qcow для форматирования образа qemu), размер и имя образа диска. Следующий пример эмулирует машину для небольшого дистрибутива Linux, предполагаемого для использования на Flash. Итак, создаем образ диска на 128 МБ:

$ qemu-img create -f qcow disk.img 128M
Formating 'disk.img', fmt=qcow, size=131072 kB
$

Необходимо помнить, что если планируется установка операционной системы общего назначения, такой как Windows, Linux или FreeBSD, то нужен гораздо больший диск. Результат выполненной операции - файл disk.img - будет содержать эмулируемый диск размером 128 МБ.

Теперь, когда жесткий диск создан, можно установить на него новую операционную систему. Для демонстрации этого процесса я использую небольшой дистрибутив Linux, называемый cfLinux, предназначенный для применения в качестве небольшой встраиваемой Linux-системы в таких устройствах, как шлюзы, беспроводные точки доступа, брандмауэры и маршрутизаторы. Этот дистрибутив можно загрузить в формате ISO с помощью wget:

wget ftp://ftp.cflinux.fu/pub/cflinux/iso/cflinux-1.0.iso

Образ ISO представляют собой широко применяемый формат CD-ROM (также известный как файловая система ISO 9660).

Теперь у нас есть эмулируемый диск (disk.img) и CD-ROM, с которого можно инсталлировать операционную систему. Следующим шагом будет инсталляция системы на жесткий диск. Это делается очень просто с помощью qemu:

$ qemu -hda disk.img -cdrom /root/cflinux-1.0.iso -boot d
$

При использовании qemu образ жесткого диска задается с помощью опции hda, а компакт-диск (файл, где располагается образ) - с помощью опции cdrom. Опция boot позволяет загрузиться с CD-ROM. Аргумент d указывает загружаться с CD-ROM, a - с флоппи-диска, c указывает на загрузку с жесткого диска (по умолчанию), а n - загрузку с сети. Если команда введена правильно, то появится новое окно QEMU с эмулируемой машиной (см. Рисунок 2).

Рисунок 2. Подготовка к установке cfLinux на эмулируемый диск в QEMU
Рисунок 2. Подготовка к установке cfLinux на эмулируемый диск в QEMU

Следуя инструкциям по установке с CD-ROM, легко закончить установку с ISO-образа на эмулируемый жесткий диск. Установка требует перезагрузки. В этом месте можно закончить эмуляцию (Ctrl-C в окне qemu). Теперь можно загрузить свежеустановленную операционную систему с помощью следующей команды:

$ qemu -hda disk.img
$

Эта команда просто эмулирует стандартный PC (опция по умолчанию) с жестким диском, представленным файлом образа disk.img. Образ Linux, загрузившись с эмулируемого жесткого диска, выдаст в результате окно QEMU, показанное на Рисунке 3.

Рисунок 3. Загрузка свежеустановленного cfLinux с эмулируемого жесткого диска
Рисунок 3. Загрузка свежеустановленного cfLinux с эмулируемого жесткого диска

Как видите, все очень просто. При этом такую же последовательность действий можно использовать для установки и загрузки любых разновидностей операционных систем (дистрибутивов Linux, Windows и других).


Другие эмуляторы

Хотя QEMU - великолепная среда эмуляции, другие программы тоже достойны изучения. Wine - реализация Windows API с открытым исходным кодом - позволяет запускать приложения Windows без самой операционной системы Windows. Но, как объясняет расшифровка сокращения Wine, Wine - это не эмулятор (Wine - Wine Is Not an Emulator). Вместо эмуляции Wine реализует набор API, позволяющий запускаться приложениям архитектуры x86. Поэтому приложения, запускаемые в Wine, чувствуют себя хорошо.

На QEMU похож эмулятор Bochs. Bochs - это эмулятор компьютера, позволяющий эмулировать не только процессоры Intel® i386™, i486™, Pentium®, Pentium Pro и Advanced Micro Devices AMD64, но также обычную PC-периферию, такую как диски, память, дисплей и сетевые устройства. Bochs может использоваться для эмуляции операционных систем Linux, DOS и Windows 95/98/XP/2000/NT®.


Двигаясь дальше

Использование QEMU как эмулятора компьютера позволяет экспериментировать с множеством операционных систем без необходимости иметь запасную машину. Например, с ReactOS - Windows XP-совместимой операционной системой с открытым кодом (эмуляция которой показана на Рисунке 4).

ReactOS стремится к бинарной совместимости с Windows XP, так что на ReactOS можно запускать приложения для Windows XP. В разделе Ресурсы приведены ссылки на ресурсы, содержащие информацию о текущей совместимости с приложениями.

Рисунок 4. Эмуляция стандартного PC с ReactOS
Рисунок 4. Эмуляция стандартного PC с ReactOS

Образ QEMU с ReactOS и множеством других операционных систем можно найти на Free Operating Systems Zoo (более подробная информация приведена в разделе Ресурсы). Эти операционные системы представлены в виде образов Live CD, дискет или дисков (в формате qcow). QEMU - это отличный способ попробовать новые операционные системы, не тратя время на их установку.

Ресурсы

Научиться

Получить продукты и технологии

  • Эмулятор QEMU и акселератор QEMU на сайте Фабриса Белларда. Там же можно найти документацию, API и информацию о текущем этапе развития QEMU.
  • Информация о cfLinux (EN); автор использует этот маленький дистрибутив для демонстрации установки Linux на машину QEMU.
  • С сайта Free Operating Systems Zoo (EN) можно скачать готовые образы систем, чтобы сэкономить время. На этом сайте можно найти образы множества операционных систем от стандартных дистрибутивов Linux до экзотических операционных систем (Plan 9, OpenSolaris, MINUX, ReactOS, Darwin, MenuetOS и других). После загрузки любого образа диска, он готов к запуску.
  • ReactOS - это двоично совместимая с Windows операционная система с открытым кодом, которая позволяет исполнять множество приложений Windows.
  • Wine позволяет запускать приложения Windows на не-Windows операционных системах, таких как Linux.
  • Bochs как и QEMU, также позволяет полностью эмулировать систему.
  • Закажите SEK for Linux - набор из двух DVD, содержащих новейшие ознакомительные версии ПО от IBM для Linux, в том числе DB2®, Lotus®, Rational®, Tivoli® и WebSphere®.
  • Используйте ознакомительное ПО от IBM, которое можно загрузить непосредственно с сайта developerWorks, в вашем следующем проекте для Linux.

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux, Open source
ArticleID=282728
ArticleTitle=Эмуляция систем с помощью QEMU
publish-date=01182008