AllInfo
Main: Info Blog Temp Mail


unix 2013-01-12 20-03-42

QEMU - эмулятор процессора.


Долгое время для работы с виртуальными машинами я сам пользовался купленной vmware и бесплатным vmplayer. Однажды обнаружил, что QEMU ( www.qemu.org ) отличная программа - виртуализатор для других систем. Причём оказалось, что она нормально и не конфликтуя с основной системой, вполне понятно работает с USB-устройствами. Мне не удалось достичь такой понятности в VMPlayer, а в VirtualBOX OSE просто вы не можете работать с USB-устройствами.

Некоторые замечания в этом документе будут упоминать kvm. Это другой виртуализатор, который базируется на qemu и совместим на уровне команд с qemu.



- Сам пакет должен быть установлен: "apt-get install qemu", либо взят с сайта, сконфигурирован и установлен.
- Ядерный модуль-ускоритель kqemu должен быть загружен ("modprobe kqemu") (если необходимо, то его надо скомпилировать для текущего ядра).
Взять его можно на официальном сайте http://bellard.org/qemu/
Чтобы непривилегированный пользователь мог воспользоваться модулем-ускорителем проще всего дать устройству /dev/kqemu все права ("chmod 777 /dev/kqemu")
Чтобы он автоматом загружался при старте системы, добавьте в /etc/modules строку:
kqemu
Чтобы права доступа автоматом давались всем пользователям при перезагрузке, вставьте "chmod ..." в /etc/rc.d/rc.local



Примеры использования



- Выделение файла в основной системе, который будет диском в виртуальной системе:
qemu-img create winXP.qcow2 -f qcow2 4096M
Здесь мы выделили файл размером в 4Гб. Формат файла - qcow2 (оптимальный, расширяет файл по мере надобности)


- Запуск установки Windows на виртуальной машине с CD-ROMа:
qemu -m 256 -hda winXP.qcow2 -cdrom /dev/cdrom -boot d -localtime -smp 4

Память виртуальной машины 256Мб,
Для 1-го диска(hda) виртуальной машины используем файл winXP.qcow2,
В качестве CD-ROM виртуальной машины используем устройство /dev/cdrom. Если вам удобнее использовать ISO-образ, то вместо /dev/cdrom укажите имя файла с образом.
Загрузочное устройство виртуальной машины - CD-ROM, это ключ "-boot d"
Часы реального времени установить в соответствии с временем локальной машины.
Процессоров на виртуальной машине будет 4.



Работа с USB:


в командной строке следует указать -usbdevice host:058f:6387 и у вас будет подключено в виртуальной машине это устройство.
Предварительно, конечно, должна быть смонтирована usbfs. Примерно так:

mount -t usbfs none /proc/bus/usb
ID устройства можно получить командой lsusb.
Предварительно следует сделать USB-устройства доступными QEMU, запущенному из под обычного юзера. Для этого из под рута грубо делаем:

