\section{Linux в Xen}

На этой странице описана процедура подготовки
гостевой системы под управлением Linux
для работы в качестве пользовательского домена Xen
(domain U).

\subsection{Начальные требования}
<graphviz>
digraph G \{
\begin{verbatim}
node [shape=rectangle];
a [label="Подготовка\nдомена 0"];
b [label="Подготовка\nдомена U",bgcolor=cyan,style=filled];
c [label="Запуск и эксплуатация\nсистемы"];
a -> b;
b -> c;
\end{verbatim}
\}
</graphviz>

Для выполнение описанных ниже действий
необходимо наличие проинсталлированной и настроенной 
хост-системы Xen (домена 0).
Как это сделать описано на странице Инсталляция Xen.

Предполагается, что в домене 0 установлен Debian GNU/Linux.
Для других дистрибутивов некоторые действия будут выполняться
иначе.

\subsection{Подготовка образа гостевой системы}
\subsubsection{Подготовка дисковых разделов для использования в качестве дисков виртуальной машины}
Для того чтобы разделы виртуальной машины
соответствовали дисковым разделам реальной машины,
используйте следующие шаги:

\begin{verbatim}
node [shape=rectangle];
a [label="Подготовка\nдомена 0"];
b [label="Подготовка\nдомена U",bgcolor=cyan,style=filled];
c [label="Запуск и эксплуатация\nсистемы"];
a -> b;
b -> c;
\end{verbatim}

В том случае, если в виртуальной машине должно быть 
несколько дисковых разделов,
подготовьте их.
Например, для /usr:

\begin{verbatim}
node [shape=rectangle];
a [label="Подготовка\nдомена 0"];
b [label="Подготовка\nдомена U"];
c [label="Запуск и эксплуатация\nсистемы",bgcolor=cyan,style=filled];
a -> b;
b -> c;
\end{verbatim}

Если вам необходимо пространство подкачки (swap) в виртуальной машине, 
подготовьте его с помощью команды mkswap:

\begin{verbatim}
# mkswap /dev/hdX
\end{verbatim}

\subsubsection{Подготовка файлов для использования в качестве диска виртуальной машины}
Создайте файл для использования в качестве основного
диска виртуальной машины.

\begin{verbatim}
# dd if=/dev/zero of=/xen/images/debian-host1.img bs=1M count=<size_in_MB>
# mkfs.ext3 /xen/images/debian-host1.img
# mount -o loop /srv/debian-host1.img /mnt
\end{verbatim}

В том случае, если в виртуальной машине должно быть 
несколько дисковых разделов,
подготовьте их.
Например, для /usr:

\begin{verbatim}
# dd if=/dev/zero of=/xen/images/debian-host1-usr.img bs=1M count=<size_in_MB>
# mkfs.ext3 /xen/images/debian-host1-usr.img
# mkdir /mnt/usr
# mount -o loop /xen/images/debian-host1-usr.img /mnt/usr
\end{verbatim}

Если вам необходимо пространство подкачки (swap) в виртуальной машине, 
подготовьте его с помощью команды mkswap:

\begin{verbatim}
# mkswap /dev/hdX
\end{verbatim}

\subsubsection{Подготовка виртуальной системы под управлением Debian GNU/Linux}

\paragraph{Инсталляция ОС Debian GNU/Linux}
Этот этап может быть выполнен проще, 
если использовать xen-tools.
Ниже показано, как провести инсталляцию
системы вручную.

