1) Устанавливаем QEMU
# cd /usr/ports/emulator/qemu # make -DWITH_KQEMU # make install
QEMU легко ставится из портов, нужно только не забыть собрать его с поддержкой модуля акселерации KQEMU. В принципе, этот модуль не обязателен, но с ним QEMU работает гораздо быстрее.
2) Подгружаем модуль акселерации
# kldload kqemu
Чтобы модуль подгружался при загрузке, нужно добавить строку в конфигурационный файл /boot/loader.conf:
kqemu_load="YES"
3) Подгружаем модуль асинхронного ввода-вывода
# kldload aio
Чтобы модуль подгружался при загрузке, нужно добавить строку в конфигурационный файл /boot/loader.conf:
aio_load="YES"
4) Создаем образ жесткого диска, на который далее будем ставить Windows
$ mkdir /home/user/qemu $ qemu-img create /home/user/qemu/windows.img 4096M
Образ разместим в домашнем каталоге. Впрочем, это не существенно, можно разместить где угодно. Размер образа - 4 гига (для самой Windows и пары установленных программ этого достаточно, если нужно - можете сделать больше).
5) Устанавливаем Windows
$ qemu -localtime -m 512 -boot d -cdrom /home/user/windows_install.iso \ -hda /home/user/qemu/windows.img -name "Windows"
В данном случае Windows устанавливается с образа компакт-диска. Если Windows устанавливается с настоящего компакт-диска, то вместо образа /home/user/windows_install.iso надо указать устройство /dev/acd0.
Что все это значит: -localtime устанавливает время в Windows равным времени FreeBSD -m задает размер памяти в мегабайтах, которая будет выделена для Windows -boot говорит QEMU откуда нужно загружаться (d - компакт-диск, c - жесткий диск) -cdrom указывает путь к компакт-диску -hda указывет путь к жесткому диску -name выводит в заголовке окна QEMU название запущенной в нем операционной системы (необязательная опция, чисто для красоты)
6) Запускаем Windows
$ qemu -localtime -m 512 -boot c /home/user/qemu/windows.img -name "Windows"
Обратите внимание - загрузка Windows выполняется с образа жесткого диска (опция -boot c).
На этом, собственно, все. Windows запущен в QEMU под управлением FreeBSD.
Настройка сети
Windows, запущенная в QEMU, не имеет выхода в сеть. Для того, чтобы Windows могла выходить в сеть, нужно приложить некоторые усилия.
Представьте, что у нас есть два компьютера, один из которых подключен к сети. Мы хотим, чтобы второй компьютер, который не имеет собственного выхода в сеть, тем не менее, тоже мог выходить в сеть. Для этого мы компьютер, не имеющий сети, подключаем к компьютеру, на котором сеть есть. А компьютер, на котором сеть есть, настраиваем так, чтобы он все пакеты, которые ему присылает второй компьютер, пропускал сквозь себя в сеть. Таким образом, первый компьютер становится для второго компьютера своеобразным "мостом", по которому безсетевой компьютер может выйти в сеть. Такая схема подключения называется "сетевой мост". В нашем случае в качестве первого компьютера выступает FreeBSD, имеющая выход в сеть, а в качестве второго компьютера, не имеющего выхода в сеть - Windows, запущенная в QEMU. Соответственно, наша задача заключается в том, чтобы подключить Windows к FreeBSD, а FreeBSD, в свою очередь, настроить так, чтобы она пропускала через себя в сеть пакеты, отправляемые из Windows.
Сетевой мост во FreeBSD 7.0 создается с помощью модуля if_bridge. Сетевой мост if_bridge был портирован из NetBSD и, начиная с версии FreeBSD 7.0, заменил устаревший сетевой мост bridge.
0) Выясняем, как называется реальный физический интерфейс, через который во FreeBSD работает сеть У меня он называется em0, у вас это название может быть другим, например, rl0.
1) Создаем виртуальный сетевой интерфейс, к которому будет подключен Windows
# ifconfig tap0 create 2) Создаем виртуальный сетевой интерфейс, который будет выполнять функции моста
# ifconfig bridge0 create
3) Объединяем интерфейсы в мост
# ifconfig bridge0 addm em0 addm tap0 up
Чтобы мост создавался при загрузке, нужно добавить две строки в конфигурационный файл /etc/rc.conf:
cloned_interfaces="tap0 bridge0" ifconfig_bridge0="addm em0 addm tap0 up"
На этом создание сетевого моста завершено. ifconfig должен показывать примерно следующее:
$ ifconfig em0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=198<VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4> ether 00:1c:c0:2a:25:3d inet 192.168.216.10 netmask 0xffffff00 broadcast 192.168.216.255 media: Ethernet autoselect (100baseTX <full-duplex>) status: active tap0: flags=8902<BROADCAST,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether 00:bd:f3:19:00:00 bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether 5e:54:49:fc:f9:f0 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> member: em0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
Как видите, тут у нас присутствуют реальный физический интерфейс em0, виртуальный интерфейс tap0 и сетевой мост bridge0. Обратите внимание: внутри bridge0 находятся два member - это интерфейсы em0 и tap0, объединенные мостом.
Теперь нужно подключить Windows к FreeBSD.
4) Включаем автоматическое поднятие интерфейса tap0
# sysctl net.link.tap.up_on_open=1
Чтобы эта переменная инициализировалась при загрузке, нужно добавить строку в конфигурационный файл /etc/sysctl.conf:
net.link.tap.up_on_open=1
5) Разрешаем непривилегированному пользователю соединяться с интерфейсом tap0
# sysctl net.link.tap.user_open=1
Чтобы эта переменная инициализировалась при загрузке, нужно добавить строку в конфигурационный файл /etc/sysctl.conf:
net.link.tap.user_open=1
6) Разрешаем непривилегированному пользователю открывать устройство /dev/tap0
# chmod 666 /dev/tap0
Тут тонкий момент - файлы устройств пересоздаются каждый раз при загрузке системы, поэтому права доступа на файл после перезагрузки вернутся в исходное состояние (600). Поэтому следует задавать права доступа к устройству не через chmod, а через правила devfs. Для этого нужно добавить строку в конфигурационный файл /etc/devfs.conf: perm tap0 0666 Ну и, наконец, запускаем Windows.
7) Запускаем Windows с поддержкой сети
$ qemu -localtime -m 512 -boot c /home/user/windows.img -name "Windows" \ -net nic -net tap,ifname=tap0 Как видите, к параметрам обычного запуска добавились два параметра -net. Первый -net со значением nic создает "внутри" QEMU сетевую карту, которую дальше увидит и будет использовать Windows. Второй -net со значением tap подключает эту сетевую карту к виртуальному интерфейсу tap0. Указываемая через запятую опция ifname=tap0 говорит о том, что подключиться нужно именно к интерфейсу tap0. В принципе, это не обязательная опция, но иногда, по каким-то своим соображениям, QEMU пытается подключится не с дефолтному tap0, а, скажем, к tap1 или к tap4. В этом случае можно явно указать нужный интерфейс, добавив эту опцию.
Все, загрузившись, Windows обнаружит сетевую карту и будет ходить в сеть через нее.
Дополнительные материалы про QEMU: http://www.ibm.com/developerworks/ru/library/l-qemu/index.html http://community.livejournal.com/ru_root/710103.html http://www.opennet.ru/base/sys/qemu_win.txt.html http://ru.gentoo-wiki.com http://www.michurin.com.ru/qemu.shtml
А также про настройку сетевого моста: http://www.opennet.ru/base/net/net_bridge.txt.html http://www.bsdportal.ru/viewtopic.php?p=93244
|