chmod -R 777 /proc/usb/bus/* и chmod -R 777 /dev/bus/usb/*




Настройка сети для QEMU:


- В системе должен быть загружен драйвер tun. Он есть в ядре.
Загрузить его в запущеной системе: "modprobe tun".
Для того, чтобы он автоматически загружался после перезапуска в /etc/modules добавляется строка:

tun

- Установить пакет bridge-utils : "apt-get install bridge-utils"

- При перезагрузке должен быть сделан мост из реального ethernet-контроллера (eth0) и псевдо ethernet-контроллера (tap1).
Если Ethernet-устройство называется eth0 и имеет адрес 192.168.1.1, то команды создания моста следующие:

# Отключим eth0
ifconfig eth0 0.0.0.0 promisc

# Создаём псевдо ethernet-интерфейс tap1 и отдаём права на него юзеру "arc"
tunctl -t tap1 -u arc
ifconfig tap1 0.0.0.0 up

# Создадим мост br0

brctl addbr br0



#Добавим в мост eth0

brctl addif br0 eth0

# В этот же мост добавим tap1
brctl addif br0 tap1
# Назначим IP мосту (обычно это тот адрес, что раньше был у нашего физического интерфейса eth0)

ifconfig br0 192.168.1.1 netmask 255.255.255.0 up

- Запуск QEMU с поддержкой сети выглядит так:
qemu winXP.qcow -boot c --localtime -net tap,ifname=tap1,script=no -net nic



В самой гостевой системе стандартными средствами системы назначаем её ethernet-контроллеру нужный нам IP-адрес.



Одновременная работа с сетью нескольких гостевых систем



Для каждого интерфейса в каждой гостевой системе следует создать отдельное устройство псевдо ethernet-контроллера (TAP) и добавить его в мост. Пример:

...
tunctl -t tap1 -u arc

ifconfig tap1 0.0.0.0 up
tunctl -t tap2 -u arc

ifconfig tap2 0.0.0.0 up
...

brctl addif br0 tap1

brctl addif br0 tap2

...



Если не предпринять ничего дополнительно, то интерфейсы гостевых систем будут иметь MAC-адрес реального ethernet-контроллера eth0, который является частью моста. В результате IP-пакеты между гостевыми машинами ходить не будут. Чтобы этого избежать, при старте виртуальной машины следует указать свой собственный MAC-адрес для каждого TAP-интерфейса. Пример:

qemu sys1.qcow -boot c -net tap,ifname=tap1,script=no -net nic,macaddr=00:00:00:00:00:01

qemu sys2.qcow -boot c -net tap,ifname=tap2,script=no -net nic,macaddr=00:00:00:00:00:02





Замечание для Linux с UDEV:
UDEV запоминает MAC-адрес и в соответствии с ним присваивает имя сетевому интерфейсу.

В моём случае с AltLinux-ом соответствие прописано в файле /etc/udev/rules.d/70-persistent.net.rules.

Если вы поменяете MAC при старте kvm, udev пропишет в этот файл дополнительное устройство и даст ему имя eth1. Последующие скрипты (обычно это подсистема etcnet), инициализирующие сеть, вряд ли смогут справиться с этим переименованием. Так что, если поменяли MAC, правьте xxx.net.rules.





Несколько интерфейсов в гостевой системе:

Можно использовать до 6 интерфейсов в гостевой системе. Их создание в командной строке:

qemu ... -net tap,ifname=tap0,script=no -net nic -net nic ... -net nic



Если необходимо использовать разные сетевые интерфейсы хоста для разных интерфейсов гостя, используется опция vlan:
qemu ... -net tap,ifname=tap0,script=no,vlan=0 -net tap,ifname=tap1,script=no,vlan=1 -net nic,vlan=0 -net nic,vlan=1





Очень полезные фишки:

- Можно запустить гостевую систему без графики в хост-системе. Т.е. вам не нужно запускать X-сервер. Ключ -nographics.

- Можно оставить графику в фоне и иметь к ней доступ через VNC. Пример ключа: -vnc :2
:2 - это номер графического дисплея, к которому надо будет цепляться с помощью vncviewer.

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

-usbdevice tablet


- Вот пример команды с запуском без графики и с доступом через VNC:

qemu sys1.qcow -boot c -nographics -vnc :3 -usbdevice tablet


В данном примере экран виртуальной машины будет доступен через команду:
vnccliennt hostname:3

, где hostname - имя компьютера, где вы запустили виртуальную машину.





Оптимизация скорости работы виртуальной машины:


Если всё делать стандартно, скорость сети у меня получалась на уровне 1Mбайт/сек.

Лечится эта проблема так:

В гостевой системе (Linux) подключаете модули: virtio virtio_pci virtio_ring virtio_net virtio_blk

Я это сделал в rc.local (указал modprobe для каждого по очереди).

Запускаете виртуальную машину с поддержкой сети так:
kvm -drive file=linuxguest.qcow,if=virtio -boot c --localtime -net tap,ifname=tap1,script=no -net nic,model=virtio



На 100 мегабитной сети скорость в виртуальной машине у меня не уступала скорости работы сети на хост-системе.



Модули virtio есть и для Windows. Скачивайте из Интернета.

Основная ссылка для модулей: http://alt.fedoraproject.org/pub/alt/virtio-win/latest/images/bin/

Пред. версия драйверов, которые без проблем у меня заработали в гостевой Win XP: http://autosetup1.googlecode.com/files/virtio-win-1.1.16.vfd



ЗАМЕЧАНИЕ: В сентябре 2009 для того, чтобы kvm работал стабильно и скорость сети была шустрой (8-11Mb/sec), пришлось сделать следующее:

- Пересобрать и поставить в хост системе kvm версии 88. Ядерные модули kvm не строить из этого дистрибутива, а взять из ядра.
- Пересобрать и поставить в гостевую систему ядро с www.kernel.org 2.6.31. Там много правок для подсистемы virtio*.
- Запустить kvm без параметра для сети "...,model=virtio". Иначе kvm при хорошей сетевой нагрузке выпадал.

- Обязательно подгрузить в гостевой системе драйвера virtio*.

3.145.88.241 / 2024-12-22_20-05-22 UTC.