QEMU во FreeBSD-9.0-RELEASE-amd64

в 14:45, , рубрики: FreeBSD 9.0, qemu, виртуализация, системное администрирование, метки: , ,

Задача: Запустить, настроить n (в примере будем запускать 3) qemu машин с ОС ubuntu-12.04.1-server-amd64-1шт. и FreeBSD-9.0-RELEASE-amd64. Версия amd64 является рекомендованной разработчиками ubuntu.

1. Инсталляция (Не забываем обновить порты товарищи BSD'дельники)


main [16:54:emulators/qemu]# cd /usr/ports/emulators/qemu                                                 
main [16:55:emulators/qemu]# make install clean
                                                                  

Итак:


main [17:25:emulators/qemu-devel]# pkg_info | grep «qemu»                                                 
kqemu-kmod-devel-1.4.0.p1_5 Kernel Accelerator for QEMU CPU Emulator (development versi
qemu-0.11.1_11 QEMU CPU Emulator                                                                                
main [17:25:emulators/qemu-devel]# 


                                                                                   
Ускоритель и процессорный эмулятор установлены.

2. Создание рабочего пространства и настройка окружения

main [17:40:/usr/QEMU]#mkdir —p /usr/QEMU/UbuEx1


Скачаем образ загрузочного диска ubuntu-12.04.1-server-amd64.iso с официального сайта. Загружаем модули ядра и добавляем их в loader.conf (создаем при необходимости)


main [17:53:/usr/QEMU]# touch /boot/loader.conf
main [17:53:/usr/QEMU]# echo 'kqemu_load=&aquo;YES»' > > /boot/loader.conf
main [17:53:/usr/QEMU]# echo 'aio_load=&aquo;YES»' > > /boot/loader.conf


kqemu.ko — Модуль акселерации.
aio.ko — Модуль асинхронного ввода-вывода.

Или можно добавить модуль aio в ядро, так же для эмуляции работы в сети нам потребуется устройство tap, а следовательно в ядро необходимо подгрузить следующие модули:


options VFS_AIO
device tap
options IPFILTER
options IPFILTER_LOG

main [17:53:/usr/QEMU]# cd /usr/src
main [17:53:/usr/QEMU]# make buildkernel KERNCONF=< kernel_name >

main [17:53:/usr/QEMU]# make installkernel KERNCONF=< kernel_name >

main [17:53:/usr/QEMU]# shutdown —r now


Если не подгрузить модуль aio.ko то QEMU упадет с криком:


Bad system call: 12 (core dumped)


В том случае если вы планируете налаживание сетевого взаимодействия между хостовой FreeBSD и гостевыми системами необходимо так же загрузить седующие модули:


main [18:14:~]# kldload if_bridge
main [18:14:~]# kldload if_tap


После перезагрузки мы увидим, наши модули как погруженные в ядро:


main [18:22:~]# kldstat
Id Refs Address Size Name
1 28 0xffffffff80200000 1203808 kernel
2 1 0xffffffff81404000 2bdd0 kqemu.ko
3 1 0xffffffff81612000 42a7 linprocfs.ko
4 1 0xffffffff81617000 1e00b linux.ko
5 1 0xffffffff81636000 1582 fdescfs.ko
6 1 0xffffffff81638000 64b00 radeon.ko
7 1 0xffffffff8169d000 13a2b drm.ko
8 1 0xffffffff816b1000 2655 if_tap.ko
9 1 0xffffffff816b4000 55fe if_bridge.ko
10 1 0xffffffff816ba000 353d bridgestp.ko


bridgestp.ko — подгрузился автоматически.

Далее убедитесь что ваша основная шина IDE-master подерживает тенологию DMA (сейчас ее поддерживает большенство архитектур)

Так как неободимые модули ядра уже загружены — продолжим подготовку хостовой ОС к предстоящей настройке сети в гостевой ОС. После загрузки модуля if_tap.ko, среди сисемных переменных появятся те, которые регулируют работу интерфесов tap*. Нас интересует две —


main [19:26:~]# sysctl -a | grep «net.link.tap»
net.link.tap.debug: 0
net.link.tap.devfs_cloning: 1
net.link.tap.up_on_open: 0
net.link.tap.user_open: 0


net.link.tap.up_on_open — переводит интерфес в положение up, когда открыт /dev/ tap. net.link.tap.user_open — позволит пользователям открывать /dev/tap. Для ограничения использования устройств /dev/tap* изменим его владельца и права доступа к нему. Это можно сделать задав правила devfs в файле /etc/devfs.rules, по умолчанию в FreeBSD 9.0 его нет, поэтому создаем.


main [20:12:~]# touch /etc/devfs.rules
main [20:18:~]# echo "[sysqemu=11]" >> /etc/devfs.rules
main [20:17:~]# echo «add path 'tap*' mode 0660 group qemu» >> /etc/devfs.rules


Теперь изменим переменные:


main [20:20:~]# sysctl net.link.tap.user_open=1
net.link.tap.user_open: 0 -> 1
main [20:21:~]# echo net.link.tap.up_on_open=1
net.link.tap.up_on_open=1


Теперь подготовим сеть. Мне необходимо, чтобы ко всем машинам можно было подключиться снаружи по IP и они имели выход в локальную сеть виртуалных машин. Итак необходимо создать bridge интерфейс объеденив в него 3 tap интерфейса.


main [20:54:~]# ifconfig bridge0 create
main [20:54:~]# ifconfig bridge0 addm bfe0 addm tap0 addm tap1 addm tap2 up
main [20:58:~]# ifconfig bridge0
bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
ether 02:a5:80:8e:f1:00
id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
maxage 20 holdcnt 6 proto rstp maxaddr 100 timeout 1200
root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
member: tap2 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
ifmaxaddr 0 port 14 priority 128 path cost 2000000
member: tap1 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
ifmaxaddr 0 port 12 priority 128 path cost 2000000
member: tap0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
ifmaxaddr 0 port 11 priority 128 path cost 2000000
member: bfe0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
ifmaxaddr 0 port 7 priority 128 path cost 200000


Где bfe0 — мой физический интерфейс.

Следующим этапом необходимо создать образ диска, который в дальнейшем мы будем подключать к нашей виртуальной машине. Qemu поддерживает несколько форматов образов, подробно они описаны на страницах man. Я же остановлюсь на родном для qemu и наиболее подходящем для проекта формате qcow2. Его особенность заключается в том, что однажды создав с заранее установленными настройками, в дальнейшем при неохоимости исользовать образ с такими же настройками указываем на исходный образ, и диск новой машины будет в точности совпадать с ним шаблом, однако все изменения вносимые в новый образ не будут записаны в шаблонный. Этот процес в qemu называется cow «Copy On Write». Так же данный форматподдерживат шифрование, создание снепшотов, пиво с девочками и zlib компрессию.
Для того, что бы внести изменения в базовый образ, необходимо воспользоваться командой

commit [-f fmt] filename


main [23:20:QEMU/UbuEx1]# qemu-img create -f qcow2 ubuntu_tamplate.qcow2 7G
main [23:22:QEMU/UbuEx1]# ls -al
total 200
drwxr-xr-x 2 root wheel 512 Sep 22 23:22.
drwxr-xr-x 5 root wheel 512 Sep 21 17:40…
-rw-r--r-- 1 root wheel 262144 Sep 22 23:22 ubuntu_tamplate.qcow2


На этом создание окружеия закончено. Пиступим к запуску эмулятора и установке ОС ubuntu-12.04.1-server.

3. Запуск и устанвка ОС

Рассмотрим синтаксис команды. Не мудрствуя лукаво, разберу наиболее часто необходимые опции.
Общий формат:


main [13:57:QEMU/UbuEx1]# qemu [options] [disk_image]


Для эмулции архитекур отлиных от X86_32 используем команды:

qemu-system-mips qemu-system-ppcemb
qemu-system-mips64 qemu-system-sh4
qemu-system-arm qemu-system-mips64el qemu-system-sh4eb
qemu-system-cris qemu-system-mipsel qemu-system-sparc
qemu-system-m68k qemu-system-ppc qemu-system-sparc64
qemu-system-microblaze qemu-system-ppc64 qemu-system-x86_64

Наиболе часто встречающиеся опции:

1. -smp n

Поддежржка многопроцессорности, n={1..255}, для архитектуры Sparc32 или Linux n={1..4}.

2. -numa opts

Поддержка системы NUMA, неравномерного доступа к памяти где память разделяется между процессорами, что дает выигрыш в производительности.

image

3. -fda file

-fdb file
Использование файла-образа или реального устройства /dev/fd0 — флоппи хоста в качастве флоппи дисковода QEMU машины.

4. -hda file

-hdb file
-hdc file
-hdd file
Использование файла как жесткого диска QEMU машины. В нотации архитектуры x86 -a -b floppy, -c first hdd, -d cdrom

5. -cdrom file

Использование файла-образа как CDROM'а QEMU машины. Нельзя испоьзовать опции -hdc и -cdrom одновременно. Так же можно использовать cdrom хоста /dev/cdrom.

6. -drive option[,option[,option[,...]]]

Определение устройства. Могут подключаться образы как устройства, медиа устройства, определяется возможность создания снэпшотов этих устройств, типов устройств.
Например:
подключеие cdrom
qemu -drive file=file,index=2,media=cdrom
к шине ide
qemu -drive file=file,if=ide,index=1,media=cdrom
не указывая опции file мы пдключаем пустое устройство
qemu -drive if=ide,index=1,media=cdrom

подключение дисков
qemu -drive file=file,index=0,media=disk
qemu -drive file=file,index=1,media=disk
qemu -drive file=file,index=2,media=disk
qemu -drive file=file,index=3,media=disk
подключение floppy дисковода
qemu -drive file=file,index=0,if=floppy
qemu -drive file=file,index=1,if=floppy
подключение SCSI с unit ID=6 bus=0
qemu -drive file=file,if=scsi,bus=0,unit=6

По умолчанию используется интерфейс ide, index инкрементруется.
qemu -drive file=a -drive file=b равнозначно qemu -hda a -hdb b

7. -mtdblock file

-sd file
-pflash file
Разные типы флеш памяти.

8. -boot [order=drives][,once=drives][,menu=on|off]

Опция определяющая порядок загрузки. Drives= a b (flopy) c (hdd) d (cdrom) n (network). -boot order=ac — загрузка сначала с floppy, затем с hdd
-boot once=d — загрузка с cdrom затем перезагрузка

9. -snapshot

Запись шотов во временные файлы вместо образа raw.

10. -m megs

Установка значения памяти RAM. В Гб или Мб.

11. -k language

Таблица языков:
ar de-ch es fo fr-ca hu ja mk no pt-br sv
da en-gb et fr fr-ch is lt nl pl ru th
de en-us fi fr-be hr it lv nl-be pt sl tr
по умолчанию «en-us».

12. -usb

Подключение драйвера USB.
13. -usbdevice devname
Добывене устойства USB. Типы устройств могут быть мышь, планшет, диск и др.

14. -name name

-uuid uuid
Имя гостевой системы. ID гостевой системы.

15. -vga type

Тип VGA карты для эмуляции.
сirrus — поддерживается семейством ОС Windows начиная с Windows 95
std — используется для высоког разрешения. Cirrus и std подойдут в болшенстве случаев.
vmware
none

16. -net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile]

Создание сетевого интерфейса в гостевой системе. Пример из man:

qemu linux.img -net nic,vlan=0 -net tap,vlan=0,ifname=tap0
-net nic,vlan=1 -net tap,vlan=1,ifname=tap1

Мы видим создание нескольких интерфейсов vlan разного типа, с разными именами. -net nic создает pci карту с интерфейсом vlan. -net tap подключат устройство tap хоста к интерфейсу vlan0 и vlan1.

17. -d

Вести лог в /tmp/qemu.log
kqemu.ko
У эмулятора QEMU существует еще множество поленых опций, таких как например редирект физических устройств хоста и другие, описание всех его вкусных свойств выхдит за рамки данной статьи.
Итак, пора запускать VM эталонной машины.


В связи с некоторой нестабильностью работы модуля kqemu.ko в ОС FreeBSD, перед запуском VM, выгружаем этот модуль из памяти на этапе инсталяции гостевой ОС.

main [14:41:dassi/QEMU]# kldunload kqemu.k



main [0:08:dassi/QEMU]# qemu-system-x86_64 -net nic,model=e1000 -net tap,name=tap0,script=no -cdrom ubuntu-12.04.1-server-amd64.iso -hda tamplates/Ubuntu_T/ubuntu_tamplate.qcow2 -boot order=dc m 256 -localtime
VNC server running on `127.0.0.1:5901'
Warning: no scancode found for keysym 0
Warning: no scancode found for keysym 0


Теперь подключаемся к VNC серверу и начинаем установку.

image

image

Следующим шагом настроим локальную сеть между хостовой и гостевой ОС. Для начала как это работает. Мы должны создать физический интерфейс гостевой ОС, который через виртуальный коммутатор будет связан с хостовой ОС. Такой коммутатор в нотации qemu называется vlan.

image

Существует несколько вариантов подключения гостевой и хостовой ОС в ЛВС:

1. В user режиме гостевая машина использует встроенную систему обмена с хостом.


main [19:45:dassi/QEMU]# qemu-system-x86_64 -net nic,vlan=0 -net user,vlan0 -hda tamplates/FreeBSD_T/freebsd_tamplate.qcow -boot c -m 256 -localtime


После запуска в гостевой ОС необходимо сконфигурировать сеть с помощью встроеного dhcp сервера.
Получим адрес из диапазона 10.0.2.0/8.

2. Связывание хостового нтерфейса tun*tap* с интерфейсом гостевой системы.

main [19:45:dassi/QEMU]# qemu-system-x86_64 -net nic,vlan=0 -net tap,vla0,script=no,downscript=no -hda tamplates/FreeBSD_T/freebsd_tamplate.qcow -boot c -m 256 -localtime


При запуске рекомендуют конфигурировать файлы /usr/local/etc/qemu-ifup и /usr/local/etc/qemu-ifdown, это скрипты конфигураци сети при запускевыключении.

image

3. Третьий способ спользуется при необходимости доступа к гостевым машинам извне.

Достигается это созданием соединения типа мост в хостовой машине и помещением туда ее фзического интерфейса и виртуальных tun*tap*. Создается такое соединение средстваи хостовой ОС или редактированим стартовых скриптов сетевой системы qemu. В осальном настройка повторяет пункт 2.

image

Хочется отметить, что система qemu предоставляет возможность объединения виртуальных машин в сеть через сокет хостовой ОС, привязку vlan* к порту, дамп сетевого трафика определенной vlan, а так же опция -net none применяется в случае если в сетевом интефейсе нет необходимости — для отмены дефолтных значений -net nic -net user.

Итак, вот последовательность действий для организаии предъидущей схеммы сети


main [21:38:dassi/QEMU]# ifconfig bridge0 create
main [21:38:dassi/QEMU]# ifconfig tap0 10.100.0.1/24
main [21:38:dassi/QEMU]# ifconfig tap1 10.101.0.1/24
main [21:38:dassi/QEMU]# ifconfig tap2 10.102.0.1/24
main [22:14:dassi/QEMU]# ifconfig bridge0 addm tap0 addm tap1 addm tap2 addm bfe0
main [22:14:dassi/QEMU]# ifconfig bridge0
bridge0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
ether 02:a5:80:8e:f1:00
id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
maxage 20 holdcnt 6 proto rstp maxaddr 100 timeout 1200
root id 00:00:00:00:00:00 priority 0 ifcost 0 port 0
member: bfe0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
ifmaxaddr 0 port 7 priority 128 path cost 55
member: tap2 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
ifmaxaddr 0 port 14 priority 128 path cost 2000000
member: tap1 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
ifmaxaddr 0 port 12 priority 128 path cost 2000000
member: tap0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
ifmaxaddr 0 port 11 priority 128 path cost 2000000


(На этом этапе настройка хоста завешена, как вы замеили — пара tap интерфейс хоста + вируальный интерфейс гостевой ОС будет нахоится в одной подсети с маской 24. bfe0 — мой физический интерфейс смотрящий во внутреннюю дмашнюю сеть )

Теперь достаточно запустить наши машины и средствами готевых ОС назначить виртуаьным инерфейсам соответствующие адреса 10.0.100.2, 10.0.101.2 и 10.0.102.2 соответственно. Отлично, теперь наши машины видят внутреннюю сеть и видны из нее.

ИТОГ: Имеем 3 машины с ОС Ubuntu-1шт и FreBSD-2шт запущенные, сабильно работающие «видящие» ЛВС и «видимые» из нее. Задание выполнено.

Используемые ресурсы

man frebsd;
http://wiki.freebsd.org/qemu;
http://www.lissyara.su/articles/freebsd/programms/qemu_lan/.

Автор: Denisrf

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js