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.