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*.