
igor@0: \section{Преобразование независимых систем в виртуальные домены Xen}
igor@0: 
igor@0: Здесь описывается как выполнять систему, установленную на компьютере, 
igor@0: внутри домена Xen или с помощью эмулятора QEMU, исполняющегося на другом компьютере.
igor@0: Может быть полезно при консолидации и виртуализации систем, 
igor@0: при работе с устаревшими системами, при тестировании.
igor@0: 
igor@0: \subsection{Идея}
igor@0: В связи с постоянным увеличением вычислительной мощности и объёма оперативной памяти машин, наблюдающимся в настоящее время, большую популярность приобретает идея виртуализации систем. В особенности популярным этот подход становится 
igor@0: при построении серверной инфраструктуры.
igor@0: 
igor@0: Виртуализированная серверная инфраструктура редко строится с нуля. Чаще всего существует парк физических (не виртуализированных) серверов, которые безостановочно работают, выполняя возложенные на них задачи.
igor@0: Нередко для хранения информации (операционной системы, программного обеспечения и данных) эти серверы используют не внешние хранилища, а собственные жётские
igor@0: диски.
igor@0: 
igor@0: Виртуализация сервера в данном случае может быть выполнена одним из указанных способов:
igor@0: \begin{enumerate}
igor@0: \item  \textit{Миграция служб.} В виртуальной системе новый сервер разворачивается с нуля. Затем на него переносятся службы старого сервера. После чего старый сервер выводится из эксплуатации.
igor@0: \item  \textit{Миграция операционной системы.} Старый сервер останавливается, а затем на нём по сети (с компакт-диска или другого внешнего носителя информации) запускается другая операционная система, которая экспортирует установленный в сервере жёсткий диск системе виртуализации. Система виртуализации исполняет операционную систему, проинсталированную на этом диске. При условии, что виртуализация удалась, данные переносятся на хранилище системы виртуализации и старый сервер выключается.
igor@0: \end{enumerate}
igor@0: 
igor@0: Последний способ проще и быстрее, но он должен допускать возможность
igor@0: временной, непродолжительной остановки сервера (на время запуска другой операционной системы, экспорта, запуска виртуальной машины поверх экспортированных данных).
igor@0: В случае правильного выполнения всех операций простой в этом случае составит до 10 минут.
igor@0: 
igor@0: Обратите внимание что данные, расположенные на жёстком диске,
igor@0: при загрузке новой операционной системы, выполнящей экспорт,
igor@0: никак не используются. Загрузка выполняется по сети, с компакт-диска или другого внешнего носителя. Диск экспортируется для доступа к нему системы виртуализации. Изменения на диске может делать только сама операционная система, установленная на этом же диске, после того как она запущена в виртуальном домене.
igor@0: 
igor@0: Ниже детально рассматривается процесс миграции, 
igor@0: выполненный по второму сценарию.
igor@0: 
igor@0: \subsection{Постановка задачи}
igor@0: Пусть есть две системы:
igor@0: \begin{itemize}
igor@0: \item  \textit{Старая система}  (old) --- система, которая должна быть экспортирована.
igor@0: \item  \textit{Xen-система} (xen) --- система, внутри которой должен исполняться домен под управлением экспортированной системы.
igor@0: \end{itemize}
igor@0: 
igor@0: Необходимо создать новую виртуальную машину, 
igor@0: которая будет использовать в качестве жёсткого диска жёсткий диск удалённого хоста, экспортированный для доступа по сети с помощью протоколов сетевого доступа к дисковым хранилищам.
igor@0: 
igor@0: \subsection{Запуск второй операционной системы в домене Xen установленной на том же компьютере}
igor@0: Рассмотрим для начала простейший случай, когда на одном компьютере 
igor@0: установлено две операционные системы.
igor@0: Он отличается от интересующей нас задачии тем, что не нужно 
igor@0: выполнять экспорт диска как сетевого устройства.
igor@0: 
igor@0: Если на компьютере установлены две операционные системы, 
igor@0: и одна из них это Xenolinux (Xen + Linux), 
igor@0: то вторую можно запустить как пользовательский домен Xen.
igor@0: 
igor@0: Запуск систем, не подготовленных для использования в паравиртуальном домене Xen, 
igor@0: внутри Xen возможен только в том случае, если центральный процессор системы поддерживает аппаратную виртуализацию.
igor@0: В противном случае вместо Xen можно использовать QEMU.
igor@0: 
igor@0: Операционная система, загруженная в родном режиме:
igor@0: 
igor@0: \begin{center} \resizebox{10cm}{!}{\includegraphics[width=12cm]{/var/lib/mediawiki/images/2/29/Win2003_native.JPG}}\\ \textit{}\end{center}
igor@0: 
igor@0: Конфигурационный файл домена Xen:
igor@0: 
igor@0: \begin{verbatim}
igor@0: %$ egrep -v '^#|^\ *$' /etc/xen/win2003 
igor@0: kernel = "hvmloader"
igor@0: builder='hvm'
igor@0: memory = 512
igor@0: shadow_memory = 8
igor@0: name = "win2003"
igor@0: acpi=1
igor@0: vif = [ 'type=ioemu, bridge=br0' ]
igor@0: disk = ['phy:/dev/hda,hda,w' ]
igor@0: device_model = 'qemu-dm'
igor@0: boot="c"
igor@0: sdl=0
igor@0: vnc=1
igor@0: vnclisten="127.0.0.1"
igor@0: stdvga=0
igor@0: serial='pty'
igor@0: soundhw='sb16'
igor@0: \end{verbatim}
igor@0: 
igor@0: В данном случае операционная система Windows установлена
igor@0: на жёсткий диск IDE, подключенный в системе в режиме Primary Master 
igor@0: (блочное устройство \texttt{/dev/hda}).
igor@0: 
igor@0: Старт домена выполняется стандартным образом:
igor@0: 
igor@0: \begin{verbatim}
igor@0: %# xm create win2003
igor@0: %# vncviewer 127.0.0.1:0
igor@0: \end{verbatim}
igor@0: 
igor@0: Здесь вместо 0 может быть указан другой номер, в зависимости от номера
igor@0: VNC-сеанса, который будет соответствовать заданному домену Xen.
igor@0: Подробнее см. руководство пользователя Xen.
igor@0: 
igor@0: Домен Xen, загруженный с жёсткого диска:
igor@0: 
igor@0: \begin{itemize}
igor@0: \item  Процессор AMD 3000+
igor@0: \item  512 Mb ОЗУ 
igor@0: \end{itemize}
igor@0: 
igor@0: \begin{figure} 
igor@0: \includegraphics[width=12cm]{/var/lib/mediawiki/images/b/bc/W2003_xen.png}
igor@0: \end{figure}
igor@0: 
igor@0: На домен, в котором работает установленная операционная система
igor@0: распространяются все те же законы, которые распространяются на систему, которая установлена в домен с нуля
igor@0: традиционным способом.
igor@0: 
igor@0: \subsection{Запуск домена с экспортированного образа}
igor@0: Если операционная система установлена не локально, 
igor@0: а на другом компьютере, необходимо каким-то образом его донести системе виртуализации, так что бы, грубо говоря, виртуальный домен увидел диск.
igor@0: 
igor@0: Процедура включает три шага:
igor@0: \begin{enumerate}
igor@0: \item  Выполнить бездисковую загрузку старой системы \textit{old} под управлением Linux;
igor@0: \item  Выполнить экспорт диска загруженной системы \textit{old} с помощью AoE или iSCSI;
igor@0: \item  На работающей Xen-системе \textit{xen} запустить домен, который будет использовать экспортированный старой машиной.
igor@0: \end{enumerate}
igor@0: 
igor@0: \subsubsection{Подготовка сервера бездисковой загрузки}
igor@0: Детально процедура подготовки сервера бездисковой загрузки
igor@0: описана на странице \htmladdnormallinkfoot{PXE}{http://xgu.ru/wiki/PXE}.
igor@0: Ниже приводятся только примеры конфигурационных
igor@0: файлов ключевых систем, использующихся в работе.
igor@0: 
igor@0: \paragraph{DHCP}
igor@0: Конфигурация демона dhcpd в файле \textbf{/etc/default/dhcp}:
igor@0: 
igor@0: \begin{verbatim}
igor@0: %$ egrep -v '^#|^\ *$' /etc/default/dhcp 
igor@0: INTERFACES="br0"
igor@0: \end{verbatim}
igor@0: 
igor@0: Сам конфигурационный файл \textbf{/etc/dhcpd.conf}:
igor@0: 
igor@0: \begin{verbatim}
igor@0: %$ egrep -v '^#|^\ *$' /etc/dhcpd.conf 
igor@0: option domain-name "clinika.com";
igor@0: option domain-name-servers 192.168.15.254;
igor@0: option subnet-mask 255.255.255.0;
igor@0: default-lease-time 600;
igor@0: max-lease-time 7200;
igor@0: subnet 192.168.7.0 netmask 255.255.255.0 {
igor@0:   range 192.168.7.200 192.168.7.220;
igor@0:   option routers 192.168.7.254;
igor@0:   filename "pxelinux.0";
igor@0: }
igor@0: host clinika {
igor@0:   hardware ethernet 00:13:8f:49:b0:31;
igor@0:   fixed-address 192.168.7.253;
igor@0: }
igor@0: \end{verbatim}
igor@0: 
igor@0: \paragraph{TFTP}
igor@0: 
igor@0: \begin{verbatim}
igor@0: %$ egrep -v '^#|^\ *$' /etc/default/tftpd-hpa 
igor@0: RUN_DAEMON="yes"
igor@0: OPTIONS="-l -s /var/lib/tftpboot/ltsp/i386/"
igor@0: \end{verbatim}
igor@0: 
igor@0: \paragraph{PXE}
igor@0: Наполнение каталога TFTP-сервера.
igor@0: Здесь присутствуют файлы загрузчика PXELINUX.
igor@0: 
igor@0: \begin{verbatim}
igor@0: %$ ls -l /var/lib/tftpboot/ltsp/i386/
igor@0: итого 10690
igor@0: -rw-r--r-- 1 root root     203 2007-10-04 boot.msg
igor@0: -rw-r--r-- 1 root root   80023 2007-07-11 config-2.6.21-2-486
igor@0: lrwxrwxrwx 1 root root      23 2007-10-04 initrd.img -> initrd.img-2.6.21-2-486
igor@0: -rw-r--r-- 1 root root 3691052 2007-10-04 initrd.img-2.6.21-2-486
igor@0: -rw-r--r-- 1 root root    9519 2007-10-04 logo.16_1
igor@0: lrwxrwxrwx 1 root root      20 2007-10-04 nbi.img -> nbi.img-2.6.21-2-486
igor@0: -rw-r--r-- 1 root root 5019136 2007-10-04 nbi.img-2.6.21-2-486
igor@0: -rw-r--r-- 1 root root   13944 2007-10-04 pxelinux.0
igor@0: drwxr-xr-x 2 root root     104 2007-10-05 pxelinux.cfg
igor@0: -rw-r--r-- 1 root root  780664 2007-07-11 System.map-2.6.21-2-486
igor@0: lrwxrwxrwx 1 root root      20 2007-10-04 vmlinuz -> vmlinuz-2.6.21-2-486
igor@0: -rw-r--r-- 1 root root 1319152 2007-07-11 vmlinuz-2.6.21-2-486
igor@0: \end{verbatim}
igor@0: 
igor@0: Конфигурационный файл загрузчика PXELINUX:
igor@0: 
igor@0: \begin{verbatim}
igor@0: clint:Dom0~$ cat /var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default
igor@0: DISPLAY boot.msg
igor@0: TIMEOUT 150 
igor@0: DEFAULT vmlinuz
igor@0: PROMPT 1
igor@0: 
igor@0: LABEL 2.6.21.2
igor@0: KERNEL vmlinuz
igor@0: APPEND nfsdir=192.168.7.254:/opt/ltsp/i386 lang=ru ramdisk_size=1000000 
igor@0:     root=/dev/nfs rw nfsroot=192.168.7.254:/opt/ltsp/i386/ ip=dhcp initrd=initrd.img
igor@0: \end{verbatim}
igor@0: 
igor@0: \paragraph{Корневая файловая система, загружаемая по сети}
igor@0: В каталоге \texttt{/opt/ltsp/i386/}
igor@0: развёрнута операционная система Linux.
igor@0: Инсталляция выполняется с помощью \textit{debootstrap}
igor@0: или аналогичным способом.
igor@0: 
igor@0: В системе должны быть установлены пакеты:
igor@0: \begin{itemize}
igor@0: \item  vblade
igor@0: \end{itemize}
igor@0: 
igor@0: \subsubsection{Экспорт диска старой машины по сети}
igor@0: Сервер, который будет экспортирован, 
igor@0: перезагружается и загружается 
igor@0: по сети.
igor@0: 
igor@0: После этого необходимо выполнить следующие действия.
igor@0: 
igor@0: Будем считать, что экспорт выполняется с помощью протокола 
igor@0: ATA over Ethernet.
igor@0: Можно использовать другой протокол доступа к диску по сети.
igor@0: 
igor@0: Убедитесь, что загружен модуль \textbf{aoe}:
igor@0: 
igor@0: \begin{verbatim}
igor@0: ltsp:~# lsmod | grep aoe
igor@0: aoe                    24416  0
igor@0: \end{verbatim}
igor@0: 
igor@0: Экспортируйте диск \texttt{/dev/hda} (или другой -- тот, на котором установлена система) с помощью \textbf{vblade}:
igor@0: 
igor@0: \begin{verbatim}
igor@0: ltsp:~# vblade 1 0 eth0 /dev/hda
igor@0: pid 3344: e1.0, 78165360 sectors O_RDWR
igor@0: \end{verbatim}
igor@0: 
igor@0: \subsubsection{Запуск домена с экспортированного образа}
igor@0: На системе виртуализации
igor@0: загрузите модуль \textbf{aoe}:
igor@0: 
igor@0: \begin{verbatim}
igor@0: clint:Dom0~$ ls -l /dev/etherd
igor@0: ls: /dev/etherd: Heт такого файла или каталога
igor@0: %# modprobe aoe
igor@0: aoe: aoe_init: AoE v22 initialised.
igor@0: aoe: 00138f49b031 e1.0 v400c has 78165360 sectors
igor@0: %# sudo lsmod | grep aoe
igor@0: aoe                    23456  0
igor@0: \end{verbatim}
igor@0: 
igor@0: При этом 
igor@0: в \texttt{/var/log/messages}
igor@0: должны появиться сообщения:
igor@0: 
igor@0: \begin{verbatim}
igor@0: ... kernel: aoe: aoe_init: AoE v22 initialised.
igor@0: ... kernel: aoe: 00138f49b031 e1.0 v400c has 78165360 sectors
igor@0: ... kernel:  etherd/e1.0: p2 < p5 p6 p7 p8 p9 > p3
igor@0: \end{verbatim}
igor@0: 
igor@0: В каталоге \texttt{/dev/etherd}
igor@0: должны появиться новые файлы устройств, 
igor@0: соответствующие обнаруженным дискам
igor@0: ATA over Ethernet:
igor@0: 
igor@0: \begin{verbatim}
igor@0: %# ls -l /dev/etherd/
igor@0: итого 0
igor@0: c-w--w---- 1 root disk 152,   3 2007-10-05 21:46 discover
igor@0: brw-rw---- 1 root disk 152, 256 2007-10-05 21:57 e1.0
igor@0: brw-rw---- 1 root disk 152, 258 2007-10-05 21:46 e1.0p2
igor@0: brw-rw---- 1 root disk 152, 259 2007-10-05 21:46 e1.0p3
igor@0: brw-rw---- 1 root disk 152, 261 2007-10-05 21:46 e1.0p5
igor@0: brw-rw---- 1 root disk 152, 262 2007-10-05 21:46 e1.0p6
igor@0: brw-rw---- 1 root disk 152, 263 2007-10-05 21:46 e1.0p7
igor@0: brw-rw---- 1 root disk 152, 264 2007-10-05 21:46 e1.0p8
igor@0: brw-rw---- 1 root disk 152, 265 2007-10-05 21:46 e1.0p9
igor@0: cr--r----- 1 root disk 152,   2 2007-10-05 21:46 err
igor@0: c-w--w---- 1 root disk 152,   4 2007-10-05 21:46 interfaces
igor@0: c-w--w---- 1 root disk 152,   5 2007-10-05 21:46 revalidate
igor@0: \end{verbatim}
igor@0: 
igor@0: Далее необходимо создать конфигурационный файл 
igor@0: нового домена Xen 
igor@0: или модифицровать существующий.
igor@0: 
igor@0: \begin{verbatim}
igor@0: %$ egrep -v '^#|^\ *$' /etc/xen/win2k 
igor@0: kernel = "hvmloader"
igor@0: builder='hvm'
igor@0: memory = 512
igor@0: shadow_memory = 8
igor@0: name = "win2k"
igor@0: acpi=1
igor@0: vif = [ 'type=ioemu, bridge=br0' ]
igor@0: disk = ['phy:/dev/etherd/e1.0,hda,w' ]
igor@0: device_model = 'qemu-dm'
igor@0: boot="c"
igor@0: sdl=0
igor@0: vnc=1
igor@0: vnclisten="127.0.0.1"
igor@0: stdvga=0
igor@0: serial='pty'
igor@0: soundhw='sb16'
igor@0: \end{verbatim}
igor@0: 
igor@0: После чего запустить домен:
igor@0: 
igor@0: \begin{verbatim}
igor@0: %@ xm create win2k
igor@0: \end{verbatim}
igor@0: 
igor@0: \subsubsection{Результат запуска}
igor@0: Старая машина, загруженная самостоятельно.
igor@0: \begin{itemize}
igor@0: \item  Процессор Sempron 2600
igor@0: \item  457968KB ОЗУ
igor@0: \end{itemize}
igor@0: \begin{center} \resizebox{10cm}{!}{\includegraphics[width=12cm]{/var/lib/mediawiki/images/b/b9/W2k.jpg}}\\ \textit{}\end{center}
igor@0: 
igor@0: Домен Xen, загруженный удалённо
igor@0: с жёсткого диска старой системы:
igor@0: \begin{itemize}
igor@0: \item  Процессор AMD 3000+
igor@0: \item  523800KB ОЗУ
igor@0: \end{itemize}
igor@0: \begin{center} \resizebox{10cm}{!}{\includegraphics[width=12cm]{/var/lib/mediawiki/images/c/cd/W2k_2.png}}\\ \textit{}\end{center}
igor@0: 
igor@0: Другие изображения:
igor@0: 
igor@0: \begin{center} \resizebox{10cm}{!}{\includegraphics[width=12cm]{/var/lib/mediawiki/images/f/f9/W2k_0.png}}\\ \textit{}\end{center}
igor@0:  \begin{center} \resizebox{10cm}{!}{\includegraphics[width=12cm]{/var/lib/mediawiki/images/7/75/W2k_1.png}}\\ \textit{}\end{center}
igor@0: 
igor@0: Мы бы не смогли подключиться к этой системе удалённо
igor@0: в момент запуска, поскольку сетевая подсистема ещё не работает.
igor@0: Такие изображения можно сделать только при запуске машины
igor@0: в виртуальной системе или в эмуляторе.
igor@0: 
igor@0: \subsubsection{Перенесение образа старой машины}
igor@0: Если старый сервер должен быть выведен
igor@0: из эксплуатации, необходимо скопировать 
igor@0: данные на новое место.
igor@0: 
igor@0: Домен соответствующий виртуализируемому серверу должен быть потушен в момент копирования!
igor@0: 
igor@0: Например, если перенос выполняется на том LVM:
igor@0: 
igor@0: \begin{verbatim}
igor@0: %# lvcreate -L 20G -n server2003 /dev/XEN
igor@0: %# dd if=/dev/etherd/e1.0 of=/dev/XEN/server2003
igor@0: %# sed -i -e s@/dev/etherd/e1.0@/dev/XEN/server2003@ /etc/xen/win2003
igor@0: \end{verbatim}
igor@0: 
igor@0: 
igor@0: \subsection{Дополнительная информация}
igor@0: \begin{itemize}
igor@0: \item \htmladdnormallinkfoot{Экспорт установленной системы в домен Xen}{http://xgu.ru/wiki/xen/export} (рус.)
igor@0: \end{itemize}




