QEMU

Материал из Xgu.ru

Перейти к: навигация, поиск
stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.

Если вы считаете, что её стоило бы доработать как можно быстрее, пожалуйста, скажите об этом.


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

Поддерживаемые эмулируемые (target) архитектуры:

  • x86,
  • x86_64,
  • ARM,
  • SPARC,
  • PowerPC,
  • MIPS,
  • m68k (Coldfire),
  • SH-4.

В процессе разработки находятся:

  • SPARC64,
  • PowerPC64,
  • Alpha,
  • CRIS.

В режиме виртуализации QEMU использует специальный модуль KQEMU, позволяющий исполнять код гостевой операционной системы непосредственно на процессоре хост-системы. В таком режиме поддерживается только архитектура x86. Начиная с версии 0.12.0, QEMU не поддерживает KQEMU.

QEMU обладает ещё одной интересной возможностью — он позволяет исполнять бинарный код, подготовленный для одной архитектуры, на процессоре другой архитектуры (работает только с linux в качестве host-ОС). Например, можно на PowerPC (попробовать) запускать Linux-программы, откомпилированные для x86, или Windows-программы (win32) через Wine.

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

Содержание

[править] Инсталляция QEMU

Эмулятор qemu можно установить принятым в дистрибутиве способом.

Например, для Debian GNU/Linux:

%# apt-get install qemu

Элементарные операции доступны сразу же после установки.

Например, запустить в эмуляторе LiveCD:

%$ qemu -cdrom knoppix.iso

Ещё можно делать так:

Создаём образ диска
 %$ qemu-img create Arch.img 1024M 
Инсталлируем систему
 %$ qemu -cdrom archlinux-200x.xx-x.iso -boot d Arch.img

Обратите внимание, что программа может запускаться от имени обыкновенного пользователя, не суперпользователя.

Чтобы QEMU отпустил захваченную мышь, нужно нажать Ctrl-Alt.

[править] kqemu

kqemu — модуль ядра Linux, который позволяет напрямую передавать инструкции эмулируемой системы процессору хост-системы, что существенно повышает производительность.

Чтобы использование kqemu было возможно, необходимо:

  • доступен и загружен модуль ядра kqemu;
  • qemu исполняется от имени суперпользователя;
  • qemu исполняется не в паравиртуальном домене Xen.

Icon-caution.gif

Модуль kqemu не работает в паравиртуальных доменах Xen, включая домен 0.

При условии выполнения всех этих требований, kqemu при запуске qemu включается автоматически.

Инсталляция в Debian:

%# apt-cache search kqemu
%# apt-get install kqemu-modules-2.6-686
%# modprobe kqemu

[править] Графика и консоль в QEMU

[править] Консоль

Можно запустить эмулятор/виртуальную машину без эмуляции графического интерфейса. Предполагается, что взаимодействие с ней будет выполняться через последовательный порт (который будет подключен к терминалу, на котором вызывается qemu):

qemu -m 256 -hda test01.img -nographic

При этом Linux ядру виртуальной машины должны передаваться параметры:

console=ttyS0

В файле /etc/inittab должна присутствовать строка:

S0:2345:respawn:/sbin/mingetty ttyS0

или аналогичная.

Если же нет возможности передать дополнительные параметры ядра пользуясь загрузчиком, то можно вызвать qemu сразу с ядром и initrd:

 qemu -nographic -kernel ./bzImage -hda ./test01.img -append "root=/dev/sda console=ttyS0"

[править] Сеть в QEMU

тихо-тихо идёт
пинг изнутри
qemu

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

Например, в хост-системе создан мост и к нему подключен интерфейс:

%# brctl show
...
br0             8000.001a4d80ce78       no              peth0
...

Тогда, если использовать такой скрипт и способ запуска qemu, эмулятор будет подключен к этому мосту, и его единственный сетевой интерфейс будет смотреть в общую сеть (туда, куда смотрит интерфейс peth0).

Файл /etc/qemu-ifup

