QEMU
Материал из Xgu.ru
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.
Модуль 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
Один из способов соединить эмулируемую машину и общую сеть — использовать виртуальный мост 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.
Здесь ключевое слово vlan обозначает виртуальный коммутатор внутри процесса QEMU, который не имеет прямого отношения к VLANам в привычном понимании этого слова. |
Здесь вместо haiku.img должен быть указано имя файла, содержащего исполняемый образ.
Дополнительная информация:
- Networking QEMU Virtual BSD Systems (англ.) хорошая схема внутреннего подключения внутреннего DHCP-сервера в QEMU
- http://qemu-buch.de/cgi-bin/moin.cgi/QemuAndSlirp
Обратиться по сети к машине, работающей внутри 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):
- http://unix.stackexchange.com/questions/124681/ssh-from-host-to-guest-using-qemu
- http://wiki.qemu.org/Documentation/Networking (искать по слову Socket)
- http://www.h7.dion.ne.jp/~qemu-win/HowToNetwork-en.html
- http://secomputing.co.uk/2012/02/21/Forwarding-ports-to-KVM-clients/
- http://qemu-buch.de/de/index.php?title=QEMU-KVM-Buch/_Netzwerkoptionen/_Virtuelle_Netzwerke_konfigurieren (нем.)
[править] USB в QEMU
Поддержка 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
Важно чтобы в хост-системе не был загружен драйвер того устройства, которое пробрасывается внутрь эмулятора. Его можно выгрузить вручную, но лучше занести его в 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 - установка и первые впечатления - заметка в блоге "Записки дебианщика" (рус.)
- Документация пользователя эмулятора процессора QEMU (рус.)
- Hardware virtualization with QEMU (англ.)
- http://qemu-buch.de/ (нем.) и частично (англ.)
Сеть в QEMU:
- QEMU and TUN/TAP networking (англ.)
- QEMU - Debian - Linux - TUN/TAP - network bridge (англ.)
- qemu bridged to Ethernet (англ.)
- Setting up your own internal network w/ qemu. (англ.)
- How to use Network in QEMU (англ.)
- QEMU Networking (англ.)
Эмуляция различных архитектур:
- HPPAQEMU — HPPA Host and Target Support for QEMU (PA-RISC)
- Debian on an emulated ARM machine (англ.)
[править] Материалы по эмуляторам на Xgu.ru
Эмуляторы сетей: