Карта сайта Хакер в RSS Энциклопедия Хакера PDA версия сайта Почтовые рассылки Хакера    Хакер в Twitter
Журналы Новости Форум Видео Life Xakep Live (блоги)
Bugtrack Статьи Блог Поиск English
Исполнители желаний: обзор конструкторов популярных Linux дистрибутивов ИСПОЛНИТЕЛИ ЖЕЛАНИЙ: ОБЗОР КОНСТРУКТОРОВ ПОПУЛЯРНЫХ LINUX ДИСТРИБУТИВОВ
02.09.2010

Практически для каждого популярного дистрибутива можно найти удобное средство для создания респина: будь то веб или локальное приложение...
Ученье – свет и высокая зарплата: обзор программных эмуляторов сетевого оборудования Cisco Systems и Juniper Networks УЧЕНЬЕ – СВЕТ И ВЫСОКАЯ ЗАРПЛАТА: ОБЗОР ПРОГРАММНЫХ ЭМУЛЯТОРОВ СЕТЕВОГО ОБОРУДОВАНИЯ CISCO SYSTEMS И JUNIPER NETWORKS
01.09.2010

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

Виртуальный полигон: Эмулируем аппаратное обеспечение различных платформ с помощью QEMU

Владимир «turbina» Ляшко (v.turbina@gmail.com)


C ростом мощностей компьютеров тема виртуализации становится все популярнее. На одном компьютере можно без проблем создавать целые виртуальные сети, запуская несколько копий ОС. Это полезно не только для тестирования или обучения, но и в обычной работе. В случае сбоя или хакерской атаки вернуть виртуальную систему в исходное состояние очень просто.

Возможности QEMU

QEMU относится к программам, эмулирующим аппаратную среду. Основные функции аналогичны именитым VMWare, VirtualBox, Bochs или Virtual PC, хотя некоторые возможности отличаются. Например, поддерживается два вида эмуляции:

  • Full system emulation – создается полноценная виртуальная машина, имеющая «свой» процессор и различную периферию;
  • User mode emulation – режим, поддерживаемый только в Linux. Он позволяет запускать на родном процессоре программы, откомпилированные под другую платформу.

Во втором варианте QEMU берет на себя всю заботу о переводе инструкций процессора и конвертации системных вызовов. Благодаря быстрому и компактному динамическому транслятору кода, достигается высокая скорость эмуляции. В этом режиме возможна эмуляция не только x86, но и процессоров других архитектур: ARM, SPARC, PowerPC, MIPS и m68k. К списку полной эмуляции добавим еще x86_64 и EM64T. Работает QEMU на Linux, FreeBSD, Mac OS X, FreeDOS и Windows (www.h7.dion.ne.jp/~qemu-win). В качестве основной платформы можно использовать компьютеры на базе x86, x86_64 и PowerPC. Впрочем, ограниченно поддерживаются и некоторые другие (DEC Alpha, SPARC32, ARM, S390). Виртуальная машина i386-архитектуры, созданная при помощи QEMU, получает в свое распоряжение следующий набор устройств:

  • процессор такой же частоты, как и на основной системе; в SMP-системах возможна работа до 255 CPU (по умолчанию 1 CPU);
  • 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 совместимую карту.

В последних версиях появилась долгожданная поддержка USB и улучшен звук. Также стало возможно сетевое соединение между эмулируемыми ОС.
По сравнению с другими известными виртуальными машинами, QEMU работает достаточно шустро. Но есть еще модуль QEMU Accelerator Module (KQEMU), позволяющий выполнять часть кода напрямую на реальном процессоре, минуя виртуальный. Это неплохо ускоряет работу гостевой системы. Без этого модуля запуск виртуальной ОС замедляется примерно в пять раз.

Сейчас KQEMU доступен для ядер Linux-версий 2.6.x и 2.4.x (работает только на x86 и x86_64). Есть порты под FreeBSD и Windows, но они недостаточно развиты. Ранее KQEMU распространялся по проприетарной лицензии с закрытым исходным кодом и только для Linux. Сегодня его код открыт под GNU GPL, как и прочие компоненты QEMU.

Кроме того, в рамках проекта Linux KVM (Kernel-based Virtual Machine) полным ходом идет разработка поддержки технологий аппаратной виртуализации (Intel VT и AMD SVM) для x86-процессоров Intel и AMD. Пока это патчи, позволяющие QEMU использовать возможности KVM. В будущем поддержка KVM будет реализована в основной ветке QEMU.

Установка QEMU

