Qemu: Windows под UNIX: виртуальная машина qemu (kqemu) под FreeBSD


Какие задачи решаем (запуск Winodws под FreeBSD)
Qemu — универсальное средство (официальный сайт Qemu). Он создаёт виртуальные машину, на которой можно запустить любую ОС. Я его использую для запуска Windows (XP) на FreeBSD. Как это сделать я и собираюсь вкратце рассказать.
Установка qemu под FreeBSD

Сборка qemu
Начиная с FreeBSD 6.3 qemu можно просто поставить из бинарных пакетов. Но для более ранних версий, вам придётся собрать qemu самостоятельно.

Qemu развивается очень быстро и я настоятельно рекомендую перед установкой обновить порты. Детальный рассказ о том, как обновить порты, пользуясь CVSup можно найти в документации на FreeBSD. Коротко расскажу последовательность действий.

Создаём файл supfile. Я в него пишу вот что:

# ближайшее ко мне зеркало, можете выбрать другое
*default host=cvsup2.ru.FreeBSD.org
*default base=/var/db
*default prefix=/usr
*default release=cvs tag=.
*default delete use-rel-suffix
# разрешаем компрессию при передаче данных
*default compress
# обновляем все порты
# можно обновлять только часть, например, ports-emulators
ports-all

Разместить это файл можно где угодно и назвать его можно как угодно.

Далее запускаем процесс обновления:

cvsup -g -L 2 supfile

Ждём некоторое время, всё, порты обновлены. На текущий момент самая свежая версия qemu — 0.9.0 (в начале 2008 года появилась значительно улучшенная версия 0.9.1, но в портах её пока нет).

Дальше собираем qemu из портов по традиционной схеме:

cd /usr/ports/emulators/qemu
make

Вам будет задан вопрос, какие компоненты qemu необходимы. Я включаю поддержку kqemu — специального модуля ядра, значительно ускоряющего работу эмулятора.

После сборки делаем

make install

Осталось сконфигурировать систему.

Конфигурирование FreeBSD для использования qemu
Для успешного запуска вам понадобятся два модуля ядра: во-первых, загружаем модуль kqemu:

kldload kqemu.ko

во-вторых, загружаем модуль асинхронного ввода/вывода:

kldload aio.ko

Без него qemu будет выдавать загадочное сообщение:

Bad system call (core dumped)

(или типа того, разные версии ругаются чуть по разному, но одинаково загадочно) и падать.

Загрузка следующих модулей нужна только если вы хотите выдать эмулятору реальный IP-адрес.

Для этого, вам понадобится мост.

Загружаем модуль:

kldload bridge.ko

Настраиваем мост:

sysctl net.link.ether.bridge_cfg=bge0,tap0
sysctl net.link.ether.bridge.enable=1

Здесь bge0 — мой сетевой интерфейс, у вас скорее всего будет другой.

Кроме того понадобится устройство tap0, оно поддерживается модулем if_tap.ko, но скорее всего это устройство у вас уже есть.
Файл диска виртуальной машины

Виртуальная машина, конечно, имеет жёсткий диск. На самом деле это просто файл, объём которого и определяет объём диска. Я создаю файл на 12 гигабайт, для моих целей этого более чем достаточно.

qemu-img create win12G 12G

Теперь у нас имеется файл win12G, который будет образом диска виртуальной машины.
Конфигурирование сети для виртуальной машины qemu в режиме NAT

Qemu может сам эмулировать NAT. Запускаем так:

qemu -m 512 \
-hda /root/qemu/win12G \
-net nic \
-net user \
-localtime

Обратите внимание на опции -net nic и -net user. Благодаря им виртуальная машина сможет сама получить по DHCP (встроен в qemu) все настройки сети.

Никаких дополнительных модулей ядра в этом режиме не требуется.
Конфигурирование сети для виртуальной машины qemu с реальным IP-адресом

В этом случае вам как раз понадобится мост (bridge.ko) и устройство tap0. (Как их настроить я уже рассказал.)

Чтобы qemu смогло поднять сетевой интерфейс, ему нужен up-скрипт. Назовём его qemu-ifup.

Я получаю данные по DHCP, поэтому скрипт не велик:

#!/bin/sh
ifconfig $1 0.0.0.0

Всё, виртуальная машина готова к запуску.

qemu -m 512 \
-hda /root/qemu/win12G \
-net nic \
-net tap,script=/root/qemu/qemu-ifup \
-localtime

Установка Windows на виртуальную машину

Образ загрузочного диска
Первым делом я создаю образ загрузочного диска Windows. Этого можно и не делать, для установки можно использовать полноценный диск, но как показывает практика, образ не повредит.

dd if=/dev/acd0 of=WXP.iso bs=2048

Я делаю образ из двух соображений: первое — элементарная запасливость, второе — из файла установка идёт быстрее потому, что диск то раскручивается, то останавливается, а файл всегда доступен по первому требованию.

