В продолжение темы про виртуализацию 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 && |
Напоминаю всем копирующим мой контент о существовании закона "Об авторском праве".
В связи с этим, прошу во избежании конфликтов при копировании данного материала, ставить на него ссылку:
Также, вы можете отблагодарить меня переслав любую сумму на любой кошелек WebMoney, для поддержания данного ресурса. Или просто админу на пиво ;)
Кошельки для получения благодарности:
R386985788805
U234140473141
Z147712360455
ifconfig bridge0 addm rl0 addm tap0 up
ifconfig: BRDGADD rl0: File exists
ifconfig: BRDGADD rl0: File exists — написано же, интерфейс rl0 уже добавлен в bridge0.
Следовательно: ifconfig bridge0 addm tap0 up или предварительно сделаем ifconfig bridge0 deletem rl0.