\section{Подготовка кластера виртуализации с помощью xen-drbd-install}

\subsection{Использование}
\begin{verbatim}
Usage:
    xen-drbd-install <network> <command>            (to view)
    xen-drbd-install <network> <command> | sh -s    (to run)

    <network> is the name of the file, which contains network description

Commands:
    make-drbd
    make-domains
    make-bridges
    make-links
\end{verbatim}

\begin{itemize}
\item  \textbf{make-drbd} — подготовка LVM-томов и DRBD-устройств на их основе;
\item  \textbf{make-domains} — создание файловых систем и их наполнение;
\item  \textbf{make-bridges} — создание виртуальных мостов в соответствии с топологией сети;
\item  \textbf{make-links} — создание символических ссылок на файлы блочных устройств DRBD для удобства их использования.
\end{itemize}

Подкоманда \textit{make-drbd} вызывается при инсталляции на обеих половинах кластера.

Подкоманда \textit{make-domains} вызывается при инсталляции только на одной половине кластера.

Подкоманды \textit{make-bridges} и \textit{make-links} вызываются каждый раз при загрузке
системы.

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

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

\subsubsection{Основные параметры}
\begin{itemize}
\item  \texttt{node1} — имя узла 1 (строка);
\item  \texttt{node2} — имя узла 2 (строка);
\item  \texttt{i\_am} — имя текущего узла; должно быть равно одному из имён \texttt{node1} или \texttt{node2} (строка);
\item  \texttt{node1\_ip} — IP-адрес узла 1; используется при создании конфигурационного файла DRBD (строка);
\item  \texttt{node2\_ip} — IP-адрес узла 2  (строка);
\item  \texttt{domains} — список имён всех доменов (список);
\item  \texttt{domain\_home} — исходное распределение доменов по узлам (хэш);
\item  \texttt{kernel} — путь к файлу ядра, которое должно использоваться в гостевых доменах (строка);
\item  \texttt{ramdisk} — путь к начальному виртуальному диску, который должен использоваться в гостевых доменах (строка);
\item  \texttt{mem\_table} — распределение оперативной памяти для доменов (хэш);
\item  \texttt{vcpus\_table} — виртуальные процессоры доменов (хэш);
\item  \texttt{disk\_table} — дисковые устройства доменов; \textit{подробности ниже} (хэш);
\item  \texttt{bridges} — виртуальные мосты (список);
\item  \texttt{vlans} — номера VLAN\rq{}ов, на которые отражаются виртуальные мосты; перечисляются в том порядке, соответствующем порядку мостов (список);
\item  \texttt{management\_vlan} — управляющий VLAN; через этот VLAN будет осуществляться доступ к узлам (строка);
\item  \texttt{trunk} — какой физический интерфейс используется для соединения с тегированным каналом коммутатора (строка);
\item  \texttt{management\_ip} — IP, который должен быть установлен на интерфейсе узла в управляющем VLAN\rq{}е (строка);
\item  \texttt{management\_netmask} — маска этого интерфейса (строка);
\item  \texttt{management\_gw} — шлюз по умолчанию для узла (строка);
\item  \texttt{vbridges\_table} — сетевая конфигурацию доменов; \textit{поробности ниже} (хэш).
\end{itemize}

Принцип описания всех параметром интуитивно понятен, 
за исключением двух, требующих некоторых пояснений.

\paragraph{Параметр disk\_table}
Переменная \texttt{disk\_table} должна содержать ассоциативный массив, 
где в качестве ключей используются названия доменов, 
а в качестве их значений — списки. Каждый список описывает
какие дисковые устройства принадлежат домену.
\begin{verbatim}
  ['drbd8:mail:2G', 'drbd9:maildir:100G']
\end{verbatim}
Описание каждого виртуального дискового устройства состоит 
из трёх элементов:
\begin{enumerate}
\item Имени блочного файла базового DRBD-устройства;
\item Имени дискового устройства (в частности, это имя используется как название логического тома LVM, поверх которого создаётся DRBD-устройство);
\item Размера тома при его создании (впоследствии размер тома можно изменить, но не через конфигурационный  файл и вообще без помощи xen-drbd).
\end{enumerate}
Значение размера используется только на этапе генерации системы. 
Впослесдствии это поле может принимать любые значения — оно игнорируется.

\paragraph{Параметр vbridges\_table}

Переменная \texttt{vbridges\_table} должна содержать ассоциативный массив, 
где в качестве ключей используются названия доменов, 
а в качестве их значений — списки. Каждый список описывает
к каким мостам подключаются сетевые интерфейсы домена.