Установка Windows, шаг первый
Теперь нам надо загрузить виртуальную машину с CD-ROM и установить Windows:

qemu -m 512 \
-win2k-hack \
-cdrom /root/qemu/WXP.iso \
-boot d \
-hda /root/qemu/win12G \
-net nic \
-net tap,script=/root/qemu/qemu-ifup \
-localtime

Виртуальная машина будет иметь 512Mb оперативной памяти (-m 512), жёсткий диск (-hda /root/qemu/win12G), CD-ROM (-cdrom /root/qemu/WXP.iso, если вы используете реальное физическое устройство для чтения дисков, то укажите не файл, а это устройство; например /dev/acd0), сеть (интерфейс tap, скрипт для инициализации интерфейс /root/qemu/qemu-ifup) и загружаться всё это будет с CD-ROM (-boot d).

После запуска Windows предложит вам разбить новый диск на разделы и начнёт установку. Тут нет ничего необычного, Windows живёт на виртуальной машине точно так же, как и на реальной.

Установка Windows, шаг второй
На втором шаге установки вам надо загрузиться с диска, но CD-ROM должен быть по прежнему доступен:

qemu -m 512 \
-win2k-hack \
-cdrom /root/qemu/WXP.iso \
-hda win12G \
-net nic \
-net tap,script=/root/qemu/qemu-ifup \
-localtime

Завершаем установку и настройку Winodws.

Использование

Запуск Windows
Теперь, чтобы запустить Windows, достаточно выполнить команду вида:

qemu -m 512 \
-hda /root/qemu/win12G \
-hdb /root/qemu/win8G-d \
-net nic \
-net tap,script=/root/qemu/qemu-ifup \
-localtime

Обратите внимание, здесь я ещё добавил в систему второй диск (D:) на 8 гигабайт.
Несколько простых инструкций
• Чтобы работать в Windows, просто щёлкните по окну.
• Чтобы qemu «отпустил» мышь, нажмите Ctrl-Alt.
• Чтобы перейти в консоль управления виртуальной машиной нажмите Ctrl-Alt-2.
• Чтобы вернуться в основное окно — Ctrl-Alt-1

Возможности консоли qemu
Все возможности можно узнать по команде help (и конечно из документации file:///usr/local/share/doc/qemu/qemu-doc.html). Перечислю основные.

Остановка машины — quit или просто q.

Остановить эмуляцию (остановить процессор машины) — stop.

Запустить процессор снова — cont или c.

Вытащить виртуальный CD-диск — eject.

Сохранить или загрузить состояние виртуальной машины — savevm/loadvm. То есть вы можете запустить Windows, начать там что-то делать, потом зайти в консоль, остановить эмуляцию, сохранить состояние машины и выключить машину (stop, savevm, quit). Потом, вы можете снова запустить эмулятор, восстановить состояние машины и запустить её снова (loadvm, cont). В результате вы получите уже загруженную систему в том состоянии, в каком вы её покинули.

Единственная «неприятность» связана с часами. Системе будет казаться, что часы сделали резкий скачок, что может привести к некоторым недоразумения. Впрочем, не фатальным.

Кроме того из консоли вы можете делать много другое: управлять мышью и клавиатурой, смотреть регистры процессора и состояние памяти, эмитировать нажатия кнопок «reset» и «power», добавлять и удалять USB-устройства, делать снимок экрана и многое другое.

Работа с Windows через rdesktop

Преимущества
На мой взгляд, при запуске Windows в эмуляторе с ним проще и удобней работать через rdesktop. Основные преимущества:

• rdesktop позволяет «расшаривать» такие полезные ресурсы, как, например, буфер обмена; то есть вы получаете возможность копировать данные между windows и хост-ОС просто через клипборд, что очень удобно
• rdesktop не так навязчиво захватывает мышь
• графика работает несколько быстрее

Запуск
Если вы используете NAT-конфигурацию Qemu, то для того, чтобы пропустить «наружный» трафик, вам следует создать канал, добавив опцию -redir tcp:3389::3389. Например так:

qemu -m 512 -hda win12G -net nic -net user -localtime -redir tcp:3389::3389

Вот, собственно, и всё. Теперь весь трафик, входящий на порт 3389 вашей виртуальной машины, будет пропущен внутрь. Больше нам ничего и не надо.

Запускаем rdesktop:

rdesktop -k en-us -r clipboard -u winuser 127.0.0.1

Утилита rdesktop позволяет сделать очень многое, здесь я привёл пример использования только трёх опций:

• -k — выбор языка
• -r clipboard — буфер обмена Windows будет «виден» во FreeBSD (и наоборот)
• -u winuser — имя пользователя при логне будет уже набрано

Подключаемся мы на локальный хост, но никто не мешает подключиться и с удалённой машины, кроме, возможно, firewall-a.


Комментарии запрещены.




Статистика