Всем хорош QEMU, но есть один недостаток – документация проекта больше рассчитана на разработчиков. Нормальных инструкций для пользователя так мало, что их можно пересчитать по пальцам одной руки. Особенно учитывая, что в последних версиях изменился процесс установки и работы (хотя и незначительно). На странице закачки предлагаются исходные тексты, бинарная сборка для Linux и ссылки на пакеты для RHEL/Fedora и Slackware, плюс порты Windows, OpenSolaris, Mac OS X и готовые образы систем. Для примера установим QEMU в Ubuntu. Но все сказанное будет актуально для Debian и в некоторой мере для других дистрибутивов. Проверяем, что доступно в репозитарии:

$ sudo apt-get update
$ sudo apt-cache search qemu

Если подключен Universe, – в ответ получаем список приложений, в котором присутствует как сам эмулятор, так и некоторые утилиты для работы с ним. Смотрим, что за версию предлагают:

$ sudo apt-cache show qemu | grep -i version
Version: 0.9.1-1ubuntu1

На момент написания статьи это был самый последний релиз. Инсталлируем:

$ sudo apt-get install qemu

Появится QEMU и при установке пакета kvm. Список зависимостей можно просмотреть командой «sudo apt-cache depends qemu». Мы же будем собирать его самостоятельно. Установка ускорителя KQEMU вынесена в отдельную операцию – как при установке при помощи пакетов, так и при сборке из исходников. В первом случае вводим:

$ sudo apt-get install kqemu-common

При сборке с помощью пакетов проще не искать зависимости вручную:

$ sudo apt-get build-dep qemu

У меня было установлено 28 зависимостей. Кроме этого, эмулятор требует для работы еще несколько пакетов:

$ sudo apt-get install bochsbios libasound2 libc6 \
libncurses5 libsdl1.2debian vgabios zlib1g

В списке рекомендуемых также значатся debootstrap, openbios-sparc, openhackware, proll, sharutils и vde2. Теперь качаем с сайта проекта последние версии эмулятора и ускорителя и распаковываем архив с qemu во временный каталог и в подкаталог архив с kqemu.

$ tar xzvf qemu-0.9.1.tar.gz
$ cd qemu-0.9.1/
$ tar xzvf ../kqemu-1.4.0pre1.tar.gz

Если в системе присутствует старая версия эмулятора с модулем kqemu, его желательно выгрузить:

$ sudo rmmod kqemu

Конфигурируем:

$ ./configure

В результате получаем большой список параметров сборки. Среди них важны «SDL support yes», который означает возможность запуска в графическом режиме, и «kqemu support yes» – это поддержка ускорителя. Теперь вводим «make», а затем: «sudo make install». Ускоритель kqemu нужно собирать отдельно. Переходим в подкаталог с kqemu и повторяем все сначала:

$ cd kqemu-1.4.0pre1
$ ./configure

Если ошибок нет, то дальше выполняем обычную установку. Единственный момент, который способен вызвать проблему, — отсутствие заголовочных файлов действующего ядра. Поэтому если в ответ получаешь «kqemu cannot be compiled on your system», доустанови хэдеры. По какой-то причине команда «sudo apt-get build-dep kqemu-common» выдает запрос на установку только одного пакета dpatch. То есть, заголовочные файлы ядра в зависимостях не устанавливаются, поэтому вводим:

$ sudo apt-get install kernel-headers-$(uname -r)

И – повторяем процедуру установки. Загрузить модуль не со «своим» ядром не получится, в ответ будет выдано сообщение «Invalid module format».
Есть еще один нюанс. Если ранее по запросу был установлен gcc-3.4, то попытка выполнить «sudo apt-get install kqemu-source» приведет к тому, что в системе появится еще и gcc-4.1, который и будет использован для сборки модуля. Проблем это не вызывает, но все же. Пробуем загрузить модуль:

$ sudo modprobe kqemu

Чтобы впредь не загружать его вручную, добавь «kqemu» в /etc/modules. Возможно, в некоторых дистрибутивах, использующих UDEV, к команде для запуска модуля понадобится добавить параметр 2major=0»:

$ sudo modprobe kqemu major=0

А чтобы изменить параметры доступа, используй скрипты настройки UDEV. Например, в Fedora заносим файл /etc/udev/permissions.d/50-udev.permissions строчку «kqemu:root:root:0666».

Работа с QEMU

Запустить LiveCD-дистрибутив очень просто. Достаточно вставить диск в привод и ввести команду:

$ qemu -m 512 -cdrom /dev/cdrom