Например, этот список:
\begin{verbatim}
  ['xenbr501', 'xenbr256', 'xenbr257']
\end{verbatim}
говорит о том, что у домена будет три сетевых интерфейса;
интерфейс \textit{eth0} домена должен быть подключён к мосту \textit{xenbr501},
интерфейс \textit{eth1} — к мосту \textit{xenbr256}, 
а интерфейс \textit{eth2} — к мосту \textit{xenbr257}.

\subsubsection{Инсталляционные параметры}

В гостевые домены устанавливается операционная система Debian GNU/Linux.
Если вы хотите использовать другую систему, 
вы можете попробовать модифицировать скрипт самостоятельно или связаться с его разработчиками.

Эти параметры используются только при генерировании доменов.

\begin{itemize}
\item  \texttt{ip\_address\_table} — IP-адресов, которые будут установлены на интерфейсах eth0 гостевых доменов (хэш);
\item  \texttt{ip\_network} — сеть на интерфейсе eth0 гостевого домена (строка);
\item  \texttt{ip\_netmask} — сетевая маска интерфейса eth0 гостевого домена (строка);
\item  \texttt{ip\_gateway} — основной шлюз для гостевых доменов (строка);
\item  \texttt{domain\_name} — домен DNS, который указывается в качестве основного для гостевых доменов (строка);
\item  \texttt{ip\_nameserver} — DNS-сервер, который должен использоваться в качестве основного в гостевых доменах (строка);
\item  \texttt{debian\_release} — какой дистрибутив Debian GNU/Linux необходимо использовать при подготовке гостевых доменов (строка);
\item  \texttt{debian\_mirror} — какой репозиторий Debian GNU/Linux должен использоваться для подготовке гостевых доменов (строка);
\item  \texttt{apt\_get\_install} — какие пакеты должны быть сразу же установлены во всех гостевые домены (строка);
\item  \texttt{lvm\_vg\_name} — название группы томов, в которой будут создаваться логические тома для Xen (строка);
\item  \texttt{lvm\_pv\_names} — физические тома, которые должны быть объединены в группу томов (строка);
\item  \texttt{lvm\_lv\_drbd\_meta\_name} — название тома LVM, который будет использоваться как метадиск для DRBD (строка);
\item  \texttt{lvm\_lv\_drbd\_meta\_size} — размер тома LVM, который будет использоваться как метадиск DRBD (строка);
\item  \texttt{mkfs\_options} — опции mkfs, которые необходимо использовать при создании файловых систем (используется файловая система ext3).
\end{itemize}

\subsection{Пример описания топологии}