Смотрите таже \url{http://www.debuntu.org/2006/05/14/51-how-to-installing-debian-etch-from-a-running-debian-based-system/1/}.

Запустите \textbf{debootstrap} для инсталляция базы
системы:

\begin{verbatim}
# debootstrap sarge /mnt http://debian.org.ua/debian
\end{verbatim}

Скопируйте пакет ядром для работы с Xen,
который был подготовлен ранее,
в новую виртуальную машину:

\begin{verbatim}
# cp linux-xen0-2.6.16-xen_10.00.Custom_i386.deb /mnt/root
\end{verbatim}

Сделайте новую файловую систему корневой (с помощью chroot):

\begin{verbatim}
# chroot /mnt /bin/bash
\end{verbatim}

Проинсталлируйте пакет с ранее подготовленным
ядро Xen:

\begin{verbatim}
# dpkg -i /root/linux-xen0-2.6.16-xen_10.00.Custom_i386.deb
\end{verbatim}

Измените запись, соответствующую корневой системе в файле /etc/fstab:

\begin{verbatim}
# vi /etc/fstab
/dev/hda1       /               ext3    defaults,errors=remount-ro 0       1
\end{verbatim}

Если используется несколько дисковых разделов
в виртуальной машине, перечислите их:

\begin{verbatim}
/dev/hda2      /usr             ext3    defaults                   0 2
/dev/hda3      /var             ext3    defaults                   0 2
...
\end{verbatim}

Запустите программу \textbf{base-config} для установки базовой
системы Debian.

\begin{verbatim}
# base-config new
\end{verbatim}

Измените конфигурацию сети в виртуальной машине:

\begin{verbatim}
# vi /etc/network/interfaces
# vi /etc/resolv.conf
# vi /etc/hosts
\end{verbatim}

Отключите использование TLS, 
в противном случае работа системы может сильно замедлиться.

\begin{verbatim}
# mv /lib/tls /lib/tls.disabled
\end{verbatim}

В том случае, если используется дистрибутив Etch, 
проинсталлируйте \texttt{libc6-xen}.

\begin{verbatim}
# apt-get install libc6-xen
\end{verbatim}

Отключите лишние терминалы getty, 
а первый терминал направьте на файл \texttt{/dev/console}
вместо \texttt{/dev/tty1}:

\begin{verbatim}
1:2345:respawn:/sbin/getty 38400 /dev/console
#2:23:respawn:/sbin/getty 38400 tty2
#3:23:respawn:/sbin/getty 38400 tty3
#4:23:respawn:/sbin/getty 38400 tty4
#5:23:respawn:/sbin/getty 38400 tty5
#6:23:respawn:/sbin/getty 38400 tty6
\end{verbatim}

Если в виртуальной машине будут загружаться модули ядра, 
установить пакет \texttt{module-init-tools}
(обязательно для ядер 2.6 domU).

\begin{verbatim}
# apt-get install module-init-tools
\end{verbatim}

На этом инсталляция ОС в виртуальной машине завершена, 
и можно завершить работу оболочки с изменённой корневой системой (chrooted shell).

\begin{verbatim}
# exit
\end{verbatim}

Если вы создавали несколько разделов в виртуальной машине, 
размонтируйте их, начиная с самой глубокой.

\begin{verbatim}
# umount /mnt/usr
# umount /mnt/var
\end{verbatim}

После чего размонтируйте корневую файловую систему
виртуальной машины.

\begin{verbatim}
# umount /mnt
\end{verbatim}

\paragraph{Конфигурирование виртуальной машины}
Необходимо создать конфигурационный файл виртуальной
машины.
Пусть виртуальная машина называется debian-vm0.

\begin{verbatim}
# vi /etc/xen/debian-vm0
# Kernel to use
kernel = "/boot/xen0-linux-2.6.16-xen"
# Memory in megabytes
memory = 128
# Your domain's name
name = "debian-vm0"
# Root device
root = "/dev/hda1 ro"
# Don't forget to specify your bridge correctly here
vif = [ 'mac=aa:00:00:00:00:d2, bridge=br-xen' ]
\end{verbatim}

В том случае, если использует физический дисковый раздел:

\begin{verbatim}
disk = [ 'phy:/dev/hdX,hda1,w' ]
\end{verbatim}

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

\begin{verbatim}
disk = [ 'phy:/dev/hdX,hda1,w', 'phy:/dev/hdY,hda2,w' ]
\end{verbatim}

Если вместо раздела используется файл,
конфигурация дисковой подсистемы выглядит так:

\begin{verbatim}
disk = [ 'file:/xen/images/debian-host1.img,hda1,w' ]
\end{verbatim}

В том случае, если используется несколько файлов, 
строка должна выглядеть так:

\begin{verbatim}
disk = [ 'file:/xen/images/debian-host1.img,hda1,w', 'file:/xen/images/debian-host1-usr.img,hda2,w' ]
\end{verbatim}

Обратите внимание на то, чтобы записи о диска в конфигурации
виртуальной машины соответствовали файлу \texttt{/etc/fstab}
операционной системы этой машины.

\subsubsection{Инсталляция и настройка Fedora Core в domU}

При условии, что домен 0 работает под управлением Debian GNU/Linux, 
а образ гостевой системы подмонтирован в каталог /mnt,
процедура инсталляции выглядит следующим образом:

\begin{verbatim}
%# apt-get install yum
%# yum -c /tmp/yum-xen.conf --installroot=/mnt -y groupinstall Base
\end{verbatim}

Пример конфигурационного файла \texttt{yum-xen.conf} (вы можете использовать другой репозиторий и другой уровень отладки):

\begin{verbatim}
[main]
cachedir=/var/cache/yum
debuglevel=2
logfile=/var/log/yum.log
exclude=*-debuginfo
gpgcheck=0
obsoletes=1
reposdir=/dev/null

[base]
name=Fedora Core 6 - i386 - Base
#mirrorlist=http://fedora.redhat.com/download/mirrors/fedora-core-6
baseurl=http://redhat.download.fedoraproject.org/pub/fedora/linux/core/6/i386/os/
enabled=1

[updates-released]
name=Fedora Core 6 - i386 - Released Updates
#mirrorlist=http://fedora.redhat.com/download/mirrors/updates-released-fc6
baseurl=http://redhat.download.fedoraproject.org/pub/fedora/linux/core/updates/6/i386/
enabled=1
\end{verbatim}

Если при инсталляции вы получаете ошибку

\begin{verbatim}
Failed to add groups file for repository: base
Error: No Groups on which to run command
\end{verbatim}

то модифицируйте код \textit{yum} следующим образом:

\begin{verbatim}
# cp /usr/share/python-support/yum/yum/comps.py{,.ORIG}
# vi /usr/share/python-support/yum/yum/comps.py        
# diff /usr/share/python-support/yum/yum/comps.py{.ORIG,}
124c124
<                 if type not in ('mandatory', 'default', 'optional'):
---
>                 if type not in ('mandatory', 'default', 'optional', 'conditional'):
143c143
<                 if type not in ('mandatory', 'default', 'optional'):
---
>                 if type not in ('mandatory', 'default', 'optional', 'conditional'):
\end{verbatim}

Установленную систему можно доработать.

\textit{Создать некоторые каталоги и файлы устройств.}

\begin{verbatim}
%# mkdir /mnt/{dev,proc,etc}
%# for i in console null zero ; do /sbin/MAKEDEV -d /mnt/dev -x $i ; done
\end{verbatim}

\textit{Отключить TLS}.

\begin{verbatim}
%# mv /mnt/lib/tls /mnt/lib/tls-disabled
\end{verbatim}

\textit{Создать /etc/fstab}

\begin{verbatim}
%# cat <<EOL > /mnt/etc/fstab
/dev/sda1               /                       ext3    defaults 1 1
none                    /dev/pts                devpts  gid=5,mode=620 0 0
none                    /dev/shm                tmpfs   defaults 0 0
none                    /proc                   proc    defaults 0 0
none                    /sys                    sysfs   defaults 0 0
/dev/sda2               /mnt                    ext3    defaults 1 2
/dev/sda3               swap                    swap    defaults 0 0
EOL
\end{verbatim}

\textit{Настроить сетевые интерфейсы}.

\begin{verbatim}
%# cat <<EOL > /mnt/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=localhost.localdomain
EOL

cat <<EOL > /mnt/etc/sysconfig/network-scripts/ifcfg-eth0
ONBOOT=yes
DEVICE=eth0
BOOTPROTO=dhcp
EOL
\end{verbatim}

\textit{Скопировать модули ядра}

\begin{verbatim}
%# cp -R /lib/modules/2.6.*xen* /mnt/lib/modules/
\end{verbatim}

\textit{Установить пароль root\rq{}а}

\begin{verbatim}
%$ sudo chroot /mnt
bash-3.1# pwconv
bash-3.1# passwd
Changing password for user root.
New UNIX password: 
Retype new UNIX password: 
passwd: all authentication tokens updated successfully.
bash-3.1# exit
\end{verbatim}

\textit{Отключить сообщения об ошибках ядра на консоль} (не обязательно)

\begin{verbatim}

\end{verbatim}

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

\begin{verbatim}
%# umount /mnt
%# xm console -c fc
\end{verbatim}

(здесь \textit{fc} это конфигурационный файл домена).

\begin{center} \resizebox{10cm}{!}{\includegraphics{/var/lib/mediawiki/images/9/90/Fc-in-xen.png}}\\ \textit{}\end{center}

\subsubsection{Инсталляция и настройка других дистрибутивов Linux в domU}
\begin{itemize}
\item  Centos5 — описание процедуры подготовки domU для Centos5
\end{itemize}

\subsubsection{Инсталляция Debian из-под других дистрибутивов Linux}

\begin{verbatim}
%# wget http://ftp.de.debian.org/debian/pool/main/d/debootstrap/debootstrap-udeb_0.3.3_i386.udeb
%# ar t debootstrap-udeb_0.3.3_i386.udeb
%# mkdir debootstrap
%# cd debootstrap
%# tar xvzf ../data.tar.gz
\end{verbatim}

После этого инсталляция с помощью \textit{./deboostrap} выполняется как обычно.

\subsection{Запуск виртуальной машины}
<graphviz>
digraph G \{
\begin{verbatim}
node [shape=rectangle];
a [label="Подготовка\nдомена 0"];
b [label="Подготовка\nдомена U"];
c [label="Запуск и эксплуатация\nсистемы",bgcolor=cyan,style=filled];
a -> b;
b -> c;
\end{verbatim}
\}
</graphviz>

\begin{verbatim}
# xm create -c debian-vm0
\end{verbatim}

Данная команда запустит новую виртуальную машину и создаст
подключенную к ней консоль (ключ -c).
Можно войти в систему от имени пользователя 
root и настроить сетевой интерфейс eth0.

Обратите внимание на то, что на консоли (\texttt{/dev/console})
по умолчанию комбинация клавиш Ctrl-C не настроена 
для прерывания процессов.

Отключиться от консоли виртуальной машины вернуться в
терминал, из которого выполнялось подключение/запуск,
можно с помощью комбинации Ctrl-].

