\section{Преобразование независимых систем в виртуальные домены Xen}

Здесь описывается как выполнять систему, установленную на одном компьютере, 
внутри домена Xen или с помощью эмулятора QEMU, исполняющегося на другом компьютере.
Может быть полезно при консолидации и виртуализации систем, 
при работе с устаревшими системами, при тестировании.

\subsection{Идея}
В связи с постоянным увеличением вычислительной мощности и объёма оперативной памяти машин, наблюдающимся в настоящее время, большую популярность приобретает идея виртуализации систем. В особенности популярным этот подход становится 
при построении серверной инфраструктуры.

Виртуализированная серверная инфраструктура редко строится с нуля. Чаще всего существует парк физических (не виртуализированных) серверов, которые безостановочно работают, выполняя возложенные на них задачи.
Нередко для хранения информации (операционной системы, программного обеспечения и данных) эти серверы используют не внешние хранилища, а собственные жётские
диски.

Виртуализация сервера в данном случае может быть выполнена одним из указанных способов:
\begin{enumerate}
\item  \textit{Миграция служб.} В виртуальной системе новый сервер разворачивается с нуля. Затем на него переносятся службы старого сервера. После чего старый сервер выводится из эксплуатации.
\item  \textit{Миграция операционной системы.} Старый сервер останавливается, а затем на нём по сети (с компакт-диска или другого внешнего носителя информации) запускается другая операционная система, которая экспортирует установленный в сервере жёсткий диск системе виртуализации. Система виртуализации исполняет операционную систему, проинсталированную на этом диске. При условии, что виртуализация удалась, данные переносятся на хранилище системы виртуализации и старый сервер выключается.
\end{enumerate}

Последний способ проще и быстрее, но он должен допускать возможность
временной, непродолжительной остановки сервера (на время запуска другой операционной системы, экспорта, запуска виртуальной машины поверх экспортированных данных).
В случае правильного выполнения всех операций простой в этом случае составит до 10 минут.

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

Ниже детально рассматривается процесс миграции, 
выполненный по второму сценарию.

\subsection{Постановка задачи}
Пусть есть две системы:
\begin{itemize}
\item  \textit{Старая система}  (old) --- система, которая должна быть экспортирована.
\item  \textit{Xen-система} (xen) --- система, внутри которой должен исполняться домен под управлением экспортированной системы.
\end{itemize}

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

\subsection{Запуск второй операционной системы в домене Xen установленной на том же компьютере}
Рассмотрим для начала простейший случай, когда на одном компьютере 
установлено две операционные системы.
Он отличается от интересующей нас задачи тем, что не нужно 
выполнять экспорт диска как сетевого устройства.

Если на компьютере установлены две операционные системы, 
и одна из них это Xenolinux (Xen + Linux), 
то вторую можно запустить как пользовательский домен Xen.

Запуск систем, не подготовленных для использования в паравиртуальном домене Xen, 
внутри Xen возможен только в том случае, 
если центральный процессор системы поддерживает аппаратную виртуализацию.
В противном случае вместо Xen можно использовать QEMU.

Операционная система, загруженная в родном режиме:

\begin{center} \resizebox{10cm}{!}{\includegraphics[width=12cm]{/var/lib/mediawiki/images/2/29/Win2003_native.JPG}}\\ \textit{}\end{center}

Конфигурационный файл домена Xen:

\begin{verbatim}
%$ egrep -v '^#|^\ *$' /etc/xen/win2003 
kernel = "hvmloader"
builder='hvm'
memory = 512
shadow_memory = 8
name = "win2003"
acpi=1
vif = [ 'type=ioemu, bridge=br0' ]
disk = ['phy:/dev/hda,hda,w' ]
device_model = 'qemu-dm'
boot="c"
sdl=0
vnc=1
vnclisten="127.0.0.1"
stdvga=0
serial='pty'
soundhw='sb16'
\end{verbatim}

В данном случае операционная система Windows установлена
на жёсткий диск IDE, подключённый в системе в режиме Primary Master 
(блочное устройство \texttt{/dev/hda}).

Старт домена выполняется стандартным образом:

\begin{verbatim}
%# xm create win2003
%# vncviewer 127.0.0.1:0
\end{verbatim}

Здесь вместо 0 может быть указан другой номер, в зависимости от номера
VNC-сеанса, который будет соответствовать заданному домену Xen.
Подробнее см. руководство пользователя Xen.

Домен Xen, загруженный с жёсткого диска:

\begin{itemize}
\item  Процессор AMD 3000+
\item  512 Mb ОЗУ 
\end{itemize}

\begin{figure} 
\includegraphics[width=12cm]{/var/lib/mediawiki/images/b/bc/W2003_xen.png}
\end{figure}

На домен, в котором работает установленная операционная система
распространяются все те же законы, которые распространяются на систему, которая установлена в домен с нуля
традиционным способом.

\subsection{Запуск домена с экспортированного образа}
Если операционная система установлена не локально, 
а на другом компьютере, необходимо каким-то образом его донести системе виртуализации, так что бы, грубо говоря, виртуальный домен увидел диск.

