Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Виртуализация и эмуляция в Linux

Использование эмулятора QEMU для кроссплатформенных разработок

Оригинал: "Using QEMU for cross-platform development"
Автор: Roderick W. Smith
Дата публикации: 09 Feb 2010
Перевод: Н.Ромоданов
Дата перевода: 25 марта 2010 г.

Краткое содержание: Одной из сильных сторон Linux является его кросс-платформенная природа: вы можете запускать его на платформах x86, x86-64, SPARC, PowerPC и на многих платформах с другими процессорами (CPU). Но такой богатый выбор аппаратных средств представляет собой сложную задачу для разработчиков программного обеспечения. Могут возникнуть трудности с правильной компиляцией и корректной работой программ на всех платформах. Использование пакета QEMU поможет справиться с этими проблемами.

QEMU - это эмулятор, в котором поддерживается работа с широким спектром процессоров, так что вы можете запускать программное обеспечение, предназначенное для PowerPC, на компьютерах x86, программное обеспечение, предназначенное для x86-64, на компьютере SPARC или на том, что у вас есть. Эта возможность особенно полезна для программистов, которые необходимо проверить совместимость программного обеспечения вплоть до порядка следования байтов, а также другие другие особенности, касающиеся конкретных процессоров. QEMU также позволит вам полностью запускать различные операционные системы, так что вы можете проверить возможность компиляции программы и ее запуска под FreeBSD, Solaris или даже Microsoft Windows без остановки Linux.

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

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

Установка QEMU

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

Получение пакетов QEMU и дополнительного программного обеспечения

Как и большинство пакетов программного обеспечения Linux, вы можете установить QEMU одним из двух основных способов: с помощью менеджера пакетов вашего дистрибутива или компиляцией программы из исходных кодов. В обычных дистрибутивах вы можете установить пакет QEMU с помощью таких команд, как apt-get install qemu (на Debian или Ubuntu), yum install qemu (на Red Hat или Fedora) или emerge qemu (на Gentoo) (сморите подробности в документации вашего дистрибутива).

Пакеты QEMU, предлагаемые в дистрибутивах, работают хорошо, но они, как правило, отстают от последних релизов и в них могут отсутствовать важные файлы, например, прошивки для систем, отличающихся от x86. Так что вам может потребоваться устанавливать программное обеспечение из исходных кодов, которые можно получить с сайта QEMU (смотрите раздел Ресурсы в оригинале статьи). Наберите команду ./configure --help в директории, содержащим исходные коды, и вы получите список конфигурационнызх параметров, которые позволят вам настроить QEMU под ваши нужды. После этого с помощью обычных команд make и make install выполняется компиляция и установка программного обеспечения.

Как уже говорилось, последней стабильной версией QEMU является 0.11.1, но также доступен релиз-кандидат версии 0.12. В настоящей статье используется версия 0.11.1.

Если вы используете QEMU на компьютерах x86 или x86-64 для того, чтобы их же и эмулировать, вас, возможно, заинтересует эмулятор KQEMU. Это модуль ядра Linux, которая обеспечивает более быструю виртуализацию процессора, подобный тому, как это осуществляется в Xen или в виртуальной машине на основе ядра Linux (KVM). Но KQEMU не является частью стандартного ядра Linux, вы должны скачать модуль с сайта QEMU или установить его в виде отдельного пакета. Удостоверьтесь в том, чтобы версии QEMU и KQEMU соответствовали друг-другу, используйте KQEMU 1.3 с QEMU 0.9.1 и более ранними версиями, а KQEMU 1.4 используйте с более поздними версиями QEMU.

На главном сайте QEMU уже есть несколько готовых к использованию файлов с образами дисков QEMU. Среди них есть варианты основных инсталляторов Linux под различные платформы, инсталляторы FreeBSD и FreeDOS. Вы можете скачать эти файлы для проверки своего варианта установки эмулятора. Чтобы получить рабочую систему, вам потребуется либо расширить уже имеющийся вариант системы, либо установить новую систему с нуля.

Пакет QEMU версии 0.11.1 поставляется с прошивками для платформ x86, x86-64, PowerPC, SPARC 32 и SPARC 64 с отдельными файлами прошивки для эмуляции видеокарт, средством загрузки среды Preboot Execution Environment (PXE) и другими дополнительными возможностями. Смотрите конкретные файлы в поддиректории pc-bios в основном пакете, либо в директории /usr/share/qemu в установленной системе.

Иногда прошивок, поставляемых с QEMU, оказывается недостаточно. Например, для эмуляции традиционной базовой системы ввода/вывода BIOS) используются прошивки для систем x86 и x86-64. Если вы хотите разрабатывать или тестировать программное обеспечение, которое базируется на новом интерфейсе Extensible Firmware Interface (EFI) или более экзотических прошивках, то вам, возможно, понадобится поискать их где-нибудь в другом месте. Образы EFI имеются на сайте QEMU, так что конкретная проблема легко разрешима. Прочие проблемы, возможно, решить будет труднее. Если вам нужно работать с конкретными видами прошивок, то возможно, вам потребуется поискать их в интернете по соответствующим ключевым терминам.