Вернуться на отключенную консоль
можно с помощью команды:

\begin{verbatim}
# xm console debian-vm0
\end{verbatim}

Остановить домен можно командой:

\begin{verbatim}
# xm shutdown -H debian-vm0
\end{verbatim}

Выключить домен (как будто бы вырубить виртуальную машину
по питанию), можно с помощью команды:

\begin{verbatim}
# xm destroy debian-vm0
\end{verbatim}

Для получения полного списка команд, таких как shutdown, destroy
и т.д. введите:

\begin{verbatim}
# xm help
\end{verbatim}

Для того чтобы виртуальная машина (domU) загружалась автоматически,
когда загружает основная система (dom0),
необходимо сделать ссылку на 
конфигурационный файл виртуальной машины:

\begin{verbatim}
# ln -s <configfile> /etc/xen/auto/
\end{verbatim}

\subsection{Дополнительные вопросы}
\subsubsection{Сборка ядра Linux под Xen в Debian}
<dl><dd> \textit{Основная страница: \textbf{Сборка ядра Linux под Xen в Debian}}
</dd></dl>

Ядро Linux, с поддержкой Xen, находящееся в репозитории Debian GNU/Linux
собрано с поддержкой PAE. 
С другой стороны, большое количество систем (FreeBSD, NetBSD, Plan 9 и др.), работающих как гостевые системы в паравиртуальном домене Xen
не поддерживают PAE. 
В этом случае потребуется пересобрать ядро домена 0
без поддержки PAE.
Пересборка ядра может потребоваться и в других случаях.

