Наши задачи:
1. Установить Qemu с модулем kqemu.ko под FreeBSD 7.0
2. Установить в качестве гостевой ОС Windows XP
3. Предоставить XP выход в домашнюю сеть и выход в интернет через ipnat(маскарадинг)
4. Предоставить гостевой ОС выход в сеть с "реальным" IP и MAC адресом.
Предисловие . Я использую в качестве домашней системы
FreeBSD 7.0 и уже писал, что она сочетает в себе всю мощь серверной
операционной системы, а так же вполне подходит для домашнего
использования. Так что будем работать на FreeBSD.
Когда-то давно я использовал Windows XP на своей домашней
машине и в качестве эмулятора был VMWare, а в качестве гостевой ОС была
FreeBSD...
Сейчас всё наоборот ;)
У меня появилась необходимость поставить на FreeBSD эмулятор - qemu и настроить в качестве гостевой ОС Windows XP , предоставив ей выход в локальную сеть(домашка) и в сеть internet.
Решение родилось не сразу, но давайте по порядку. 1. Устанавливать Qemu будем из портов. QEMU
— свободная программа с открытым исходным кодом для эмуляции
аппаратного обеспечения различных платформ. Список поддерживаемых
архтектур в "QEMU Emulator User Documentation"
(/usr/local/share/doc/qemu/qemu-doc.html)
Установка:
#cd /usr/ports #make search name="qemu
Из всего, что выдал поиск, нам нужно только:
Port: kqemu-kmod-1 .3 .0 .p11_9 Path: /usr/ports/emulators/kqemu-kmod Info: Kernel Accelerator for QEMU CPU Emulator Port: qemu-0 .9 .1_10 Path: /usr/ports/emulators/qemu Info: QEMU CPU Emulator
Ставим:
#cd /usr/ports/emulators/qemu #make config
Устанавливаем галочку напротив пункта: [x] KQEMU Build with (alpha!) accelerator module ,
потому что qemu отличается очень быстрой эмуляцией при использовании
специального модуля kqemu. kqemu позволяет выполнять инструкции
виртуальной машины в обход системы виртуализации прямо на реальном
процессоре.
затем:
Настроим ядро.
После установки необходимо подготовить систему для работы с эмулятором.
Эмулятор требует, чтобы был загружен модуль aio.ko (asynchronous I/O).
Добавляем в /etc/rc.conf запуск модуля - акселератора:
kqemu_enable="YES" и стартовый скрипт подгрузит aio.ko, но я
придерживаюсь того, чобы ядро было монолитно, поэтому добавил в конфиг
ядра:
Добавить загрузку kqemu можно также прописав в /boot/loader.conf:
Для пунктов 3 ,4 нашей статьи нам понадобится добавить в ядро следующее:
tap - Ethernet tunnel software network interface — необходимо для сетевого взаимодействия хост машины с гостевой ОС
# Необходимо для ipnat
options IPFILTERoptions IPFILTER_LOG
Пересобираем ядро:
#cd /usr/src #make buldkernel KERNCONF=newcore #make installkernel KERNCONF=newcore #shutdown -r no
Если всё ок, то действуем дальше ;)
Вместо добавления опций в конфиг ядра и пересборки можно опять же подгрузить модули...
2. Ставим XP
Необходимо создать образ для гостевой ОС перед установкой. Лично я
храню все виртуальные машины в папке ~/vmachine и не пользуюсь
графическими обёртками под qemu ... ибо это не unix путь. Итак мы всё будем делать ручками, а так же создадим скрипты для запуска.
Создаём образ:
Образ создаётся очень просто с помощью утилиты qemu-img ( QEMU disk image utility)
#qemu-img create windows.raw 4
4 гигабайта меня вполне устроит )
Запускаем установку:
#qemu -hda windows.raw -cdrom /dev/acd0 -m 512 -boot d -localtim
-cdrom — можно вместо устройства указать образ, например: -cdrom /img/winxp.iso
-hda — это жёсткий диск. Здесь мы указываем наш образ
-m 512 — выделяем 512 мегабайт оперативной памяти. Тут всё зависит от вашей машины и от ваших предпочтений ;)
-boot d — загрузка с cdrom. Если было бы -boot c , то загрузка началась бы с нашего образа.
-localtime — устанавливает часы виртуальной машины в соответствие с локальными часами.
На самом деле модуль kqemu.ko под FreeBSD пока ещё
нестабилен и во время инсталляции qemu либо вылетал, либо утсановщик
подвисал. Именно поэтому я не использовал его во время инсталляции.
Вообщем пока это всё что необходимо для установки. Узнать о других параметрах qemu и посмотреть список поддерживаемого оборудования можно почитав man qemu или просто ввести qemu без параметров.
После установки Windows создадим загрузочный скрипт такого содержания:
#!/bin/sh qemu -hda windows.raw \ -m 512 \ -boot c \ -localtime \ -kernel-kqemu \ -soundhw all \ -net nic \ -net tap# -cdrom /dev/acd0 \
Появилось несколько новых параметров:
-kernel-kqemu — Включаем модуль акселерации.
-soundhw all — Включаем поддержку всех поддерживаемых эмулятором звуковых карт
-net nic — Создаём сетевой интерфейс для виртуальной машины
-net tap — и интерфейс для взаимодействия с виртуалной машиной на хост машине
Теперь можено запускать наш скрипт и грузиться в Windows XP.
3. Настройка сети и ipnat Для того, чтобы сетевой интерфейс tap автоматически создавался при запуске FreeBSD, я прописал в /etc/devfs.conf:
оздать tap интерфейс можно и с помощью ifconfig.. Например:
Удаляется так же просто:
Также, чтобы обычный(непривилегированный) пользователь мог использовать интерфейс tap необходимо установить параметр sysctl :
sysctl net.link.tap.user_open =1
обавим его в /etc/sysctl.conf, чтобы после перезагрузки он не сбросился.
Существует скрипт, который по умолчанию запускается для настройки сети.
Именно его мы и будем использовать для поднятия интерфейса tap.
Расположен он в /usr/local/etc/qemu-ifup . Так же есть скрипт, который выполняется после выключения VM, и называется он qemu-ifdown .
Приведём qemu-ifup к следующему виду:
#!/bin/sh /usr/local/bin/sudo /sbin/ifconfig $1 192 .168 .7 .1 exec true
з скрипта понятно, что интерфейс хост машины будет 192.168.7.1. Именно параметр $1 будет содержать: tap0
Настроим сеть в Windows XP .
После запуска VM в XP у меня появился сетевой адаптер Realtec RTL 8029(AS) Установим :
IP-адрес: 192 .168 .7 .2 Маску подсети: 255 .255 .255 .0 Шлюз по умолчанию: 192 .168 .7 .1
качестве "Предпочитаемого DNS сервера" необходимо установить DNS сервер вашего провайдера. С настройкой Windows мы закончили.
Теперь нужно настроить NAT(маскарадинг) .
Для маршрутизации между сетевыми интерфейсами устанавливаем параметр sysctl в /etc/sysctl.conf:
алее для автоматической загрузки Ipfilter и Ipnat добавляем в /etc/rc.conf следующее:
#Для работы ipnat необходимо чтобы ipfilter был включен ipfilter_enable="YES" ipfilter_program="/sbin/ipf" ipfilter_rules="/etc/ipf.rules"#Собственно сам ipnat ipnat_enable="YES" ipnat_program="/sbin/ipnat" ipnat_rules="/etc/ipnat.rules"
Пара правил разрешающих прохождение всех пакетов.
/etc/ipf.rules
pass in from any to any pass out from any to any
Запуск фильтра можно производить из командной строки:
# ipf -Fa -f /etc/ipf.rules
равила трансляции адресов записываются в файл /etc/ipnat.rules:
map nfe0 from 192 .168 .7 .0 /24 to any -> 10 .X.X.6 /32 map ng0 from 192 .168 .7 .0 /24 to any -> 172 .X.X.77 /32
ти
два правила обеспечивают трансляцию пакетов из сети 192.168.7.0 в
локальную сеть 10.X.X.0 (10.X.X.6 — мой ip адрес в домашней сети
прова). nfe0 — это интерфейс физичесской сетевой карты хост машины,
которая смотрит прямо в домашнюю сеть. ng0 — сетевой интерфейс интернет
VPN соединения.
Запускаем ipnat из командной строки:
# ipnat -CF -f /etc/ipnat.rules
люч -C удаляет все записи из таблицы ipnat, ключ -F удаляет все активные записи из таблицы трансляции.
Для контроля работы ipnat используются два ключа:
# Отображение Nat статистики ipnat -s# Показать таблицу текущих Nat отображений ipnat -l
После
запуска, если мы всё настроили правильно, то Windows у нас сможет
спокойно выходить в сеть. Но всё это будет работать через Nat.
4. Настройка сети и ifbridge Итак мы хотим сейчас предоставить VM выход в "реальную" сеть, чтобы её там было видно по IP и MAC.
Реализовать это можно с помощью Моста(if_bridge) . Для включения драйвера в ядро необходимо в конфиг ядра добавить опцию:
Опять же если не хотим использовать ядро, то можно добавить в /etc/loader.conf:
if_bridge_load="YES" bridgestp_load="YES"
Сейчас наш стратовый скрипт qemu-ifup приобретёт следующий вид:
#!/bin/sh # Создаём интерфей моста /usr/local/bin/sudo /sbin/ifconfig bridge0 create# Доавляем интерфейсы между которыми будет мост /usr/local/bin/sudo /sbin/ifconfig bridge0 addm nfe0 addm $1 up exec true
fe0 — это интерфейс моей физичесской карты.
$1 — будет tap0
Сейчас мы не назначаем tap интерфейсу адреса, и поэтому он автоматичесски не поднимется. Для того, чтоб он поднялся, когда будет работать скрипт qemu-ifup необходимо установить параметр sysctl:
net.link.tap.up_on_open=1
ообщем сейчас можно запускать VM, настраивать адрес локальной сети, и машина будет доступна в сети по IP.
Если вам не надо, чтобы интерфейсы bridge0 или tap0 существовали после VM shutdown, то мы можем добавить в qemu-ifdown :
#!/bin/sh /usr/local/bin/sudo /sbin/ifconfig bridge0 destroyexec true
сли
вы работаете не из под root'a(а так и работают все нормальные
пользователи) и вам не нравится каждый раз вводить пароль, чтобы
использовать "sudo ifconfig", то можно выполнить такую команду:
# chmod u+s /sbin/ifconfig
этом случае непривелигированный пользователь сможет выполнять ifconfig,
как если бы он был root'ом. Ещё раз напоминаю, что я использую FreeBSD
в качестве домашней системы и вполне могу себе такое позволить. Если вы
работаете на сервере, то лучше этого не делать. :)
Дополнительную информацию по qemu и kqemu можно найти в "QEMU Emulator
User Documentation " (/usr/local/share/doc/qemu/qemu-doc.html), "QEMU
Accelerator Technical Documentation"
(/usr/local/share/doc/kqemu/kqemu-tech.html), а так же на сайте автора:
http://bellard.org/qemu и в приведённом ниже списке литературы.
PS: пожалуйста, если вы нашли неточность или ошибку в статье, сообщите в комментариях или мне на личную почту.
Список литературы:
1.Журнал "Хакер №118" — Виртуальный полигон
2.Журнал "Системный администратор" №28 / 03.2005 — FreeBSD TIPS: использование NAT
3.wikipedia
4.man tap, man bridge, man ipnat, man qemu