\begin{verbatim}
   node1='debian'
   node2='mirror'
   #i_am=node1

   from socket import gethostname; i_am=gethostname()
   if i_am != node1 and i_am != node2:
       raise ValueError, "My hostname (%s) should be equal \
       to node1 (%s) or node2 (%s)" % (i_am, node1, node2)

   ip_address = {
       node1: '10.0.80.220',
       node2: '10.0.80.221',
   }

   node1_ip=ip_address[node1]
   node2_ip=ip_address[node2]

   domains=['gw','igw','dns','vpn','apt','pgw','ldap','mail','uucp','samba',]

   domain_home = {
           node1 : ['dns','gw','igw','pgw','ldap','mail','vpn','uucp','apt'],
           node2 : ['samba'],
       }

   kernel = "/boot/vmlinuz-2.6.18-4-xen-686"
   ramdisk = "/boot/initrd.img-2.6.18-4-xen-686-domU"

   mem_table={
       'dns'   :64,
       'gw'    :64,
       'igw'   :128,
       'pgw'   :64,
       'ldap'  :64,
       'mail'  :256,
       'samba' :512,
       'vpn'   :192,
       'uucp'  :128,
       'apt'   :128,
   }

   vcpus_table={
       'dns'   :1,
       'gw'    :1,
       'igw'   :1,
       'pgw'   :1,
       'ldap'  :1,
       'mail'  :4,
       'samba' :4,
       'vpn'   :4,
       'uucp'  :4,
       'apt'   :2,
   }

   disk_table={
       'gw'        : ['drbd1:gw:2G'], 
       'igw'       : ['drbd2:igw:2G'], 
       'dns'       : ['drbd3:dns:2G'], 
       'vpn'       : ['drbd4:vpn:2G'],
       'apt'       : ['drbd5:apt:10G'],
       'pgw'       : ['drbd6:pgw:2G'],
       'ldap'      : ['drbd7:ldap:2G'], 
       'mail'      : ['drbd8:mail:2G','drbd9:maildir:100G'], 
       'uucp'      : ['drbd11:uucp:3G'], 
       'samba'     : [ 
                   'drbd12:samba:3G', 
                   'drbd13:samba-home:100G', 
                   'drbd17:samba-profiles:100G' 
               ],
   }

   bridges=['tagged0','xenbr1','xenbr256','xenbr257','xenbr3','xenbr4','xenbr501']
   vlans=  ['tagged',       1,       256,       257,       3,       4,       501 ]
   management_vlan=1
   trunk='eth0'
   management_ip=ip_address[i_am]
   management_gw='10.0.80.253'

   vbridges_table={
       'dns'       : ['xenbr3'], 
       'gw'        : ['xenbr501', 'xenbr256', 'xenbr257'], 
       'igw'       : ['tagged0','xenbr3'], 
       'pgw'       : ['xenbr3','xenbr501'], 
       'ldap'      : ['xenbr3'], 
       'mail'      : ['xenbr3'], 
       'samba'     : ['tagged0', 'xenbr3'],
       'vpn'       : ['xenbr3'],
       'apt'       : ['xenbr3'],
       'uucp'      : ['xenbr3'],
   }

   # FOR INSTALLATION ONLY

   ip_network="10.20.30"
   ip_netmask="255.255.255.224"
   domain_name="crimea.example.com"
   ip_nameserver="10.20.30.4"
   ip_gateway="10.20.30.6"

   ip_address_table={
       "dns"   :"10.20.30.4",
       "gw"    :"10.20.30.254",
       "igw"   :"10.20.30.3",
       "pgw"   :"10.20.30.6",
       "ldap"  :"10.20.30.11",
       "mail"  :"10.20.30.9",
       "samba" :"10.20.30.1",
       "vpn"   :"10.20.30.5",
       "apt"   :"10.20.30.7",
       "uucp"  :"10.20.30.16",
       "jabber":"10.20.30.12",

   }

   debian_release="lenny"
   debian_mirror="http://debian.org.ua/debian/"
   apt_get_install="less tcpdump dnsutils vim ntp screen snmpd libc6-xen openssh-server"

   lvm_vg_name="TURBO"
   lvm_pv_names="/dev/md2"
   lvm_lv_drbd_meta_name="meta"
   lvm_lv_drbd_meta_size="5G"
   mkfs_options="-m1"
\end{verbatim}

\subsection{Пример использования}
Создаём файл с описанием топологии:
\begin{verbatim}
  %# vi topology1.py
\end{verbatim}

Проверяем, что топология была распознана верно:
\begin{verbatim}
  %# make-drbd-install topology1 make-drbd | less
\end{verbatim}

Если ошибок не обнаружено, 
выполняем
\begin{verbatim}
  %# make-drbd-install topology1 make-drbd | sh -s
\end{verbatim}

Аналогичным образом выполняем команду 
на втором узле кластера:
\begin{verbatim}
  %# make-drbd-install topology1 make-drbd
\end{verbatim}

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

\subsubsection{Создание и заполнение файловых систем доменов}
Теперь нужно наполнить созданные разделы.

Наполнение выполняется только на одном из узлов кластера.
Второй получает все данные автоматически с помощью DRBD.

Проверьте что генерируется правильный скрипт:

\begin{verbatim}
%# make-drbd-install topology1 make-domains | less
\end{verbatim}

Если всё в порядке, можно его выполнить:

\begin{verbatim}
%# make-drbd-install topology1 make-domains | sh -s
\end{verbatim}

В результате выполнения будут:
\begin{itemize}
\item  созданы файловые системы доменов;
\item  файловые системы доменов смонтированы;
\item  выполнится наполнение файловых систем (с помощью debootstrap);
\item  конфигурационные файлы внутри файловых систем (\texttt{/etc/fstab}, \texttt{/etc/network} и т.д.) модфицированы в соответствии с заданными в описании топологии значениями;
\item  файловые системы доменов размонтированы.
\end{itemize}

Теперь в системе есть LVM-тома отформатированные и наполненные образами виртуальных систем.
Тома синхронизируются между узлами с помощью DRBD.

\subsection{Дополнительная информация}
\begin{itemize}
\item \htmladdnormallinkfoot{xen-drbd-install}{http://xgu.ru/wiki/xen-drbd-install} (рус.)
\end{itemize}