\subsection{Возможные проблемы при подготовке и запуске}
Множество проблем, с которыми можно столкнуться
при подготовке и запуске гостевой системы Xen,
описано на странице Xen FAQ.

\subsubsection{Возможные проблемы с udev}
При старте домена может возникнуть такая проблема:
домен не стартует, на экран выдаётся сообщение
об ошибке:

\begin{verbatim}
Device 768 (vbd) could not be connected. Hotplug scripts not working.
\end{verbatim}

\textit{Номер устройства (768) может отличаться.}

Если такая проблема возникла, причём она не пропадает
ни при отключении сетевых интерфейсов в виртуальной машине;
ни при изменении конфигурации дисков, проблема может быть связана с \textbf{udev}.

Убедитесь, что udev достаточно новый.
Последние версии udev находятся здесь: http://kernel.org/pub/linux/utils/kernel/hotplug/

Проверьте, есть ли в конфигурации udev правила xen.

Если нет, нужно их добавить.
Нужно создать файл \texttt{xen-backend.rules}
в каталоге \texttt{/etc/udev/rules.d} следующего содержания:

\begin{verbatim}
# cat /etc/udev/rules.d/xen-backend.rules
SUBSYSTEM=="xen-backend", KERNEL=="tap*", RUN+="/etc/xen/scripts/blktap $env{ACTION}"
SUBSYSTEM=="xen-backend", KERNEL=="vbd*", RUN+="/etc/xen/scripts/block $env{ACTION}"
SUBSYSTEM=="xen-backend", KERNEL=="vtpm*", RUN+="/etc/xen/scripts/vtpm $env{ACTION}"
SUBSYSTEM=="xen-backend", KERNEL=="vif*", ACTION=="online", RUN+="$env{script} online"
SUBSYSTEM=="xen-backend", KERNEL=="vif*", ACTION=="offline", RUN+="$env{script} offline"
SUBSYSTEM=="xen-backend", ACTION=="remove", RUN+="/etc/xen/scripts/xen-hotplug-cleanup"
KERNEL=="evtchn", NAME="xen/%k"
\end{verbatim}

Если такой файл \texttt{xen-backend.rules} уже есть,
можно переименовать его или создать символическую ссылку,
содержащую номер в названии. Правило должно грузиться предпоследним.

\begin{verbatim}
# cd /etc/udev/rules.d
# mv xen-backend.rules 92-xen-backend.rules
\end{verbatim}

После этого нужно перезапустить udev и попробовать 
стартануть домен снова.

\begin{verbatim}
# ps aux | grep udev
root      3321  0.0  0.2   1768   516 ?        S<s  22:51   0:00 udevd --daemon
root      9349  0.0  0.2   1860   640 pts/2    S+   23:27   0:00 grep udev
# udevd --daemon
# ps aux | grep udev
root      9352  0.0  0.2   1768   516 ?        S<s  23:28   0:00 udevd --daemon
root      9356  0.0  0.2   1860   640 pts/2    S+   23:29   0:00 grep udev
\end{verbatim}

Дополнительные сведения о проблеме: \url{http://marc.theaimsgroup.com/?l=xen-users\&m=114319459529175\&w=2}

