\section{Windows XP в Xen}


Здесь рассматривается процедура подготовки и запуска домена с Windows в системе виртуализации Xen на платформе с аппаратной поддержкой виртуализации (HVM). Выполнять \textit{Windows в паравиртуальном режиме} (т.е. без использования аппаратных архитектурных расширений виртуализации) на сегодняшний день нельзя. Возможно, это можно будет сделать в будущем. 
Подробности на странице \htmladdnormallinkfoot{Windows в паравиртуальном домене Xen}{http://xgu.ru/wiki/Paravirtualized\_Windows}.

\subsection{Предварительные требования}
В первую очередь, для установки Windows XP, как и любой другой системы с закрытым кодом, необходима поддержка центральным процессором технологии виртуализации Intel®Virtualization Technology (VT) или Pacifica (AMD). Таблицу поддержки аппаратной виртуализации процессорами можно найти \htmladdnormallinkfoot{здесь}{http://xgu.ru/wiki/xen/hw}. 

Поддержка аппаратной виртуализации должна быть и у Xen.
При сборке из исходных текстов понадобится установить в систему:
\begin{itemize}
\item  \textbf{dev86} -- Ассемблер и компоновщик для реального режима 80x86. Этот пакет необходим для сборки кода BIOS, запускаемого в (виртуальном) реальном режиме. Если пакет dev86 недоступен для x86\_64, то можно использовать i386 версию.
\item  \textbf{LibVNCServer} -- Немодифицируемый VGA дисплей, клавиатуру и мышь можно виртуализировать с помощью библиотеки vncserver. 
\item  \textbf{SDL-devel}, \textbf{SDL} -- Если пакеты SDL и SDL-devel не были установлены по умолчанию, то взять их можно из системы портов или скомпилировав из исходных текстов.
\end{itemize}

\subsubsection{Замечание для пользователей Debian}
При выполнении вышеуказанной процедуры на 
Debian GNU/Linux необходимо учесть, что 
пакет \textbf{dev86} в Debian разбит на два пакета -- \textbf{bin86} и \textbf{bcc} -- и перед компиляцией Xen из архива исходных текстов 
должны быть установлены оба эти пакета (\htmladdnormallinkfoot{подробнее}{http://lists.xensource.com/archives/html/xen-users/2006-02/msg00207.html}).

\begin{verbatim}
$ apt-cache show bin86 bcc
Package: bin86
...
Description: 16-bit x86 assembler and loader
This is the as86 and ld86 distribution written by Bruce Evans.
It's a complete 8086 assembler and loader which can make 32-bit
code for the 386+ processors (under Linux it's used only to create
the 16-bit bootsector and setup binaries).

Package: bcc
...
Description: 16-bit x86 C compiler
This is a C-compiler for 8086 cpus which is important for the
development of boot loaders or BIOS related 8086 code.

It is possible to run 8086 code under i386 Linux using an emulator,
`elksemu', also included in this package.
\end{verbatim}

\subsection{Конфигурационный файл домена}
В терминологии Xen гостевые домены, исполняющиеся в режиме аппаратной виртуализации называются HVM-доменами. 
Для облегчения процесса конфигурирования такого домена служит образцово-показательный конфигурационный файл \texttt{/etc/xen/xmexample.hvm} (путь может отличаться).
В нём помимо опций использующихся в паравиртуальных доменах 
есть и сугубо специфические:
\begin{itemize}
\item  \textbf{kernel} -- VMX firmware loader, /usr/lib/xen/boot/vmxloader
\item  \textbf{builder} -- Функции сборки домена. VMX-домены используют vmx builder
\item  \textbf{acpi} -- Задействует ACPI VMX-домена, по умолчанию равно \dq{}0\dq{} (отключено)
\item  \textbf{apic} -- Задействует APIC VMX-домена, по умолчанию равно \dq{}0\dq{} (отключено)
\item  \textbf{pae} -- Задействует PAE VMX-домена, по умолчанию равно \dq{}0\dq{} (отключено)
\item  \textbf{vif} -- Опционально определяет MAC адрес и/или режим моста для сетевого интерфейса. Если значение MAC не указано, то назначается случайный адрес. Есть возможность задать параметр type=ioemu для использования ioemu в VMX NIC. Если это значение не определено, то vbd используется как в паравиртуальных(\dq{}нормальных\dq{}, с модифицированным ядром) доменах.
\item  \textbf{disk} -- Определяет дисковые устройства, к которым гостевой домен должен иметь доступ. Если для домена используется физический носитель в качестве диска, то он должен быть описан строкой типа:
\end{itemize}

\begin{verbatim}
phy:UNAME,ioemu:DEV,MODE,
\end{verbatim}

где \textbf{UNAME} -- имя устройства, \textbf{DEV} -- имя диска, как его видит домен и \textbf{MODE} принимает значения \textbf{r} для read-only и \textbf{w} для read-write. Если это значение не определено, то ioemu используется как паравиртуальных доменах.

Если используется образ диска, то строка принимает вид:

\begin{verbatim}
file:FILEPATH,ioemu:DEV,MODE
\end{verbatim}

Если используется больше одного диска, то они разделяются запятой. Например:

\begin{verbatim}
disk = ['file:/var/images/image1.img,ioemu:hda,w', 'file:/var/images/image2.img,ioemu:hdb,w']
\end{verbatim}

\begin{itemize}
\item  \textbf{cdrom} -- Образ CD-ROM. По умолчанию, для Domain0 это значение равно /dev/cdrom. Внутри VMX-домена CD-ROM будет виден как /dev/hdc.
\item  \textbf{boot} -- Загрузка с floppy (a), hard disk (c) или CD-ROM (d).
\item  \textbf{device\_model} -- Инструмент эмуляции устройств для VMX-домена. Могут быть изменены параметры, приведенные ниже.
\item  \textbf{sdl} -- Задействует библиотеку SDL для отображения графики, по умолчанию равно \dq{}0\dq{} (отключено)
\item  \textbf{vnc} -- Задействует библиотеку VNC для отображения графики, по умолчанию равно \dq{}0\dq{} (отключено)
\item  \textbf{vncviewer} -- Если vnc=1 и vncviewer=0, пользователь может использовать vncviewer для подключения к VMX-домену. Например:
\end{itemize}

\begin{verbatim}
$ vncviewer domain0_IP_address:VMX_domain_id
\end{verbatim}

\begin{itemize}
\item  \textbf{ne2000} -- Задействует режим совместимости ne2000, по умолчанию равно \dq{}0\dq{} (отключено, используется pcnet)
\item  \textbf{serial} -- Перенаправление последовательных портов гостевого домена на реальное устройство.
\item  \textbf{usb} -- Включение поддержки USB без указания специфического устройства. По умолчанию эта функция отключена, в случае же определения параметра usbdevice, ее необходимо задействовать.
\item  \textbf{usbdevice} -- Включение поддержки конкретных устройств. Например, поддержка мыши PS/2 через USB:
\end{itemize}

\begin{verbatim}
usbdevice='mouse'
\end{verbatim}

\begin{itemize}
\item  \textbf{localtime} -- Установка локального времени. По умолчанию равно \dq{}0\dq{}, т.е UTC
\item  \textbf{enable-audio} -- Поддержка звука. Находится в разработке.
\item  \textbf{full-screen} -- Поддержка полноэкранного режима. Находится в разработке.
\item  \textbf{nographic} -- Другой способ перенаправить вывод на последовательный порт. В этом случае опции \rq{}sdl\rq{} или \rq{}vnc\rq{} не работают. Использование данного режима не рекомендуется.
\end{itemize}

\subsection{Проверка на поддержку VMX}
После загрузки самого Dom0 убедимся в наличии поддержки VMX (процессоры Intel):

\begin{verbatim}
# xm dmesg | grep VMX
(XEN) VMXON is done
(XEN) VMXON is done
...
(XEN) VMXON is done
(XEN) VMXON is done
(XEN) VMXON is done
#
\end{verbatim}

Если используется процессор AMD:

\begin{verbatim}
# xm dmesg | grep -i svm
(XEN) AMD SVM Extension is enabled for cpu 0.
(XEN) AMD SVM Extension is enabled for cpu 1.
\end{verbatim}

В общем случае:

\begin{verbatim}
# xm info | grep caps
hw_caps                : 178bfbff:ebd3fbff:00000000:00000010:00002001:00000000:0000001f
xen_caps               : xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p
\end{verbatim}

hvm-3.0-x86\_32 говорит о том, что XEN успешно обнаружил процессор, который поддерживает технологии Intel VT или AMD-V.

Если у вас другое сообщение, то проверьте настройки BIOS и задействуйте поддержку аппаратной виртуализации, 
если она выключена.

\subsection{Создание дискового раздела для гостевой системы}
Создаем образ диска Xen:

\begin{verbatim}
    # mkdir -p /root/xenimages
    # cd /root/xenimages
    # dd if=/dev/zero of=WS128.img bs=1M count=4096
\end{verbatim}

Также необходимо создать iso-образ системы WinXP -- ServicePack2. В данном случае, разместим его в каталоге \texttt{/root/xenimages}.

На основе эталонного файла конфигурации создадим свой собственный:

\begin{verbatim}
    # cat /etc/xen/winXP128
    kernel = "/usr/lib/xen/boot/hvmloader"
    builder='hvm'
    memory = 512
    name = "WinXP128"
    vcpus=1
    pae=0
    acpi=0
    apic=0
    cpus = ""
    vif = [ 'type=ioemu, bridge=xenbr0' ]
    disk = [ 
      'file:/root/xenimages/winXP128.img,ioemu:hda,w',
      'file:/root/xenimages/en_winxp_pro_with_sp2.iso,ioemu:hdc:cdrom,r'
    ]
    on_poweroff = 'destroy'
    on_reboot   = 'destroy'
    on_crash    = 'destroy'
    device_model = '/usr/lib/xen/bin/qemu-dm'
    boot='d'
    sdl=0
    vnc=1
    vncviewer=0
    stdvga=0
    serial='pty'
    ne2000=0
\end{verbatim}

Обратите внимание на то, что указан параметр boot=\rq{}d\rq{}, что необходимо для установки. Впоследствии его необходимо заменить на \dq{}boot=\rq{}c\rq{}\dq{}. Доступ к гостевому домену будет осуществляться через VNC, использование SDL не предполагается.

\subsection{Запуск домена и инсталляция гостевой системы}
Начинаем установку и подсоединяемся к домену с помощью VNC -- сразу после создания домена подключаемся к нему с помощью vncviewer.

\begin{verbatim}
# xm create -c /etc/xen/winXP128
Using config file "/etc/xen/winXP128".
Started domain WinXP128
\end{verbatim}

Подключение к VNC:

\begin{verbatim}
% vncviewer vermont:1
\end{verbatim}

С установкой могут быть проблемы. Можно попробовать решить проблему так: на экране установки, предлагающем нажать F6 для установки SCSI или RAID контроллера, надо нажать F5 и выбрать пункт \texttt{Standard PC} из предложенного меню.

\begin{verbatim}
ACPI Multiprocessor PC 
ACPI Uniprocessor PC 
Advanced Configuration and Power Interface (ACPI) PC 
Compaq SystemPro Multiprocessor or 100% Compatible PC 
MPS Uniprocessor PC 
MPS Multiprocessor PC 
Standard PC 
Standard PC with C-Step i486 
Other
\end{verbatim}

После того, как программа установки Windows отформатирует диск и скопирует на него необходимые файлы, выполняется перезагрузка. Согласно нашему файлу конфигурации, виртуальная машина будет закрыта и нам предоставится удачная возможность отредактировать параметр \texttt{boot=\rq{}c\rq{}}, после чего запускаем виртуальную машину и соединяемся с консолью:

\begin{verbatim}
# xm create -c /etc/xen/winXP128
Using config file "/etc/xen/winXP128".
Started domain WinXP128
\end{verbatim}

VNC:

\begin{verbatim}
% vncviewer vermont:2
\end{verbatim}

Обратите внимание на параметр \rq{}:2\rq{}, так как изменился XenID (посмотреть его можно командой xm list). Не особо волнуйтесь насчет проблем VNC при работе с мышью. Как только вы завершите установку можно настроить службу терминального доступа и использовать Windows Remote Desktop или rdesktop. Если вы по-прежнему хотите использовать VNC, то обратитесь к этому разделу руководства.


\subsection{Вопросы и ответы}
Ниже приводятся выдержки из обсуждения \url{http://forum.sysadmins.ru/viewtopic.php?p=7941589\#7941589}, 
в котором были затронуты многие распространённые вопросы, касающиеся запуска Windows в HVM-домене.
Стиль дискуссии сохранён.

\textbf{Вопрос: Виртуалка начала бутиться с сидюка/винта, но при этом весь проц съела и черный экран виртуалки. Аптайм виртуалки увеличивается, значит сама виртуалка не повисла, наверно. Есть какие-нибуть идеи?}

Да, скорее всего виртуалка нормально работает.
вы подключаетесь к экрану виртуалки через VNC,
при смене разрешения экрана (а при загрузке винды
именно это и происходит) его нужно передергивать,
то есть закрывать и подключаться вновь.

\textbf{Вопрос: эникей не успевал нажать при буте с сидюка и виртуалка пытлас бутиться с пустого винта. А как вообще указать откуда она бутится?}

Да, в соответствии с вашим конфигом система пытается загрузиться с
привода CDROM.

\begin{itemize}
\item  boot=\rq{}d\rq{} — загружатсья с CDROM\rq{}а (мнемоническое правило — «с диска D:» )
\item  boot=\rq{}c\rq{} — загружатсья с диска (мнемоническое правило — «с диска C:» )
\end{itemize}

\textbf{Вопрос: а звук в виртуалке не настраивал? Или хотя-бы через rdesktop?}

Звук настраивали и всё работет.
Звук действительно слушается именно через rdesktop,
впрочем что и касается основной работы (кроме инсталляци) — работать лучше rdesktop.

При заходе через \textit{rdesktop}, для того чтобы 
звук проигрывался локально, используйте ключ \textit{-rsound}:
\begin{verbatim}
  rdesktop -rsound 192.168.1.1
\end{verbatim}

VNC (а точнее libvnc), с которым скомпилен Xen имеет множество ограничений и его стоит рассматривать как аврийный вариант. А так конечно же заходить на систему через rdesktop, сразу же после того как на ней поднимается стек TCP/IP. (или в крайнейм случае поставить полноценный VNC-сервер внутрь домена с Windows).

Если вы всё же используете встроенный VNC, то желательно отключить аппаратное ускорение мыши в Control Panel, или перейти на эмуляцию другого устройства (не мыши, а планшета) в Xen.
Иначе у вас будет два курсора, одному из которых будет соответствовать ваша реальная мышь, а вторым виртуальная.

\textbf{Вопрос: Как поменять сд-имедж или диск физического привода не перезапуская виртуалки?}

Есть два метода. Один для дома для семьи (и он по умолчанию в новых версиях Xen блокируется и его надо явно разрешать) и второй
промышленный.

Первый: в VNC окне нажать ctr-alt-2 что переключит вас на консоль qemu, дальше использовать eject и прочие команды (я думаю там всё понятно, если не понятно, спрашивайте), а потом когда выполнили свое дело, нажать ctrl-alt-1 (не F1! не путайте!) для возврата в консоль (графическую) гостевой операционной системы (подробнее: (Xen-devel) About change of CD-ROM).

Второй: использовать xm block-attach, xm block-detach
(подробнее: Xen-block-attach).

Второй метод намного более правильный и более секюрный (первый блокируется из соображений безопасности ибо из консоли qemu можно намутить с доменом всё что угодно, и естественно, что это абсолютно не зависит от того, под каким юзером вы вошли в гостевой домен).
Кроме того, второй метод позволяет менять не только сидюки, но и винту и сетевышки и всё что вашей душеньке угодно (особенно это касается PV-доменов, ибо у HVM с этим простора всё же поменьше).

\textbf{Вопрос: ОЗУ на серваке 4 или больше гигов?  А то у меня х86\_64, с 4гигами ядро вешается на такой строчке:\dq{}agpgart: Detected an Intel 965G Chipset.\dq{}, с 3\rq{}мя гигами -- нормально.}

Это нормально.
Точнее, это не совсем нормально, но это возможно.

Можно попробовать следующие решения:

\begin{enumerate}
\item  Использовать параметр ядра agp=off
\item  Добавить модуль intel\_agp в чёрный список незагружаемых модулей
\item  Включить в BIOS фичу Memory Remap Feature (если она есть); это должно быть в конфигурации северного моста.
\item  Использовать AMD 
\end{enumerate}

\textbf{Вопрос: На сервере 8Гб памяти, но больше 4 на гостевую систему в свободной версии xen не выделить(да и незачем особо). Поддержка PAE включена.}

Насколько я понимаю, речь идёт о гостевом HVM-домене (потому что если это PV-домен и он не видит >4G, то это странно вдвойне).
Вероятно, вы имеете в виду баг \#971, из-за которого дейтвительно нельзя было увидеть больше 4G памяти в HVM домене.
Если так, то он уже давно пофикшен и этой проблемы быть не должно.

Проверьте, что у вас:
\begin{enumerate}
\item  Если в HVM-домене запускается Linux, ядро под которым запускается HVM-домен, имеет поддержку PAE. (это HVM, поэтому может работать и ядро без PAE на хосте с PAE, но конечно видеть >4G оно при этом не будет)
\item  Если в HVM-домене запускается Windows, в конфигурации загрузчика (boot.ini) присутствует ключ /PAE
\end{enumerate}

\subsection{Дополнительная информация}
\subsubsection{Описание процесса запуска Windows в домене XenU}

\begin{itemize}
\item \htmladdnormallinkfoot{Windows XP в Xen}{http://xgu.ru/wiki/Windows\_XP\_в\_Xen} (рус.)
\item \htmladdnormallinkfoot{Xen w/ IntelVT->Windows Success Report}{http://lists.xensource.com/archives/html/xen-users/2006-06/msg00452.html} (англ.)
\item \htmladdnormallinkfoot{Запуск Windows XP в окружении Xen3}{http://dreamcatcher.ru/docs/xen3\_windows.html} (рус.)
\item \htmladdnormallinkfoot{How to Install Windows on Xen 3.0}{http://www.xensource.com/files/xen\_install\_windows.pdf} (англ.)
\item \htmladdnormallinkfoot{Building Xen from source on Ubuntu to run Windows}{http://linuxvirtualization.com/articles/2006/08/03/xen-on-ubuntu-for-windows} (англ.)
\end{itemize}

\subsubsection{Проблемы производительности в виртуализированных машинах Windows}
\begin{itemize}
\item \htmladdnormallinkfoot{poor harddisk performance HVM domain}{http://lists.xensource.com/archives/html/xen-users/2006-05/msg00097.html} (англ.)
\item \htmladdnormallinkfoot{By 2009, there will be three competitive hypervisor architectures ...}{http://www.stanford.edu/class/ee380/Abstracts/060125-stanford0601.pdf} (англ.)
\item \htmladdnormallinkfoot{Intel® Virtualization Technology for Directed I/O}{http://www.intel.com/technology/itj/2006/v10i3/2-io/1-abstract.htm} (англ.)
\item \htmladdnormallinkfoot{Optimizing Network Virtualization in Xen}{http://www.usenix.org/events//usenix06/tech/menon/menon\_html/index.html}. Aravind Menon, EPFL, Switzerland; Alan L. Cox, Rice university, Houston; Willy Zwaenepoel, EPFL, Switzerland. (англ.)
\end{itemize}

