В продолжение темы про виртуализацию FreeBSD, я добавляю эту статью.

Основная задача этой статьи, пояснить как можно установить Windows на FreeBSD используя QEMU без установленных X-ов на FreeBSD 8.0.

Итак, что нам нужно?

1. Операционная система FreeBSD на сервере, на котором будет гостевая Windows система.
2. Инсталляционный диск Windows системы или его ISO обаз.
3. Подключенный интернет, или репозиторий с пакетами.
4. Утилиты, для подключения по ssh и vnc протоколу. Если мы все операции будем проводить из-под windows системы, то подойдут например эти: putty и vnc клиент.

Из основного — это всё, ну разве что ещё терпением можно тоже запастись 😉

Теперь подключаемся к серверу на котором будет наша Windows система с помощью putty и устанавливаем QEMU:

# cd cd /usr/ports/emulators/qemu
# make install clean
 [X] KQEMU          Build with (alpha!) accelerator module
 [X] RTL8139_TIMER  allow use of re(4) nic with FreeBSD guests
 [X] SAMBA          samba dependency (for -smb)
 [ ] SDL            SDL/X dependency (graphical output)
 [X] GNUTLS         gnutls dependency (vnc encryption)
 [X] PCAP           pcap dependency (networking with bpf)
 [X] CDROM_DMA      IDE CDROM DMA
 [X] PHYS_CDROM     Physical CDROM fixes
 [X] ADD_AUDIO      Emulate more audio hardware (experimental!)
 [X] ALL_TARGETS    Also build non-x86 targets    
 
 [  OK  ]       Cancel        
Выбираем пункты и устанавливаем QEMU...

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

# mkdir -p /VirtualPC/win2k
# qemu-img create /VirtualPC/win2k/win.img 4096M
# kldload kqemu
# kldload aio
# echo 'kqemu_load="YES"' >> /boot/loader.conf
# echo 'aio_load="YES"' >> /boot/loader.conf
# qemu -k ru -win2k-hack -full-screen -vnc :0 -monitor stdio -localtime -m 512 -cdrom /dev/acd0 -boot d /VirtualPC/win23k/system.img

Проверяем открылся ли сокет к нашему qemu:

#  sockstat | grep qemu
root     qemu       2171  10 tcp4   10.10.100.254:5900    *:*

Запускаем на Windows системе vnc клиента и подключаемся к адресу сервера, в моём случае — это: 10.10.100.254:5900. В результате чего, мы получаем в vnc, как бы физическую консоль к клавиатуре. Дальше, устанавливаем Windows систему, как обычно.

После установки, стартуем qemu с другими параметрами, нам ведь не нужен уже установочный диск 😉

# qemu -localtime -m 512 -full-screen -vnc :0 -boot c /VirtualPC/win23k/system.img

Работаем с Windows используя VNC, но без сети, а если вам больше по душе стандартный протокол RDP — то придется настроить сеть. В принципе, возможно вам итак понадобится сеть — поэтому, настроим ее. Для этого нам понадобится создать виртуальный интерфейс tap0 и сетевой мост. В моем случае, на FreeBSD 8.0 сетевой мост создается с помощью модуля if_bridge, он был портирован из NetBSD и, начиная с версии FreeBSD 7.0, заменил устаревший сетевой мост bridge.

Теперь поэтапно:

1. Выясняем, как называется реальный физический интерфейс, через который FreeBSD работает в сети. У меня это rl0:

# ifconfig
rl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=8<VLAN_MTU>
        ether 00:0e:2e:a9:35:77
        inet 10.10.100.254 netmask 0xffffff00 broadcast 10.10.100.255
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
plip0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> metric 0 mtu 1500
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=3<RXCSUM,TXCSUM>
        inet 127.0.0.1 netmask 0xff000000

2. Создаем виртуальный сетевой интерфейс, к которому будет подключена Windows система:

# ifconfig tap0 create

3. Создаем виртуальный сетевой интерфейс, который будет выполнять функции моста:

# ifconfig bridge0 create

4. Объединяем интерфейсы в мост:

# ifconfig bridge0 addm rl0 addm tap0 up

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

# cat /etc/rc.conf | grep tap0
cloned_interfaces="tap0 bridge0"
ifconfig_bridge0="addm rl0 addm tap0 up"

