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}