Для виртуальной машины я выделил 512 Мб (по умолчанию – 128 Мб, но этого не всегда хватает). Через некоторое время появится новое окно, в котором будет запущена ОС. Принцип взаимодействия напоминает VMWare. Чтобы управлять виртуальной системой, щелкаем мышкой внутри окна. Выйти можно, нажав <Ctrl+Alt>.
Если есть ISO-образ, то можно подключить и его:

$ qemu -m 512 -cdrom TinyMe-2008.0.i586.iso

Если при запуске эмулятора будет выдаваться сообщение о неактивности модуля kqemu: «Could not open /dev/kqemu - QEMU acceleration layer not activated: Permission denied», то потребуется изменение прав на файл устройства /dev/kqemu (по умолчанию 660):

$ sudo chmod 666 /dev/kqemu

Кстати, раньше нужно было создавать этот файл вручную при помощи команды «mknod /dev/kqemu c 250 0». Теперь в этом нет необходимости. В некоторых системах эмулятор при запуске может потребовать перестроить параметры таймера высокого разрешения – «Could not configure /dev/rtc to have a 1024 Hz timer...». Тогда выполняем команду:

$ sudo sh -c "echo 1024 > /proc/sys/dev/rtc/max-user-freq"

В Ubuntu 8.04 по умолчанию его значение равно 64, но QEMU никогда не жаловался. Идем дальше. Для установки гостевой ОС сначала нужно создать виртуальный диск:

$ qemu-img create test-disk 4G

Хотя можно сделать это и при помощи dd:

$ dd of=test-disk bs=1024 seek=4194304 count=0

Правда, есть отличие: утилита dd позволяет создать только raw-образ, который представляет собой файл, заполненный нулями. Утилита qemu-img поддерживает несколько форматов, указать на которые можно при помощи параметра '–f'. По умолчанию создаются qcow-файлы (qemu Copy On Write). Этот формат поддерживает шифрование (AES, 128 бит) и компрессию, но возможны еще raw, cow (User Mode Linux), vmdk (VMWare) или cloop (сжатый loop, обычно используемый на LiveCD). Многие предпочитают использовать raw. Этот формат не поддерживает сжатие, но если образ находится на разделе с файловой системой, поддерживающей дыры (holes), например ext2/3, то сжатие будет обеспечено драйвером ФС. И у этого способа есть еще один несомненный плюс – можно монтировать в дерево ФС и работать как с обычным дисковым разделом. Использовав параметр info, можно получить информацию о готовом образе. Утилита qemu-img поддерживает параметр convert, позволяющий преобразовывать образы из одного формата в другой:

$ qemu-img convert –f cow cowimage.cow image.raw

Теперь запустим виртуальную машину уже с жестким диском:

$ qemu -hda test-disk -cdrom ubuntu-8.04-desktop-i386.iso \
-m 512 -boot d -localtime

Эмулятор поддерживает до четырех виртуальных жестких дисков, которые обозначаются аналогично линуксовым от hda до hdd, и 2 флоппи-диска – fda и fdb. Но использовать '-hdc' и '-cdrom' одновременно нельзя. Если используется только один образ диска, параметр hda можно опустить:

$ qemu test-disk

Параметр '-boot' так же, как и в реальной машине, позволяет указать приоритет загрузки. Доступно четыре варианта:

  • boot a – загрузка с виртуального флоппи;
  • boot c – загрузка с жесткого диска (по умолчанию);
  • boot d – загрузка с CD-ROM;
  • boot n – сетевая (Etherboot) загрузка.

Параметр '–localtime' позволяет указать на использование локального времени в виртуальной машине. Теперь обычным образом устанавливаем операционную систему на жесткий диск и после перезагрузки используем уже:

$ qemu test-disk -m 512 -localtime

Чтобы виртуальная система стартовала сразу в полноэкранном режиме, добавь ключ '-full-screen'; переключение производится при помощи комбинации <Ctrl+Alt+F>. В некоторых гостевых ОС, возможно, потребуется отключить ACPI флагом '-no-acpi'.

В зависимости от установок родительской ОС, в процессе запуска иногда появляется сообщение о том, что эмулятор не может получить доменное имя. Самым простым выходом будет добавить опцию '-dummy-net', активирующую поддельный сетевой стек. Но при этом гостевой системой не будут приниматься и отправляться пакеты:

$ qemu -dummy-net -cdrom /dev/cdrom

Продвинутые возможности