На этом создание сетевого моста завершено. Теперь если посмотреть ifconfig, то у вас должно отображаться что то подобное:

# ifconfig
rl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=8<VLAN_MTU>
        ether 00:0e:2e:a9:35:77
        inet 10.10.100.254 netmask 0xffffff00 broadcast 10.10.100.255
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
plip0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> metric 0 mtu 1500
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=3<RXCSUM,TXCSUM>
        inet 127.0.0.1 netmask 0xff000000
tap0: flags=8902<BROADCAST,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether 00:bd:88:30:74:00
bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether fe:67:52:6d:42:81
        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: tap0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
                ifmaxaddr 0 port 4 priority 128 path cost 2000000
        member: rl0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
                ifmaxaddr 0 port 1 priority 128 path cost 200000

Здесь видно, что имеются интерфейсы rl0, tap0, bridge0.
И внутри интерфейса bridge0, имеются 2 member с интерфейсами rl0 и tap0, объединенные мостом.

5. Включаем автоматическое поднятие интерфейса tap0

# sysctl net.link.tap.up_on_open=1

Для автоподнятия при загрузке системы, необходимо добавить в конфигурационный файл /etc/sysctl.conf строку:

# echo 'net.link.tap.up_on_open=1' >> /etc/sysctl.conf

6. Разрешим непривилегированному пользователю соединяться с интерфейсом tap0

# sysctl net.link.tap.user_open=1
# echo 'net.link.tap.user_open=1' >> /etc/sysctl.conf

7. Разрешаем непривилегированному пользователю открывать устройство /dev/tap0

# chmod 666 /dev/tap0
# echo 'perm tap0 0666' >> /etc/devfs.conf

Теперь запускаем нашу Windows с поддержкой сети:

$ qemu -localtime -full-screen -vnc :0 -m 512 -boot c /VirtualPC/win23k/system.img -net nic -net tap,ifname=tap0

Включаем доступ по RDP, устанавливаем драйвера и стартуем QEMU таким способом:

$ qemu -localtime -m 512 -boot c /VirtualPC/win23k/system.img -net nic -net tap,ifname=tap0

Подключаемся по сети протоколом RDP и радуемся, у нас все получилось 🙂

Некоторые ключи и их назначения:

-boot d - загружатся с cd/dvd
-hda /winXPx32.img - путь к HDD
-cdrom /dev/acd0 - привод (можно указывать и на iso)
-m 128 - сколько выделять памяти
-vga cirrus - видеокарта
-net nic,model=rtl8139 - емулировать сетевую RealTek
-net tap,ifname=tap0 - привязать ее к tap0

PS. При установке MICROSOFT продуктов, опцию -kernel-kqemu опустить. Запуск Qemu возможен и в режиме демона. -vga cirrus меняем на -nographic -daemonize.

И ещё в дополнение приведу свой скрипт автозагрузки:

# cat /usr/local/etc/rc.d/qemu_start.sh
#!/bin/sh
###starting qemu script
/usr/local/bin/qemu -kernel-kqemu -enable-kqemu -nographic -daemonize -localtime -m 512 -boot c -hda /VirtualPC/win23k/system.img -hdb /VirtualPC/win23k/dataDisk.img -net nic -net tap,ifname=tap0 &&

Напоминаю всем копирующим мой контент о существовании закона "Об авторском праве".
В связи с этим, прошу во избежании конфликтов при копировании данного материала, ставить на него ссылку:

http://noted.org.ua/1494


Также, вы можете отблагодарить меня переслав любую сумму на любой кошелек WebMoney, для поддержания данного ресурса. Или просто админу на пиво ;)

Кошельки для получения благодарности:
R386985788805
U234140473141
Z147712360455

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

  1. ifconfig bridge0 addm rl0 addm tap0 up
    ifconfig: BRDGADD rl0: File exists

  2. ifconfig: BRDGADD rl0: File exists — написано же, интерфейс rl0 уже добавлен в bridge0.
    Следовательно: ifconfig bridge0 addm tap0 up или предварительно сделаем ifconfig bridge0 deletem rl0.

Add your comment now

Please note: JavaScript is required to post comments.