Исходные данные
1. Freebsd
#uname -a
FreeBSD ultra.vesp.ru 9.1-RC2 FreeBSD 9.1-RC2 #0 r241106: Mon Oct 1 18:26:44 UTC 2012 Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.:/usr/obj/usr/src/sys/GENERIC amd64
(Фри 64 бита)
2. Windows XP диск, либо его образ
-----------------------------------------------------
Задача
1. Установить WinXP
2. подключить сеть
3. Настроить контролируемый доступ
4. запустить демоном
5. забыть о его существовании как виртуализация. :)
-----------------------------------------------------

Для подключения сети будем использовать if_bridge который будет модулем подгружаться в ядро.

% cd /usr/ports/emulators/qemu/
sudo make config
(работаем от юзера с настроенным sudo)

Отмечаем для компилятора модуль KQEMU

[*] ADD_AUDIO Emulate more audio hardware (experimental!) | |
[*] ALL_TARGETS Also build non-x86 targets | |
[*] CDROM_DMA IDE CDROM DMA | |
[*] CURL libcurl dependency (remote images) | |
[*] GNS3 gns3 patches (udp, promiscuous multicast) | |
[*] GNUTLS gnutls dependency (vnc encryption) | |
[*] KQEMU Build with (alpha!) accelerator module | |
[*] PCAP pcap dependency (networking with bpf) | |
[*] RTL8139_TIMER allow use of re(4) nic with FreeBSD guests | |
[ ] SAMBA samba dependency (for -smb) | |
[*] SDL SDL/X dependency (graphical output)

Компилируем, устанавливаем, убираем грязь

%sudo make install clean
%rehash

У меня так, но скорее всего с самбой было бы лучше, но это не важно эмулятор работать будет.

Ждем не долгий процесс компиляции (за что мне нравится этот эмулятор).

2. Подгружаем модуль ускорителя KQEMU (эмулятор работает без него но очень заметно подтормаживает, с KQEMU будет комфортнее)
%sudo kldload kqemu

Чтобы модуль подгружался при загрузке, нужно добавить строку в конфигурационный файл /boot/loader.conf:
kqemu_load="YES"
Подгружаем модуль асинхронного ввода-вывода
%sudo kldload aio
и тоже заносим его в файл загрузки ядра /boot/loader.conf
aio_load="YES"
Убедимся что все нормально.
%kldstat
6 1 0xffffffff8157e000 f4d0 aio.ko
9 1 0xffffffff82478000 2bdf0 kqemu.ko

3. Создаем образ жесткого диска, на который далее будем ставить Windows
%mkdir ./VirtualPC
%qemu-img create ./VirtualPC/WinXP.img 20G

Делаем образ HDD 20 гигов (ну кто на что горазд)

3. Устанавливаем WinxP (у меня есть диск потому я буду ставить из устройства, но можно ставить из образа iso)

$ qemu -localtime -m 512 -boot d -cdrom /dev/cd0 -hda ./VirtualPC/WinXP.img -name "Windows"

-localtime устанавливает время в Windows равным времени FreeBSD
-m задает размер памяти в мегабайтах, которая будет выделена для Windows
-boot говорит QEMU откуда нужно загружаться (d - компакт-диск, c - жесткий диск)
-cdrom указывает путь к компакт-диску
-hda указывет путь к жесткому диску
-name выводит в заголовке окна QEMU название запущенной в нем операционной системы (необязательная опция, чисто для красоты)

Проводим установку.
Стартуем.
$ qemu -localtime -m 512 -boot с -cdrom /dev/cd0 -hda ./VirtualPC/WinXP.img -name "Windows"

4. Подключение сети. (в сети водится DHCP сервер, так что все настройки ip протокола виртуальной машины ложится на плечи обладателя сего чуда)

Windows, запущенная в QEMU, не имеет выхода в сеть. Для того, чтобы Windows могла выходить в сеть, нужно приложить некоторые усилия.

