igor@0: \section{Преобразование HVM-домена Xen в паравиртуальный} igor@0: igor@0: Здесь описывается каким образом можно преобразовать igor@0: HVM-машину в паравиртуальную. igor@0: Такое преобразование возможно только в том случае, igor@0: если для гостевой операционной системы существует ядро, igor@0: способное работать в паравиртуальном домене Xen. igor@0: За некоторыми исключениями, это означает, igor@0: что в настоящий момент преобразование HVM-домена igor@0: в паравиртуальный возможно только для ОС Linux. igor@0: igor@0: \subsection{Способы подготовки к паравиртуализации} igor@0: Самый простой способ: igor@0: загрузиться непосредственно в реальной машине и подготовить её к паравиртуализации. igor@0: Однако, этот способ не всегда доступен. Например, исходной машины уже может не быть или она может быть занята igor@0: и недоступна для экспериментов, а образ её есть. igor@0: Можно загрузить этот образ в HVM-домене или эмуляторе, igor@0: однако быстрее будет непосредственно обратиться к образу igor@0: и подготовить его к запуску в паравиртуальном режиме. igor@0: igor@0: \subsection{Доступ к файловой системе виртуальной машины} igor@0: Машина должна быть выключена. igor@0: Иначе можно повредить файловые системы. igor@0: igor@0: С помощью \textit{losetup} нужно подключить диск виртуальной машины к блочному устройству. igor@0: \begin{verbatim} igor@0: %$ losetup -d /dev/loop0 virtual-disk igor@0: \end{verbatim} igor@0: igor@0: После этого посмотреть информацию о диске с помощью fdisk: igor@0: \begin{verbatim} igor@0: %$ losetup -d /dev/loop0 virtual-disk igor@0: \end{verbatim} igor@0: igor@0: Здесь есть какой-то маленький раздел (вероятно /boot) igor@0: и LVM. igor@0: igor@0: Снова вызовите losetup, и подключите уже отдельный раздел к другому igor@0: блочному устройству. igor@0: igor@0: Например, для раздела /boot: igor@0: igor@0: \begin{verbatim} igor@0: %$ losetup -o $((512*63)) /dev/loop1 /dev/loop0 igor@0: %$ mount /dev/loop1 /mnt igor@0: \end{verbatim} igor@0: igor@0: Ключ \texttt{-o} указывает отступ, который нужно сделать от начала файла igor@0: при подключении образа к loop-файлу. igor@0: igor@0: Если мы хотим подмонтировать файловые системы, которые находятся внутри LVM, igor@0: то нужно сделать так. igor@0: igor@0: Во-первых, подключить второй раздел к блочному устройству. igor@0: igor@0: \begin{verbatim} igor@0: %$ mount -o $$(208845*512) /dev/loop2 /dev/loop0 igor@0: \end{verbatim} igor@0: igor@0: Во-вторых, сказать LVM-системе, что loop-устройства тоже могут содержать тома LVM, igor@0: и что сканировать и их. igor@0: igor@0: Для этого нужно отредактировать файл \texttt{/etc/lvm/lvm.conf} igor@0: и найти строку \texttt{types}. igor@0: Скорее всего она будет закомментирована, а в комментариях igor@0: будут указаны значения по умолчанию. igor@0: \begin{verbatim} igor@0: # types = [ “fd”, 16] igor@0: \end{verbatim} igor@0: Измените её на строку: igor@0: \begin{verbatim} igor@0: types = [ “fd”, 16, “loop”, 1] igor@0: \end{verbatim} igor@0: и выполните сканирование: igor@0: igor@0: \begin{verbatim} igor@0: %$ losetup -o $((512*63)) /dev/loop1 /dev/loop0 igor@0: %$ mount /dev/loop1 /mnt igor@0: \end{verbatim} igor@0: igor@0: Мы сможем работать с группой томов LogVol00, которая находится на подключенном образе. igor@0: \begin{verbatim} igor@0: %$ mount -o $$(208845*512) /dev/loop2 /dev/loop0 igor@0: \end{verbatim} igor@0: igor@0: \subsection{Изменение гостевой системы} igor@0: Теперь вы можете скопировать необходимые файлы igor@0: внутрь виртуальной машины. igor@0: В частности, нужно скопировать модули виртуального ядра: igor@0: \begin{verbatim} igor@0: %# cp -a /lib/modules/`uname -r` /mnt/lib/modules igor@0: \end{verbatim} igor@0: (если мы будем запускать паравиртуальный домен не с тем ядром, которое используем сейчас, igor@0: то нужно заменить \texttt{`uname -r`} на верстию нужного ядра). igor@0: igor@0: Установите libc6-xen или другим способом отключите igor@0: использование TLS-библиотек. igor@0: \begin{verbatim} igor@0: mv /mnt/lib/tls /mnt/lib/tls.disabled igor@0: \end{verbatim} igor@0: igor@0: Вы можете стереть записи udev, касающиеся сетевого интерфейса, igor@0: поскольку MAC-адрес виртуального сетевого адаптера будет отличаться igor@0: от реального, который использовался раньше, и который был запомнен udev. igor@0: Если этого не делать, нужно отредактировать настройки сети igor@0: (\texttt{/etc/network/interfaces} для Debian GNU/Linux) igor@0: и указать новое название интерфейсов. Иначе при старте домена igor@0: сеть настроена не будет. igor@0: igor@0: Если у вас в конвертируемой машине раньше загружались какие-то специфичные модули ядра, igor@0: их загрузку тоже лучше отключить. igor@0: igor@0: \subsection{Приведение хост-системы в исходное состояние} igor@0: После того как все операции по подготовке igor@0: машины в паравиртуальном режиме igor@0: завершены, нужно размонтировать все разделы igor@0: и отключить их от loop-устройств. igor@0: \begin{verbatim} igor@0: # types = [ “fd”, 16] igor@0: \end{verbatim} igor@0: igor@0: Можно также привести файл \texttt{/etc/lvm/lvm.conf} в исходное состояние. igor@0: igor@0: \subsection{Важные замечания} igor@0: \begin{itemize} igor@0: \item LVM имена должны быть уникальными в пределах системы! Поэтому имена в виртуальной и реальной машинах не должны повторяться! igor@0: \item Если нужно изменить UUID для виртуального диска, почитайте как это сделать в файле uuidgen.py из дистрибутива Xen igor@0: \item Для решения описанной выше задачи можно использовать не losetup, а kpartx igor@0: \end{itemize} igor@0: igor@0: \subsection{Дополнительная информация} igor@0: \begin{itemize} igor@0: \item \htmladdnormallinkfoot{Преобразование HVM-домена Xen в паравиртуальный}{http://xgu.ru/wiki/xen/hvm2pv} igor@0: \item \htmladdnormallinkfoot{LVM на Xgu.ru}{http://xgu.ru/wiki/LVM}, где рассказывается об использовании \textit{kpartx} igor@0: \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/} (англ.) igor@0: \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} (англ.) igor@0: \end{itemize} igor@0: