СЕРГЕЙ ЯРЕМЧУК, фрилансер. Автор более 800 статей и шести книг. С «СА» с первого номера. Интересы: сетевые технологии, защита информации, свободные ОС
Эмуляция при помощи QEMU
C увеличением вычислительной мощности настольных систем возрос интерес к различного рода эмуляциям. Причина ясна – теперь пользователь может работать с привычными приложениями в другой операционной системе, а то и вовсе запускать несколько копий операционных систем, создавая целые виртуальные сети на одном компьютере. Список предложений растет с каждым днем, появляются как свободные реализации, так и коммерческие приложения. Эмулируется все, от игровых приставок и компьютеров давно ушедших дней до операционных систем или отдельных сервисов. Но, судя по всему, наибольший интерес на сегодня представляет эмуляция именно компьютеров, т.к. это более востребованный продукт, особенно среди профессионалов. Теперь, запустив еще одну операционную систему, можно проверять работу приложений в различных средах, не перегружаясь по нескольку раз в день, изучать взаимодействие, исследовать неизвестное и, возможно, потенциально опасное программное обеспечение, использовать специфические инструменты, организовать обучение с теми или иными программными комплексами. Приложения, эмулирующие аппаратную среду, называют системными эмуляторами или виртуальными машинами. Среди них наиболее популярны bochs (http://bochs.sourceforge.net) и VMWare (http://www.vmware.com). Первый, довольно мощный эмулятор, но с довольно неудобным трудоемким и непонятным для новичка процессом настройки. Недостаток второго – цена, он является коммерческим продуктом. Есть еще, конечно, и Cooperative Linux – coLinux (http://www.colinux.org), позволяющий запускать ядро Linux как отдельный процесс в среде ОС Windows, но, как видите, он имеет ограничения и может подойти не для всех ситуаций. Есть и другие проекты, имеющие свои особенности. Между тем сегодня доступен свободный продукт, который наряду с большой функциональностью и скоростью работы имеет относительно простые настройки и объединяет в себе некоторые достоинства, доступные в отдельных проектах.
QEMU (http://fabrice.bellard.free.fr/qemu/index.html) представляет собой Open Source-эмулятор, достигающий хорошей скорости эмуляции, используя динамическую трансляцию кода, и способный эмулировать процессоры других архитектур. Отличительной особенностью QEMU является наличие двух видов эмуляции:
- full system emulation, при которой создается виртуальная машина, имеющая свой процессор и различную периферию, что позволяет запускать еще одну операционную систему;
- User mode emulation, этот режим, реализованный только для GNU/Linux, позволяет запускать на родном процессоре программы, откомпилированные под другую платформу.
Опционально доступен QEMU Accelerator Module (KQEMU), выполняющий часть кода напрямую на реальном процессоре, минуя виртуальный, и таким образом оптимизируя выполнение кода в full system emulation-режиме.
Установить QEMU можно на GNU/Linux, MS Windows всех версий начиная с Windows 3.11, BeOS 5 PE, FreeDOS и MSDOS, Solaris, NetBSD, OS/2, Minix и некоторых других. Полный список операционных систем, на которых протестирована работа qemu с указанием особенностей, доступна в документе «QEMU OS Support»: http://fabrice.bellard.free.fr/qemu/ossupport.html.
На момент написания статьи в качестве основной платформы могли использоваться компьютеры на базе x86- и PowerPC-процессоров, на стадии тестирования находились x86_64, Alpha, Sparc32, ARM и S390. В режиме full system emulation пока полноценно эмулируется только x86-платформа, хотя уже доступны реализации x86_64, SPARC и PowerPC, но они находятся в стадии тестирования. QEMU Accelerator Module реализован пока только для Linux, хотя в будущем планируется также поддержка Windows, *BSD и 64 разрядных процессоров. В user mode список чуть больше x86, ARM, SPARC и PowerPC. Остальные платформы находятся пока на стадии тестирования, и при работе возможны сбои.
Виртуальная машина i386-архитектуры, созданная при помощи qemu, получает в свое распоряжение следующий набор виртуальных устройств:
- процессор такой же частоты, как и на основной системе, в многопроцессорной системе виртуальный компьютер получает в свое распоряжение только один процессор;
- PC BIOS, используемый в проекте Bochs;
- материнская плата i440FX с PIIX3 PCI – ISA-мостом;
- видеокарта Cirrus CLGD 5446 PCI VGA или VGA карта с Bochs VESA-расширениями;
- мышь PS/2 и клавиатура;
- 2 PCI IDE-интерфейса для жесткого диска и поддержку CD-ROM;
- один гибкий диск;
- до 6 NE2000 PCI-сетевых карт;
- до 4 последовательных (СОМ)-портов;
- вывод звука через Soundblaster 16-совместимую карту.
Как видите, на данный момент виртуальная машина в qemu не работает с USB- и SCSI-устройствами. Здесь он пока, бесспорно, проигрывает VMWare.
Все библиотеки и эмулятор распространяются в исходных текстах по GNU LGPL, исключение составляет только QEMU Accelerator Module, являющийся проприетарным продуктом и требующий согласия разработчиков при распространении и коммерческом использовании.
Установка QEMU
Скомпилированная версия для GNU/Linux, исходные тексты и модуль QEMU Accelerator Module доступны на сайте проекта на странице Download. За версиями для Windows и Mac OS X необходимо идти на сайт Free Operating System Zoo – FreeOSZoo (http://www.freeoszoo.org). На этих же сайтах вы найдете и готовые образы свободных операционных систем для запуска при помощи QEMU. Размер архива небольшой, чуть меньше одного мегабайта. Установка из исходных текстов происходит обычным образом. При написании статьи использовался ASPLinux 10 Express.
# su
# tar zxvf qemu-0.6.1.tar.gz
# cd qemu-0.6.1
# ./configure
# make
# make install
После чего эмулятор можно запускать. Если набрать qemu без параметров, то будет выведен список опций. В общем случае строка запуска выглядит так:
qemu [options] [disk_image]
Теперь для примера работы гостевой системы вставляем загрузочный диск в CD-ROM и даем такую команду:
# qemu -cdrom /dev/cdrom
Connected to host network interface: tun0 |
В результате откроется еще одно окно, в котором начнется процесс обычной загрузки системы. Если был вставлен диск с одним из LiveCD-дистрибутивов, то его тут же можно использовать обычным образом. Естественно, скорость работы гостевой системы будет ниже, чем при запуске на реальной системе. Для того чтобы набирать данные в гостевой системе, нужно просто щелкнуть мышью в окне, выйти в основную систему можно, нажав . В зависимости от установок родительской ОС может выскочить сообщение о том, что qemu не может получить DNS-имя. Происходит это потому, что программа не может настроить сеть с параметрами по умолчанию. Самым простым выходом будет добавить опцию -dummy-net, активирующую поддельный сетевой стек, но при этом гостевой системой не будут приниматься и отправляться пакеты.
# qemu -dummy-net -cdrom /dev/cdrom
Имея готовый iso-образ, можно его проверить перед записью на диск (рис. 1).
# qemu -dummy-net -cdrom movix.iso
По умолчанию qemu для поднятия виртуального сетевого tap/tun-интерфейса использует скрипт /etc/qemu-ifup, если таковой не обнаруживается, то пытается использовать параметр -user-net. В этом режиме запускается виртуальный межсетевой экран и DHCP-сервер, имеющий адрес 10.0.2.2, виртуальный DNS-сервер (10.0.2.3) и SMB-сервер (10.0.2.4). Клиент DHCP на виртуальном компьютере получает адрес в сети 10.0.2.x. В таком режиме с виртуальной машины пингуется только адрес 10.0.2.2, но напрямую в Интернет с такими настройками выйти не получится, только через перенаправление, о котором чуть позже.
Рисунок 1
В простейшем случае скрипт /etc/qemu-ifup выглядит так:
#!/bin/sh
sudo /sbin/ifconfig $1 192.168.0.1
После чего tun-интерфейс будет сопоставлен NE2000-совместимой эмулируемой сетевой карте. Как говорилось, один виртуальный компьютер может иметь до 6 сетевых карт, необходимое количество которых задается опцией -nics с указанием числа. Добавив параметр -macaddr, можно задать МАС-адрес для первого сетевого интерфейса, МАС-адреса остальных будут автоматически инкрементированы.
Если на основной системе установлен Samba-сервер, то гостевая система может общаться с основной через него, для этого используется опция -smb с указанием каталога.
# qemu -smb /mnt/qemu -user-net -cdrom /dev/cdrom
Аналогично можно активировать и встроенный ftp-сервер, добавив при запуске команду: -tftp каталог. При этом все файлы, находящиеся в указанном каталоге, могут быть загружены на гостевую систему. Еще одним из способов обмена информацией между основной и гостевой системами является перенаправление. Формат опции такой:
-redir [tcp|udp]:host-port:[guest-host]:guest-port
И запустив эмуляцию с такой опцией:
# qemu -redir tcp:1234::23 -cdrom /dev/cdrom
Получим возможность подключаться к telnet-порту на гостевой системе.
# telnet localhost 1234
Кроме готовых iso-образов, несомненным удобством является возможность загрузить операционную систему, уже установленную на жесткий диск. Например, на моем компьютере не редкость две-три, а то и больше различных систем, так что теперь нет необходимости перезагружаться каждый раз.
Например, такая команда запустит загрузчик Grub, установленный у меня в MBR (рис. 2):
# qemu -snapshot -hda /dev/hda
Теперь можно выбирать и загружать нужную ОС обычным образом. Опция snapshot помогает избежать возможной потери данных, так как все модификации вместо непосредственной записи на диск будут производиться во временном файле, находящемся в /tmp. При этом snapshot можно использовать также и с другими типами образов, которые поддерживаются qemu, если необходимо оставить нетронутым оригинал. Но используя сочетание клавиш , при необходимости можно сбросить все изменения на диск.
Рисунок 2
По умолчанию под гостевую операционную систему отводится 128 Мб оперативной памяти, указав при помощи опции -m другое число, можно задать требуемый объем.
При запуске qemu эмулирует ту же аппаратную среду, в которой он запускается, т.е. при запуске на Pentium будет подражать Pentium, а если PowerPC, то будет запущен еще один PowerPC-компьютер и т. д. Если же необходима эмуляция систем отличной архитектуры, то запускаем специальную версию утилиты (qemu-system-ppc, qemu-system-sparc).
Как говорилось выше, на сайте проекта имеются готовые образы различных операционных систем и архитектур. Версии небольшого объема не всегда могут удовлетворять по функциональности, а архивы более 1 Гб тащить из Интернета накладно, поэтому лучше такой образ подготовить и самому, собрав в него самые необходимые приложения. Для этих целей используется утилита qemu-img, при помощи которой создается новый виртуальный жесткий диск.
# qemu-img create linux.img 1500M
Хотя никто не мешает использовать для этих целей и dd.
# dd of=hd.img bs=1024 seek=1048576 count=0
После того как такой жесткий диск создан, можно устанавливать в него операционную систему.
# qemu -hda linux.img -cdrom /dev/cdrom -boot d
В этом примере мы указываем qemu на то, что жесткий диск находится в контейнере hdd.img, в качестве CD-ROM устройства /dev/cdrom и загрузка будет происходить с CD-ROM (параметр -boot d). Последний параметр в нашем примере необходим, так как по умолчанию qemu будет загружаться с жесткого диска. Если нужно указать на загрузку с дискеты, используется -boot а, с жесткого диска -boot с. Естественно, никто не мешает вместо реального диска использовать его iso-образ. Но большинство дистрибутивов распространяется не на одном, а на нескольких дисках, поэтому необходимо дополнительное управление, которое обеспечивается при помощи опции -monitor, открывающей терминал, в котором можно изменять параметры эмуляции, выбирать другое устройство, либо исходный файл.
# qemu -monitor stdio -hda linux.img -cdrom altlinux_cd1.iso -boot d
И когда установятся пакеты с первого образа, заменяем файл.
# qemu change -cdrom altlinux_cd2.iso
После окончания процесса установки можно загружаться с полученного образа.
# qemu linux.img
Кроме того, qemu поддерживает образы формата COW (Copy On Write), используемые в User Mode Linux. Такой образ занимает меньше места, так как при его использовании запоминаются только изменения. Для формирования cow-образа используется утилита qemu-mkcow с указанием размера в мегабайтах.
# qemu-mkcow cowimage.cow 1024
Хотя в последнем снимке эта утилита пропала из архива. В будущем вместо нее, очевидно, будет использоваться qemu-img с командой convert.
# qemu-img convert –f cow cowimage.cow image.raw
При этом может быть задан как входной, так и выходной формат образа, поддерживаются raw, qcow (удобен для маленьких файлов, поддерживает шифрование и сжатие), cow, формат VMWare – vmdk и cloop (Linux Compressed Loop) для образов CD-ROM. Использовав команду info, можно получить информацию о готовом образе.
В некоторых случаях может возникнуть необходимость в замене параметров загрузки Linux-системы, записанной на виртуальный диск. Сделать это можно при помощи опций -kernel, -initrd и -append. Значения которых совпадают с таковыми в конфигурационных файлах загрузчиков.
# qemu-fast -nographic -hda linux.img -kernel bzImage-2.4.21 -append "console=ttyS0 root=/dev/hda sb=0x220,5,1,5 ide2=noprobe
ide3=noprobe ide4=noprobe ide5=noprobe"
Для запуска команды qemu-fast потребуется первоначально изменить гостевое ядро, наложив патч linux-2.6-qemu-fast.patch, который можно найти в архиве с исходными текстами. Этот режим использует напрямую реальный Memory Management Unit (MMU) вместо эмулируемого при обычном режиме работы qemu. Но с ним работайте осторожно, так как основная и гостевая системы используют одно адресное пространство, что может привести к проблемам безопасности или нарушению стабильности работы основной системы. Кроме того, в режиме qemu-fast пока полноценно поддерживается не вся периферия. Поэтому при работе в Linux лучше использовать KQEMU. Но, скорее всего, скомпилированный модуль, поставляемый вместе с архивом, у вас откажется работать, а в документации не сказано, под какую именно версию ядра он собирался, поэтому необходимо будет собрать модуль самому. Сделать это просто. Распаковываем архив в каталог с исходными текстами qemu.
# cd qemu-0.6.1
# tar zxvf /tmp/kqemu-0.6.2-1.tar.gz
После чего собираем qemu, как описано выше. Для успешной компиляции понадобятся исходники рабочего ядра. Работает KQEMU через устройство /dev/kqemu, которое должно создаться самостоятельно. Если этого не произошло, сделайте сами.
# mknod /dev/kqemu c 250 0
# chmod 666 /dev/kqemu
После чего модуль можно запускать вручную при помощи /sbin/insmod kqemu, либо при постоянной работе с виртуальными машинами прописать команду в загрузочных скриптах. По умолчанию в /dev/shm KQEMU создает файл большого размера, содержащий ОЗУ виртуальной машины, переменной QEMU_TMPDIR можно переопределить его местонахождение, но делать это рекомендуется только при малом объеме основного ОЗУ, иначе это только замедлит работу виртуальной машины.
Для удобства можно запускать qemu не в отдельном окне, а в полноэкранном режиме. Для этого добавляется опция -full-screen, либо можно использовать комбинацию .
Использование user mode-режима также не вызывает особых проблем. Только предварительно необходимо скачать и распаковать архив qemu-gnemul, содержащий библиотеки различных систем (x86, ARM, SPARC и PowerPC). В user mode-режиме работы используются утилиты: qemu-arm, qemu-i386, qemu-ppc и qemu-sparc. Для экспериментов можно использовать архив qemu-tests-0.5.1.tar.gz, содержащий версии основных UNIX-утилит, скомпилированных под различные платформы.
Вот так можно запустить команду ls, собраную под PPC.
# qemu-PPC ./qemu-tests/PPC/ls
По умолчанию необходимые для работы в user mode-режиме библиотеки должны находиться в /usr/gnemul/qemu-i386, при помощи -L можно указать другое местонахождение. При желании можно с помощью wine (на сайте проекта есть адаптированная версия) запустить в Linux Windows-приложение.
Запуск и работа с qemu в Windows аналогична Linux.
C:>qemu.exe -hda guest_image_name.img -boot c -user-net
Кроме того, при установке на рабочем столе появляется ярлык, запускающий скрипт, который помогает в диалоговом режиме ввести необходимые параметры:
Рисунок 3
Наработки проекта пришлись по вкусу многим, и как результат появились проекты-сателлиты, позволяющие сделать работу с qemu более удобной. Так, свои интерфейсы предлагают проекты KQEmu (http://kqemu.sourceforge.net, рис. 4) под библиотеки Qt3 (стоит обратить внимание, что название этого проекта совпадает с принятым сокращением QEMU Accelerator Module).
Рисунок 4
Запускается он несколько необычно.
# kmdr-executor /home/sergej/work/kqemu-0.1/kqemu-0.1.kmdr
Или Qemu Launcher (http://emeitner.f2o.org/projects/qemu-launcher) для сторонников GNOME/Gtk-приложений.
Для пользователей Windows, вместо того чтобы вбивать каждый раз параметры запуска, рекомендую использовать QGui (http://perso.wanadoo.es/comike, рис.5).
Рисунок 5
Qemu представляет собой довольно мощное приложение, позволяющее эмулировать системы различных архитектур и запускать приложения, собранные под другие операционные системы. Конечно же, подобно прочим эмуляторам он не может выполнять приложения так же быстро, как это происходит на реальной системе, а по скорости он не отстает от проектов вроде Bochs. Но у последнего он однозначно выигрывает по возможностям и удобству работы.
При этом если эмуляция используется эпизодически, время от времени, Qemu представляется мне более удобным, чем коммерческий VMWare, ключ к активации или срок использования бесплатной бета-версии, которого имеет привычку заканчиваться в самый неподходящий момент. К тому же Qemu не требует предварительной настройки и подготовки, а сам процесс от компиляции до запуска занимает минимум времени.