Представьте, что у нас есть два компа, один из которых подключен к сети. Мы хотим, чтобы второй комп, который не имеет собственного выхода в сеть, тем не менее, тоже мог выходить в сеть. Для этого мы комп, не имеющий сети, подключаем к компу, на котором сеть есть. А комп, на котором сеть есть, настраиваем так, чтобы он все пакеты, которые ему присылает второй комп, пропускал сквозь себя в сеть. Таким образом, первый комп становится для второго компа своеобразным "мостом", по которому безсетевой комп может выйти в сеть.

Такая схема подключения называется "сетевой мост".

В нашем случае в качестве первого компа выступает FreeBSD, имеющая выход в сеть, а в качестве второго компа, не имеющего выхода в сеть - Windows, запущенная в QEMU. Соответственно, наша задача заключается в том, чтобы подключить Windows к FreeBSD, а FreeBSD, в свою очередь, настроить так, чтобы она пропускала через себя в сеть пакеты, отправляемые из Windows.

%ifconfig
Выясняем, как называется реальный физический интерфейс, через который во FreeBSD работает сеть
У меня он называется msk0, у вас это название может быть другим, например, rl0.
Создаем виртуальный сетевой интерфейс, к которому будет подключен Windows

%sudo ifconfig tap0 create

Создаем виртуальный сетевой интерфейс, который будет выполнять функции моста
%sudo ifconfig bridge0 create

Объединяем интерфейсы в мост
%sudo ifconfig bridge0 addm msk0 addm tap0 up

Чтобы автоматизировать процесс создания моста при перезагрузки системы делаем следующее
в конфигурационный файл /etc/rc.conf добавляем :

cloned_interfaces="tap0 bridge0"
ifconfig_bridge0="addm msk0 addm tap0 up"

Включаем автоматическое поднятие интерфейса tap0
%sudo sysctl net.link.tap.up_on_open=1
Разрешаем непривилегированному пользователю соединяться с интерфейсом tap0
%sudo sysctl net.link.tap.user_open=1
Чтобы эти переменные инициализировались при загрузке, нужно добавить строку в конфигурационный файл /etc/sysctl.conf

net.link.tap.up_on_open=1
net.link.tap.user_open=1

Разрешаем непривилегированному пользователю открывать устройство /dev/tap0
%sudo chmod 666 /dev/tap0
При перезагрузках интерфейс пересоздается с ненужными нам правами для этого нужно добавить строку в конфигурационный файл /etc/devfs.conf чтоб было все как надо

perm tap0 0666

Ну и все Windows можно запускать с поддержкой сети

% qemu -localtime -m 1024 -boot c -hda ./VirtualPC/WinXP.img -name "Windows" -net nic -net tap,ifname=tap0
(увеличили память до 1G включили сеть)

Как видите, к параметрам обычного запуска добавились два параметра -net
Первый -net со значением nic создает "внутри" QEMU сетевую карту, которую дальше увидит и будет использовать Windows.
Второй -net со значением tap подключает эту сетевую карту к виртуальному интерфейсу tap0. Указываемая через запятую опция ifname=tap0 говорит о том, что подключиться нужно именно к интерфейсу tap0. В принципе, это не обязательная опция, но иногда, по каким-то своим соображениям, QEMU пытается подключится не с дефолтному tap0, а, скажем, к tap1 или к tap4. В этом случае можно явно указать нужный интерфейс, добавив эту опцию.

Все, загрузившись, Windows обнаружит сетевую карту и будет ходить в сеть через нее.

Далее задача могла бы и завершиться, но мне необходимо "Забыть о эмуляции"

% qemu -soundhw ac97 -usb -enable-kqemu -localtime -m 1024 -boot c -hda ./Win7_qemu.img -name "Windows" -net nic -net tap,ifname=tap0 -daemonize -nographic

И наш эмулятор работает в фоне никому не мешает доступ через RDP или VNC тайм вивер все что угодно

Есть небольшая загвоздка после перезагрузки
sysctrl отрабатывает быстрей net.link.tap.user_open=1 чем создается сам tap
надо net.link.tap.user_open=1 выполнять после загрузки системы

Добавить комментарий

Защитный код
Обновить