По умолчанию эмулируется одно ядро. Чтобы увеличить число процессоров, используем параметр '-smp' с указанием их количества. Правда, в некоторых случаях это приводит к замедлению эмуляции, да и пытаться создать несколько виртуальных процессоров на компьютере с одним CPU бессмысленно.

При запуске qemu эмулирует ту же аппаратную среду, в которой он запускается. При запуске на i386 будет «подражать» i386, на x86_64 — 64-битной системе. На PowerPC будет запущен еще один PowerPC компьютер и т.д. Когда необходима эмуляция системы отличной архитектуры, то запускаем специальную версию утилиты. Доступные варианты можно найти, набрав в консоли qemu и нажав табуляцию в bash (qemu-system-ppc, qemu-system-sparc и другие). Помимо стандартных PC и ISA PC (без шины PCI), QEMU может эмулировать и другие аппаратные платформы, несвязанные с персональным компьютером – такие, как АРМ Versatile или платы на основе MIPS. Вывести полный список поддерживаемых платформ можно при помощи ключа «-M ?». Чтобы изменить платформу pc на ISA-only PC, достаточно набрать:

$ qemu -M isapc -hda test-disk -m 512

По умолчанию звуковая система не активируется. Придется это сделать самостоятельно, добавив '-enable-audio'. Получить список поддерживаемых аудиоподсистем можно при помощи параметра '-audio-help', а список звуковых карт – «-soundhw ?». Самое простое – это активировать все звуковые драйверы:

$ qemu -soundhw all -hda test-disk

Модуль kqemu может работать в двух режимах: «for user code» и «for user and kernel code». Первый режим устанавливается по умолчанию, и его использование проблем не вызывает (если при запуске ОС в этом режиме возникли проблемы – можно, чтобы не выгружать модуль kqemu, просто отказаться от его использования при помощи параметра '-no-kqemu'). Второй режим – более быстрый и активируется при помощи ключа '-kernel-kqemu'. Но учти, с некоторыми гостевыми ОС он не дружит. Кроме того, скорость работы зависит от версии ядра гостевой системы и нескольких других параметров.

Для поднятия виртуального сетевого tap/tun-интерфейса (в ядре должен быть включен параметр CONFIG_TUN) qemu по умолчанию использует скрипт /etc/qemu-ifup. Если таковой не обнаруживается, то эмулятор самостоятельно выбирает параметры. В простейшем случае скрипт /etc/qemu-ifup выглядит так:

#!/bin/sh
sudo /sbin/ifconfig $1 192.168.0.100

Теперь делаем скрипт исполняемым (chmod +x) и запускаем эмулятор:

$ qemu test-disk -net nic,vlan=0 -net tap,vlan=0

Первая часть команды (-net nic,vlan=0) создаст сетевую карту в виртуальной машине, подключив ее к виртуальной сети 0, вторая (-net tap,vlan=0) поднимет tap-интерфейс на хост компьютера и подключит его к виртуальной сети 0. Адрес для tap-интерфейса будет взят из /etc/qemu-ifup. Адрес сетевой карты настраивается стандартными средствами гостевой ОС и должен находиться в той же подсети, что и tap (например, 192.168.0.101). Аналогичным образом можно добавить любое количество сетевых карт. Параметр '–macaddr' позволяет задать МАС-адрес первого сетевого интерфейса. МАС-адреса остальных будут инкрементированы автоматически.

Если на основной системе установлен Samba сервер, то гостевая система может общаться с основной через расшаренные ресурсы. Для этого используется замечательная опция '–smb' с указанием каталога:

$ qemu test-disk –smb /mnt/qemu -net nic,vlan=0 -net tap,vlan=0

Аналогично можно активировать и встроенный tftp-сервер, добавив при запуске команду «–tftp каталог». При этом все файлы, находящиеся в указанном каталоге, могут быть загружены на гостевую систему. Обменяться информацией между основной и гостевой системами можно и через перенаправление. Формат такой: «-redir [tcp|udp]:host-port:[guest-host]:guest-port». Запускаем эмуляцию с этой опцией:

$ qemu test-disk -redir tcp:1234::23

Теперь пробуем подключиться к telnet-порту на гостевой системе:

$ telnet localhost 1234

Просто и функционально

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

Графические тулзы