Сравнение эмуляции системы и эмуляции в пользовательском пространстве

В QEMU есть два режима эмуляции. Первый, эмуляция системы, создает полную виртуальную машину. Программное обеспечение, работающее в этой системе, видит компьютер, который может существенно отличаться от хостовой системы, например, вы можете запустить систему Debian PowerPC поверх реального компьютера x86-64 с системой OpenSUSE. Эмуляция в пользовательском режиме менее полная. При таком подходе вы применяете библиотеки эмуляции QEMU для отдельных бинарных модулей, которые затем обращаются к хостовому компьютеру как к своему собственному, поскольку бинарные файлы PowerPC позволяют обращаться к директорию /etc хостовой системы OpenSUSE с архитектурой x86-64 OpenSUSE, а также к другим конфигурационным файлам. В случае эмуляции в пользовательском режиме может стать проще доступ к локальным ресурсам, к сети и к другим ресурсам.

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

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

Установка гостевых операционных систем

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

Подготовка образов дисков

Обычно, когда вы пользуетесь QEMU, в качестве жестких дисков вы используете дисковые файлы. В качестве альтернативы можно использовать разделы в сторонних системах или использовать сетевое монтирование некоторых или всех хранилищ данных; впрочем дисковые файлы удобны и гибки, поэтому в настоящей статье внимание будет сосредоточено именно на их использовании. QEMU использует для эмуляции дисков несколько различных форматов файлов, среди наиболее используемых — формат raw ("сырой" образ диска, т. е. побитовая копия диска — прим.пер.), формат VMware 3/4, а также родные форматы QEMU — Copy-On-Write версии 1 (QCOW) и версии 2 (QCOW2).

Команда qemu-img создает образы дисков. В этой команде есть много параметров, но ее основное использование сравнительно простое: передается параметр create, параметр -f fmt, с помощью которого указывается формат файла, имя файла и размер образа. Образы в формате raw (-f raw) удобны для обмена данными с другими эмуляторами, однако формат QCOW2 (-f qcow2) поддерживает сжатие, позволяющее создавать, казалось бы, большие диски на сравнительно небольшом объеме дискового пространства.

Например, следующая команда создает файл с образом диска размером 200 Гигабайт. Изначально, этот файл занимает на хостовой системе небольшое дисковое пространство (всего 256KB), однако, по мере его использования, размер будет увеличиваться:

qemu-img create -f qcow2 linuxppc.qcow2 200G

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

Параметры запуска QEMU

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

В случае полной установки QEMU обязательно присутствуют несколько двоичных файлов, каждый из которых эмулирует различные варианты архитектуры процессора. Имена двоичных файлов имеют формат qemu-system-arch, где arch является кодом архитектуры, например, ppc для архитектуры PowerPC или x86_64 для архитектуры x86-64. Исключением являются системы x86, эмуляция которых осуществляется с помощью двоичного файла qemu. С помощью двоичных файлов с именами вида qemu-arch реализуется эмуляция для соответствующей архитектуры в пользовательском режиме.

Для того, чтобы указать жесткие диски, используйте параметры -hda, -hdb, -hdc и -hdd которые указывают на жесткие диски Parallel ATA (PATA), а параметр -cdrom указывает на устройство CD или DVD. Во всех этих параметрах указывается имя файла. Оптический диск используется вместо устройства -hdc, поэтому не следует одновременно указывать оба варианта.

Еще одним важным параметром запуска QEMU является параметр -boot, который указывает загрузочное устройство. Используйте -boot c для загрузки с первого жесткого диска и -boot d для загрузки с устройства CD-ROM.

По умолчанию QEMU предоставляет гостевой операционной системе только 128 Мбайт оперативной памяти. Скорее всего, вы захотите увеличить доступную память при помощи параметра -m, в котором размер указывается в мегабайтах.

Если все эти параметры объединить вместе, то установку системы Debian для архитектуры PowerPC под QEMU можно выполнить следующим образом:

qemu-system-ppc -hda linuxppc.qcow2 -cdrom debian-ppc.iso -boot d -m 512

В этом примере предполагается, что файл Debian ppc.iso содержит копию установочного диска Debian PowerPC, и что загрузка происходит с помощью прошивки, используемой по умолчанию. У автора статьи эти параметры работали с эмулятором QEMU 0.11.1 и системой Debian 5.02a, однако QEMU может оказаться капризным и вам может потребоваться поискать обходной путь решения проблем. После установки системы вы можете использовать почти такую же команду для ее запуска - просто замените -boot d на -boot c.

