Ads 468x60px

воскресенье, 29 января 2012 г.

Использование Qemu в Debian squeeze.

Для проведения различных экспериментов хорошо иметь подопытную систему. Для этого существует множество эмуляторов, я выбрал qemu с kvm расширением, позволяющим значительно ускорить ее работу.
Установка стандартно для Debian. 
$ sudo aptitude install qemu qemu-kvm qemu-utils
Отдельно отмечу, что в моем дистрибутиве так же установились bridge-utils - в последствии используются для настройки сети для гостевой системы.
Создание образа жесткого диска.
$ qemu-img create [-f fmt] [-o options] filename [size]
,где
-f fmt - формат файла образа, список поддерживаемых форматов можно просмотреть так:
$ qemu-img -h | grep Support
-o options опции, для каждого формата свои, просмотр набора опций для выбранного формата:
$ qemu-img create -f qcow2 -o ?
qcow2 - формат использует только то пространство, которое занимают файлы на виртуальном жестком диске, а также поддерживает создание снимков и шифрование. В итоге получаем следующую команду:
$ qemu-img create -f qcow2 -o size=4G debImg.qcow2
При этом созданный файл будет занимать порядка 250Kb, а виртуальной машине будет доступно 4Gb.
Сеть.
Для организации доступа qemu-машины во внешний мир, необходимо создать сетевое соединение типа мост, включив в него сетевую карту host-машины и tap интерфейс, который будет использоваться виртуальной.
Создадим скрипт для старта моста brstart следующего содержания:
#!/bin/bash
brctl addbr br0 # создаем мост
brctl addif br0 eth0 # добавляем к мосту физический интерфейс
ifconfig eth0 down # деактивируем физический интерфейс
ifconfig eth0 0.0.0.0 up # активируем физический интерфейс без адреса
dhclient br0 # получаем ip адрес для моста через dhcp
# или
# ifconfig br0 192.168.0.100 up # присваиваем статический 
Делаем скрипт исполняемым и пробуем стартовать:
$ chmod 700 brstart
$ sudo ./brstart
Если все прошло удачно должны получить примерно следующую картину:
$ sudo brctl show
bridge name    bridge id                       STP enabled    interfaces
br0                  8000.00137760992e    no                    eth0

$ sudo ifconfig
br0       Link encap:Ethernet  HWaddr 00:13:77:60:99:2e 
          inet addr:192.168.1.103  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::213:77ff:fe60:992e/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:72 errors:0 dropped:0 overruns:0 frame:0
          TX packets:36 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:6079 (5.9 KiB)  TX bytes:4988 (4.8 KiB)

eth0      Link encap:Ethernet  HWaddr 00:13:77:60:99:2e 
          inet6 addr: fe80::213:77ff:fe60:992e/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3109 errors:0 dropped:0 overruns:0 frame:0
          TX packets:386 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:292171 (285.3 KiB)  TX bytes:78267 (76.4 KiB)
          Interrupt:17 
Теперь  необходимо установить пакет uml-utilities, в который входит утилита для управления tap интерфейсом.
$ sudo aptitude install uml-utilities
Сам скрипт для создания tap интерфейса tapup:
#!/bin/sh

#Script for creating new tap interface and appending it to the existing bridge
#Usage: tapup [UID_of_interface] [owner]
#(c) Evgeniy Shumilov (corpse@permlug.org)
#(c) modify by felis-lybica (felis-lybica.blogspot.com)

if [ -n "$1" ]; then

if [ -n "$2" ]; then
iface=`tunctl -b -u $2`
ifaceg=`id -ng $2`
else
iface=`tunctl -b`
ifaceg=`id -ng`
fi

chown root:$ifaceg /dev/net/tun
/sbin/ifconfig $iface 0.0.0.0 promisc up
brctl addif $1 $iface
echo $iface
sleep 2

fi
И снова, делаем скрипт исполняемым и пробуем стартовать, на выходе должны получить имя нового интерфейса:
$ chmod 700 tapup
$ sudo ./tapup br0 user
tap0
Запуск.
На данный момент все готово что бы запустить виртуальную машину с выходом в сеть. Начальный старт с загрузкой с установочного CD (пусть это будет debian-6.0.3-i386-netinst.iso) выглядит так:
$ qemu -hda disk.qcow -m 256 -cdrom  debian-6.0.3-i386-netinst.iso -boot d -net nic,model=rtl8139,macaddr=00:00:00:00:00:01 -net tap,ifname=tap0,script=no
Последующие старты
$ qemu -hda disk.qcow -m 256 -boot c -net nic,model=rtl8139,macaddr=00:00:00:00:00:01 -net tap,ifname=tap0,script=no
, где -m <значение в мегабайтах> выделение оперативной памяти
-boot <d/c> - загрузка с cdrom/hda
-net +параметры указывают на тип сетевого адаптера в виртуальном окружении и устройство используемое для его подключения в реальной системе.
Примечания.
Не совсем удобно когда запущено окно виртуальной машины, а так же систематическое ctrl+alt для выхода мышки из этого окна. Поэтому удобнее запускать qemu с выводом на vnc дисплей, с последующим подключением через vncviewer. Вначале установим пакет для подключения:
# sudo aptitude install xtightvncviewer
Теперь можно стартовать qemu с vnc опцией:
$ qemu -hda disk.qcow -m 256 -boot c -vnc :1 &
, доступ к экрану будет таким:
$ vncviewer :1
Для организации подключения qemu к сети использовался материал:  Эмуляция виртуальных хостов с использованием QEMU под windows и linux, аспекты настройки сети.

2 комментария:

Роман Максимов комментирует...

у меня такой вопрос.. через ipkg install qemu поставил эмулятор на wd my book live.. ввожу в терминале shh "qemu -localtime -m 4 -boot c -hda /shares/Public/Downloads/winme/C.img -vnc :1 &
" а он мне пишет qemu: invalid option -- '-vnc'... это как то лечиться? или без настройки сети эмулятор qemu не запустит vnc server?

felis-lybica комментирует...

Доброго времени суток, Роман.
Не совсем понятно какая операционная система, а так же вынужден сказать, что мне не приходилось использовать и настраивать сетевые накопители. В моем случае команда:
qemu --help | grep vnc
выдает:
-vnc display start a VNC server on display
или оставьте свои контакты попробуем совместно решить вопрос.