Управление QEMU производится исключительно из командной строки. Упростить задачу можно при помощи скриптов, записав все команды в файл. В Сети реально найти десяток проектов, предлагающих различные интерфейсы. Название одного из проектов совпадает с именем модуля – KQEMU (kqemu.sf.net). С его помощью можно легко настроить виртуальный ПК, просто выбирая нужное из меню, как это делается в VMWare. В KQEMU доступен выбор и монтирование дисков, настройка сети, создание скриптов для запуска настроенной виртуальной машины из командной строки. Еще одно решение – QtEmu (qtemu.org) – построено на Qt-библиотеках. Оно будет полезно тем, кто хочет, не рискуя, протестировать новую ОС. В Qemulator (qemulator.createweb.de) доступен удобный мастер создания виртуальных машин. Есть в этом списке и веб-интерфейс, предлагаемый проектом Qemudo (qemudo.sf.net). C его помощью можно создавать машины и удаленно управлять многочисленными VM.

Эти и некоторые другие приложения есть в репозитариях дистрибутивов. Например, можно установить несколько решений введя в Ubuntu:

$ sudo apt-get install qemu-launcher qtemu qemulator qemuctl

Работа через KVM

QEMU может использовать для работы KVM. При этом не требуется kqemu и наблюдается хорошая производительность. Для начала проверим поддержку этой технологии ядром:

$ egrep '^flags.*(vmx|svm)' /proc/cpuinfo

В современных дистрибутивах она обычно присутствует, так что делать ничего не придется. Устанавливаем пакет kvm (qemu уже есть). Загружаем нужный драйвер. У меня AMD, поэтому:

$ sudo modprobe kvm-amd

Если проц от Intel, то:

$ sudo modprobe kvm-intel

А дальше уже создаем виртуальные машины обычным образом.

Консоль управления QEMU

QEMU предоставляет возможность управлять своей работой и получать информацию из специальной консоли. Чтобы ее вызвать, нажми комбинацию <Ctrl+Alt+2>. Теперь, используя разные команды (полный список которых доступен по help), можно добавить новое устройство, когда ОС уже загружена, сохранить (savevm имя_файла) или загрузить (loadvm) состояние виртуальной машины – и многое другое. Например, чтобы добавить CD-ROM, достаточно ввести «change cdrom /dev/cdrom». Использовав параметр info, мы узнаем о режиме или состоянии того или иного компонента. Например, «info kqemu» выведет режим, в котором находится модуль. Обратно в гостевую ОС можно вернуться, нажав <Ctrl+Alt+1>.

INFO

  • Автор QEMU – французский программист Фабрис Беллар, создатель популярной библиотеки libavcodec, на базе которой были созданы такие программы, как FFmpeg, ffdshow, MPlayer, VideoLAN и др.
  • QEMU может работать в двух режимах: как полноценная виртуальная машина или как машина, позволяющая запускать программы, откомпилированные под другую платформу.
  • QEMU поддерживает управление по протоколу VNC.

WWW

Сайт проекта находится по адресу www.qemu.org.

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

Запуск Linux для процессоров ARM в окружении QEMU: dreamcatcher.ru/docs/linux_arm_qemu.html.

Содержание  


ВИДЕО К ЭТОМУ НОМЕРУ

Найдем и захватим!
В этом веселом и по настоящему стебном ролике ты увидишь, как свиду серьезный проект FRB может пропустить в админку любого желающего. Мы, как интеллигентные люди, зарегистрируемся, ничего не возьмем, а лишь поставим себе звание администр...

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

Шарим гигабайтами
В ролике рассказывается о легальном увеличении объема шары в p2p сетях на примере популярного обменника Direct Connect. Все, что нам понадобится - компилятор и пара стандартных виндовых функций. "На десерт" будет предложен боле...

Глумимся над Ecard
Наглядный пример трудно обнаруживаемой фрагментированной SQL-инъекции. Elekt демонстрирует уязвимую конфигурацию Coppermine Photo Gallery и пишет эксплоит, автоматизирующий получение данных....

Тотальная слежка
Задача проекта Nagios – разработка свободной системы мониторинга компьютерных систем и сетей. Такая система следит за узлами или службами и в случае возникновения проблем (например, служба не отвечает) оповещает администратора. Nagios пр...

Наш ответ Грузии
В этом ролике ты увидишь, как был взломан один из крупных грузинских информационных ресурсов. Сначала хакер находит бажный скрипт, затем с помощью SQL-инъекции и собственного perl-скрипта, сливает список таблиц из БД сервера. Далее, взло...

Незаменимый помощник хостера
Панель управления хостингом ispCP предоставляет администраторам удобный интерфейс для управления виртуальными узлами. Используя ее, можно управлять настройками Apache2 с PHP5, Bind9, MySQL, Courier, Procmail, Postfix, Postgrey, ProFTPd,...





Предыдущие номера


    Rambler's Top100