Предостережения, подсказки и обходные пути

Одним из обычных камней преткновения, особенно если вы пытаетесь загрузить систему с незнакомой архитектурой, является то, что с установочного диска не удается загрузиться. Один из способов решить эту проблему, состоит в указании другого файла прошивки в параметре -bios, где можно указать имя файла с другой прошивкой. Попробуйте поискать файлы прошивки в директории /usr/local/share/qemu (или в /usr/share в аналогичном директории в случае, если вы выполнили установку с помощью пакета, взятого из вашего дистрибутива). Другие варианты прошивок также можно найти в интернете.

Аналогичный обходной путь состоит в использовании параметра -M, в котором указывается подтип архитектуры. Наберите команду qemu-system-arch -M ? и узнайте, какие значения параметров допустимы для вашей архитектуры.

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

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

Когда QEMU будет запущен, он, независимо от того, работает ли гостевая система в текстовом или графическом режиме, будет работать в окне вашей локальной системы. На рис.1 показан рабочий стол с тремя сессиями QEMU, где работает эмуляция Windows XP под x86, эмуляция FreeBSD под x86-64 и эмуляция Debian Linux под PowerPC.

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

Эффективное использование QEMU

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

Управление доступом к файлам

В QEMU есть несколько способов работы с сетями. По умолчанию используется пользовательский режим работы с сетью, который похож по настройке на трансляцию сетевых адресов (NAT): в гостевой операционной системе можно пользоваться сетевыми клиентами для связи с другими компьютерами, причем как с хостовой операционной системой, так и с другими серверами в сети, но другие системы не могут контактировать с гостевой операционной системой без специальной конфигурационной настройки. В QEMU есть свой собственный протокол Dynamic Host Configuration Protocol (DHCP) и сервера доменных имен (DNS), что дает преимущество только гостевым операционным системам. С точки зрения гостевой операционной системы хостовая система является шлюзом.

Подобная конфигурация, используемая по умолчанию, вполне достаточна, если вы планируете пользоваться Network File System (NFS), Server Message Block (SMB)/Common Internet File System (CIFS), Secure Shell (SSH) или другими клиентами приложения для передачи файлов из гостевой операционной системы на хост и обратно. Но вам потребуется запустить на хосте соответствующий сервер. Если вы хотите инициировать соединения в другом направлении (т. е. с хоста — прим.пер.), вам нужно использовать параметр -redir с тем, чтобы перенаправить порт хостовой системы на гостевую операционную систему. Например, следующая команда выполняет перенаправление с порта 2222, хостовой системы на порт 22 гостевой системы:

qemu-system-ppc -hda linuxppc.qcow2 -boot c -m 512 -redir tcp:2222::22

В результате исполнения этой команды вы сможете пользоваться SSH для входа в гостевую систему из хостовой, набирая для этого команду ssh localhost -p 2222. Можно также получить доступ к гостевой системе из других компьютеров вашей сети, так что вам, возможно, потребуется дописать для брандмауэра новые правила. Конечно, у вас должен быть SSH сервер, работающий на гостевой операционной системе. Аналогичным образом вы можете перенаправлять протоколы NFS, SMB/CIFS или другие порты.

Советы по разработке программ

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

Что касается программного обеспечения, то в большинстве практических случаев оно будет работать точно так же, как если бы это была настоящая целевая платформа. Такие специфические вещи, как порядок следования битов и байтов, идентификация процессора, а также другие базовые аппаратные особенности, будут точно такими же, как и на подлинном компьютере. Я использую настоящий PowerPC Apple Imac и систему PowerPC, эмулируемую на QEMU, для разработки и тестирования моей версии программы fdisk, в которой обрабатываются таблицы разделов (GPT) глобальных уникальных идентификаторов (GUID) и которая предназначена для работы на PowerPC, т.е. программы, которая должна работать с конкретными последовательностями байтов, выдаваемых процессором. Для моих целей система на базе QEMU ничем не отличается от реального iMac, за исключением лишь того, что система под QEMU работает немного медленнее.

Тем не менее, есть различия, если копнуть поглубже. Например, жесткие диски, эмулируемые с помощью QEMU, возвращают в качестве строки с названием модели "QEMU HARDDISK", а не название реального изготовителя жесткого диска и модели. Виртуальные аппаратные средства, эмулируемые с помощью QEMU, в некотором смысле все же специализированы: все диски, в зависимости от платформы, являются устройствами PATA или Small Computer System Interface (SCSI), а видео оборудование - очень древнее. Детали, касающиеся виртуального аппаратного обеспечения, вы можете найти в документации QEMU. Обратите внимание, что они варьируются в зависимости от используемой гостевой платформы.

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

Идем дальше

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