#!/bin/sh
bridge=br0

echo "Executing /etc/qemu-ifup"
echo "Bringing up $1 for bridged mode..."
sudo /sbin/ifconfig $1 0.0.0.0 promisc up
echo "Adding $1 to $bridge..."
sudo /usr/sbin/brctl addif $bridge $1
sleep 2

Файл должен быть исполняемым:

%$ chmod +x qemu-ifup

Запуск:

%# qemu -hda haiku.img -boot c -net nic,vlan=0 \
        -net tap,vlan=0,ifname=tap0,script=/etc/qemu-ifup -m 256 -localtime

Запускать нужно от root'а, потому что иначе могут возникнуть проблемы с доступом к устройству /dev/net/tun.

Tip-icon.gif

Здесь ключевое слово vlan обозначает виртуальный коммутатор внутри процесса QEMU, который не имеет прямого отношения к VLANам в привычном понимании этого слова.

Здесь вместо haiku.img должен быть указано имя файла, содержащего исполняемый образ.

Дополнительная информация:

Обратиться по сети к машине, работающей внутри QEMU можно не обзятально создавая дополнительные интерфейсы в хост-системе:

   $ qemu-system-x86_64 Platte.img -net nic -net user,hostfwd=tcp::12345-:22

В данном случае порт 12345 в хост системе отражается на порт 22 гостевой системы. Сетевой интерфейс гостевой системы конфигурируется с помощью встроенного DHCP-сервера.

Пробросить порт в обратную сторону можно с помощью `guestfwd`:

   guestfwd=tcp:10.0.2.100:49999-tcp:127.0.0.1:49999

В этом случае при обращении изнутри гостевой системы на 10.0.2.100:49999 обращение будет перенаправлено на 127.0.0.1:49999 внешней системы.

Другой способ — использовать опцию redir:

   -redir tcp:12345::22

Дополнительная информация по теме (QEMU + Socket):

[править] USB в QEMU

Knoppix внутри QEMU. Проброшено USB-устройство

Поддержка USB в QEMU включается при помощи ключа -usb.

Вы можете пробросить устроуйство внутрь машины QEMU при помощи ключа -usbdevice.

Например, вы хотите пробросить GPS-навигатор Garmin, который подключается через USB к хост-системе:

В хост-системе выполняете:

%# lsusb
Bus 001 Device 004: ID 091e:0003 Garmin International GPSmap (various models)

При вызове qemu указываете идентификатор устройства:

%# qemu -usb -usbdevice host:091e:0003

Icon-caution.gif

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


В версиях QEMU до 0.13.0 буфер для управляющих сообщений имеет размер 2048 (или 1024 в более старых версиях) байт, чего недостаточно для некоторых USB-устройств. Отсутствие проверки вызывает "падение" QEMU при работе с такими устройствами с сообщением "husb: ctrl buffer too small" Решается вопрос маленьким патчем: http://www.mail-archive.com/qemu-devel@nongnu.org/msg24074.html Та же проблема актуальна для qemu-kvm, и qemu-dm используемого в Xen.

[править] С чем можно поиграться в QEMU

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

Многие из этих проектов можно посмотреть и поиграться с ними с помощью QEMU.

  • LiveCD — любой LiveCD скачивается и запускается в QEMU. Не требует никаких дополнительных операций по подготовке. Очень удобно для проверки диска, для изучения его возможностей.
  • OLPC — возможно вы слышали об OLPC и хотели бы на него посмотреть. Проще всего это сделать при помощи QEMU. Образы здесь [1]. Используйте образ ext3, не JFFS!
  • OpenMoko — Образы для эмуляции здесь [2].

[править] Дополнительная информация

Сеть в QEMU:

Эмуляция различных архитектур:

[править] Материалы по эмуляторам на Xgu.ru

Эмуляторы сетей:

  • WANEM — эмулятор WAN
  • IMUNES (An Integrated Multiprotocol Network Emulator / Simulator)
Источник — «http://xgu.ru/wiki/QEMU»