\section{Преобразование HVM-домена Xen в паравиртуальный}

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

\subsection{Способы подготовки к паравиртуализации}
Самый простой способ:
загрузиться непосредственно в реальной машине и подготовить её к паравиртуализации.
Однако, этот способ не всегда доступен. Например, исходной машины уже может не быть или она может быть занята
и недоступна для экспериментов, а образ её есть. 
Можно загрузить этот образ в HVM-домене или эмуляторе, 
однако быстрее будет непосредственно обратиться к образу
и подготовить его к запуску в паравиртуальном режиме.

\subsection{Доступ к файловой системе виртуальной машины}
Машина должна быть выключена.
Иначе можно повредить файловые системы.

С помощью \textit{losetup} нужно подключить диск виртуальной машины к блочному устройству.
\begin{verbatim}
   %$ losetup -d /dev/loop0 virtual-disk
\end{verbatim}

После этого посмотреть информацию о диске с помощью fdisk:
\begin{verbatim}
   %$ losetup -d /dev/loop0 virtual-disk
\end{verbatim}

Здесь есть какой-то маленький раздел (вероятно /boot)
и LVM.

Снова вызовите losetup, и подключите уже отдельный раздел к другому
блочному устройству.

Например, для раздела /boot:

\begin{verbatim}
   %$ losetup -o $((512*63)) /dev/loop1 /dev/loop0
   %$ mount /dev/loop1 /mnt
\end{verbatim}

Ключ \texttt{-o} указывает отступ, который нужно сделать от начала файла
при подключении образа к loop-файлу.

Если мы хотим подмонтировать файловые системы, которые находятся внутри LVM, 
то нужно сделать так.

Во-первых, подключить второй раздел к блочному устройству.

\begin{verbatim}
   %$ mount -o $$(208845*512) /dev/loop2 /dev/loop0
\end{verbatim}

Во-вторых, сказать LVM-системе, что loop-устройства тоже могут содержать тома LVM, 
и что сканировать и их.

Для этого нужно отредактировать файл \texttt{/etc/lvm/lvm.conf}
и найти строку \texttt{types}.
Скорее всего она будет закомментирована, а в комментариях
будут указаны значения по умолчанию.
\begin{verbatim}
   # types = [ “fd”, 16]
\end{verbatim}
Измените её на строку:
\begin{verbatim}
   types = [ “fd”, 16, “loop”, 1]
\end{verbatim}
и выполните сканирование:

\begin{verbatim}
   %$ losetup -o $((512*63)) /dev/loop1 /dev/loop0
   %$ mount /dev/loop1 /mnt
\end{verbatim}

Мы сможем работать с группой томов LogVol00, которая находится на подключенном образе.
\begin{verbatim}
   %$ mount -o $$(208845*512) /dev/loop2 /dev/loop0
\end{verbatim}

\subsection{Изменение гостевой системы}
Теперь вы можете скопировать необходимые файлы
внутрь виртуальной машины.
В частности, нужно скопировать модули виртуального ядра:
\begin{verbatim}
  %# cp -a /lib/modules/`uname -r` /mnt/lib/modules
\end{verbatim}
(если мы будем запускать паравиртуальный домен не с тем ядром, которое используем сейчас,
то нужно заменить \texttt{`uname -r`} на верстию нужного ядра).

Установите libc6-xen или другим способом отключите
использование TLS-библиотек.
\begin{verbatim}
   mv /mnt/lib/tls /mnt/lib/tls.disabled
\end{verbatim}

Вы можете стереть записи udev, касающиеся сетевого интерфейса, 
поскольку MAC-адрес виртуального сетевого адаптера будет отличаться
от реального, который использовался раньше, и который был запомнен udev.
Если этого не делать, нужно отредактировать настройки сети
(\texttt{/etc/network/interfaces} для Debian GNU/Linux)
и указать новое название интерфейсов. Иначе при старте домена
сеть настроена не будет.

Если у вас в конвертируемой машине раньше загружались какие-то специфичные модули ядра, 
их загрузку тоже лучше отключить.

\subsection{Приведение хост-системы в исходное состояние}
После того как все операции по подготовке
машины в паравиртуальном режиме
завершены, нужно размонтировать все разделы
и отключить их от loop-устройств.
\begin{verbatim}
   # types = [ “fd”, 16]
\end{verbatim}

Можно также привести файл \texttt{/etc/lvm/lvm.conf} в исходное состояние.

\subsection{Важные замечания}
\begin{itemize}
\item  LVM имена должны быть уникальными в пределах системы! Поэтому имена в виртуальной и реальной машинах не должны повторяться!
\item  Если нужно изменить UUID для виртуального диска, почитайте как это сделать в файле uuidgen.py из дистрибутива Xen
\item  Для решения описанной выше задачи можно использовать не losetup, а kpartx
\end{itemize}

\subsection{Дополнительная информация}
\begin{itemize}
\item \htmladdnormallinkfoot{Преобразование HVM-домена Xen в паравиртуальный}{http://xgu.ru/wiki/xen/hvm2pv}
\item \htmladdnormallinkfoot{LVM на Xgu.ru}{http://xgu.ru/wiki/LVM}, где рассказывается об использовании \textit{kpartx}
\item \htmladdnormallinkfoot{How to manipulate the files stored inside a Xen virtual machine}{http://bitsandchaos.wordpress.com/2007/12/08/how-to-manipulate-the-files-stored-inside-a-xen-virtual-machine/} (англ.)
\item \htmladdnormallinkfoot{Creating a customized master image for a Xen virtual server manually}{http://publib.boulder.ibm.com/infocenter/eserver/v1r2/index.jsp ?topic=/eica7/eica7\_creating\_custom\_image\_xen\_manually.htm} (англ.)
\end{itemize}