Процедура включает три шага:
\begin{enumerate}
\item  Выполнить бездисковую загрузку старой системы \textit{old} под управлением Linux;
\item  Выполнить экспорт диска загруженной системы \textit{old} с помощью AoE или iSCSI;
\item  На работающей Xen-системе \textit{xen} запустить домен, который будет использовать экспортированный старой машиной.
\end{enumerate}

\subsubsection{Подготовка сервера бездисковой загрузки}
Детально процедура подготовки сервера бездисковой загрузки
описана на странице \htmladdnormallinkfoot{PXE}{http://xgu.ru/wiki/PXE}.
Ниже приводятся только примеры конфигурационных
файлов ключевых систем, использующихся в работе.

\paragraph{DHCP}
Конфигурация демона dhcpd в файле \textbf{/etc/default/dhcp}:

\begin{verbatim}
%$ egrep -v '^#|^\ *$' /etc/default/dhcp 
INTERFACES="br0"
\end{verbatim}

Сам конфигурационный файл \textbf{/etc/dhcpd.conf}:

\begin{verbatim}
%$ egrep -v '^#|^\ *$' /etc/dhcpd.conf 
option domain-name "clinika.com";
option domain-name-servers 192.168.15.254;
option subnet-mask 255.255.255.0;
default-lease-time 600;
max-lease-time 7200;
subnet 192.168.7.0 netmask 255.255.255.0 {
  range 192.168.7.200 192.168.7.220;
  option routers 192.168.7.254;
  filename "pxelinux.0";
}
host clinika {
  hardware ethernet 00:13:8f:49:b0:31;
  fixed-address 192.168.7.253;
}
\end{verbatim}

\paragraph{TFTP}

\begin{verbatim}
%$ egrep -v '^#|^\ *$' /etc/default/tftpd-hpa 
RUN_DAEMON="yes"
OPTIONS="-l -s /var/lib/tftpboot/ltsp/i386/"
\end{verbatim}

\paragraph{PXE}
Наполнение каталога TFTP-сервера.
Здесь присутствуют файлы загрузчика PXELINUX.

\begin{verbatim}
%$ ls -l /var/lib/tftpboot/ltsp/i386/
итого 10690
-rw-r--r-- 1 root root     203 2007-10-04 boot.msg
-rw-r--r-- 1 root root   80023 2007-07-11 config-2.6.21-2-486
lrwxrwxrwx 1 root root      23 2007-10-04 initrd.img -> initrd.img-2.6.21-2-486
-rw-r--r-- 1 root root 3691052 2007-10-04 initrd.img-2.6.21-2-486
-rw-r--r-- 1 root root    9519 2007-10-04 logo.16_1
lrwxrwxrwx 1 root root      20 2007-10-04 nbi.img -> nbi.img-2.6.21-2-486
-rw-r--r-- 1 root root 5019136 2007-10-04 nbi.img-2.6.21-2-486
-rw-r--r-- 1 root root   13944 2007-10-04 pxelinux.0
drwxr-xr-x 2 root root     104 2007-10-05 pxelinux.cfg
-rw-r--r-- 1 root root  780664 2007-07-11 System.map-2.6.21-2-486
lrwxrwxrwx 1 root root      20 2007-10-04 vmlinuz -> vmlinuz-2.6.21-2-486
-rw-r--r-- 1 root root 1319152 2007-07-11 vmlinuz-2.6.21-2-486
\end{verbatim}

Конфигурационный файл загрузчика PXELINUX:

\begin{verbatim}
clint:Dom0~$ cat /var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default
DISPLAY boot.msg
TIMEOUT 150 
DEFAULT vmlinuz
PROMPT 1

LABEL 2.6.21.2
KERNEL vmlinuz
APPEND nfsdir=192.168.7.254:/opt/ltsp/i386 lang=ru ramdisk_size=1000000 
    root=/dev/nfs rw nfsroot=192.168.7.254:/opt/ltsp/i386/ ip=dhcp initrd=initrd.img
\end{verbatim}

\paragraph{Корневая файловая система, загружаемая по сети}
В каталоге \texttt{/opt/ltsp/i386/}
развёрнута операционная система Linux.
Инсталляция выполняется с помощью \textit{debootstrap}
или аналогичным способом.

В системе должны быть установлены пакеты:
\begin{itemize}
\item  vblade
\end{itemize}

\subsubsection{Экспорт диска старой машины по сети}
Сервер, который будет экспортирован, 
перезагружается и загружается 
по сети.

После этого необходимо выполнить следующие действия.

Будем считать, что экспорт выполняется с помощью протокола 
ATA over Ethernet.
Можно использовать другой протокол доступа к диску по сети.

Убедитесь, что загружен модуль \textbf{aoe}:

\begin{verbatim}
ltsp:~# lsmod | grep aoe
aoe                    24416  0
\end{verbatim}

Экспортируйте диск \texttt{/dev/hda} (или другой -- тот, на котором установлена система) с помощью \textbf{vblade}:

\begin{verbatim}
ltsp:~# vblade 1 0 eth0 /dev/hda
pid 3344: e1.0, 78165360 sectors O_RDWR
\end{verbatim}

\subsubsection{Запуск домена с экспортированного образа}
На системе виртуализации
загрузите модуль \textbf{aoe}:

\begin{verbatim}
clint:Dom0~$ ls -l /dev/etherd
ls: /dev/etherd: Heт такого файла или каталога
%# modprobe aoe
aoe: aoe_init: AoE v22 initialised.
aoe: 00138f49b031 e1.0 v400c has 78165360 sectors
%# sudo lsmod | grep aoe
aoe                    23456  0
\end{verbatim}

При этом 
в \texttt{/var/log/messages}
должны появиться сообщения:

\begin{verbatim}
... kernel: aoe: aoe_init: AoE v22 initialised.
... kernel: aoe: 00138f49b031 e1.0 v400c has 78165360 sectors
... kernel:  etherd/e1.0: p2 < p5 p6 p7 p8 p9 > p3
\end{verbatim}

В каталоге \texttt{/dev/etherd}
должны появиться новые файлы устройств, 
соответствующие обнаруженным дискам
ATA over Ethernet:

\begin{verbatim}
%# ls -l /dev/etherd/
итого 0
c-w--w---- 1 root disk 152,   3 2007-10-05 21:46 discover
brw-rw---- 1 root disk 152, 256 2007-10-05 21:57 e1.0
brw-rw---- 1 root disk 152, 258 2007-10-05 21:46 e1.0p2
brw-rw---- 1 root disk 152, 259 2007-10-05 21:46 e1.0p3
brw-rw---- 1 root disk 152, 261 2007-10-05 21:46 e1.0p5
brw-rw---- 1 root disk 152, 262 2007-10-05 21:46 e1.0p6
brw-rw---- 1 root disk 152, 263 2007-10-05 21:46 e1.0p7
brw-rw---- 1 root disk 152, 264 2007-10-05 21:46 e1.0p8
brw-rw---- 1 root disk 152, 265 2007-10-05 21:46 e1.0p9
cr--r----- 1 root disk 152,   2 2007-10-05 21:46 err
c-w--w---- 1 root disk 152,   4 2007-10-05 21:46 interfaces
c-w--w---- 1 root disk 152,   5 2007-10-05 21:46 revalidate
\end{verbatim}

Далее необходимо создать конфигурационный файл 
нового домена Xen 
или модифицровать существующий.

\begin{verbatim}
%$ egrep -v '^#|^\ *$' /etc/xen/win2k 
kernel = "hvmloader"
builder='hvm'
memory = 512
shadow_memory = 8
name = "win2k"
acpi=1
vif = [ 'type=ioemu, bridge=br0' ]
disk = ['phy:/dev/etherd/e1.0,hda,w' ]
device_model = 'qemu-dm'
boot="c"
sdl=0
vnc=1
vnclisten="127.0.0.1"
stdvga=0
serial='pty'
soundhw='sb16'
\end{verbatim}

После чего запустить домен:

\begin{verbatim}
%@ xm create win2k
\end{verbatim}

\subsubsection{Результат запуска}
Старая машина, загруженная самостоятельно.
\begin{itemize}
\item  Процессор Sempron 2600
\item  457968KB ОЗУ
\end{itemize}
\begin{center} \resizebox{10cm}{!}{\includegraphics[width=12cm]{/var/lib/mediawiki/images/b/b9/W2k.jpg}}\\ \textit{}\end{center}

Домен Xen, загруженный удалённо
с жёсткого диска старой системы:
\begin{itemize}
\item  Процессор AMD 3000+
\item  523800KB ОЗУ
\end{itemize}
\begin{center} \resizebox{10cm}{!}{\includegraphics[width=12cm]{/var/lib/mediawiki/images/c/cd/W2k_2.png}}\\ \textit{}\end{center}

Другие изображения:

\begin{center} \resizebox{10cm}{!}{\includegraphics[width=12cm]{/var/lib/mediawiki/images/f/f9/W2k_0.png}}\\ \textit{}\end{center}
 \begin{center} \resizebox{10cm}{!}{\includegraphics[width=12cm]{/var/lib/mediawiki/images/7/75/W2k_1.png}}\\ \textit{}\end{center}

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

\subsubsection{Перенесение образа старой машины}
Если старый сервер должен быть выведен
из эксплуатации, необходимо скопировать 
данные на новое место.

Домен соответствующий виртуализируемому серверу должен быть потушен в момент копирования!

Например, если перенос выполняется на том LVM:

\begin{verbatim}
%# lvcreate -L 20G -n server2003 /dev/XEN
%# dd if=/dev/etherd/e1.0 of=/dev/XEN/server2003
%# sed -i -e s@/dev/etherd/e1.0@/dev/XEN/server2003@ /etc/xen/win2003
\end{verbatim}


\subsection{Дополнительная информация}
\begin{itemize}
\item \htmladdnormallinkfoot{Экспорт установленной системы в домен Xen}{http://xgu.ru/wiki/xen/export} (рус.)
\end{itemize}
