
igor@0: \section{Подготовка кластера виртуализации с помощью xen-drbd-install}
igor@0: 
igor@0: \subsection{Использование}
igor@0: \begin{verbatim}
igor@0: Usage:
igor@0:     xen-drbd-install <network> <command>            (to view)
igor@0:     xen-drbd-install <network> <command> | sh -s    (to run)
igor@0: 
igor@0:     <network> is the name of the file, which contains network description
igor@0: 
igor@0: Commands:
igor@0:     make-drbd
igor@0:     make-domains
igor@0:     make-bridges
igor@0:     make-links
igor@0: \end{verbatim}
igor@0: 
igor@0: \begin{itemize}
igor@0: \item  \textbf{make-drbd} — подготовка LVM-томов и DRBD-устройств на их основе;
igor@0: \item  \textbf{make-domains} — создание файловых систем и их наполнение;
igor@0: \item  \textbf{make-bridges} — создание виртуальных мостов в соответствии с топологией сети;
igor@0: \item  \textbf{make-links} — создание символических ссылок на файлы блочных устройств DRBD для удобства их использования.
igor@0: \end{itemize}
igor@0: 
igor@0: Подкоманда \textit{make-drbd} вызывается при инсталляции на обеих половинах кластера.
igor@0: 
igor@0: Подкоманда \textit{make-domains} вызывается при инсталляции только на одной половине кластера.
igor@0: 
igor@0: Подкоманды \textit{make-bridges} и \textit{make-links} вызываются каждый раз при загрузке
igor@0: системы.
igor@0: 
igor@0: \subsection{Описание топологии}
igor@0: Описание топологии используется как на этапе 
igor@0: инсталляции системы, так и при её повседневной работе.
igor@0: Фактически, это единственный конфигурационный файл, 
igor@0: описывающий конфигурацию виртуальной системы.
igor@0: 
igor@0: Конфигурационный файл имеет синтаксис языка Python.
igor@0: Нужно выполнить присвоение значений
igor@0: определённого типа ряду переменных.
igor@0: Значения могут быть строками, списками или ассоциативными массивами (хэшами).
igor@0: 
igor@0: \subsubsection{Основные параметры}
igor@0: \begin{itemize}
igor@0: \item  \texttt{node1} — имя узла 1 (строка);
igor@0: \item  \texttt{node2} — имя узла 2 (строка);
igor@0: \item  \texttt{i\_am} — имя текущего узла; должно быть равно одному из имён \texttt{node1} или \texttt{node2} (строка);
igor@0: \item  \texttt{node1\_ip} — IP-адрес узла 1; используется при создании конфигурационного файла DRBD (строка);
igor@0: \item  \texttt{node2\_ip} — IP-адрес узла 2  (строка);
igor@0: \item  \texttt{domains} — список имён всех доменов (список);
igor@0: \item  \texttt{domain\_home} — исходное распределение доменов по узлам (хэш);
igor@0: \item  \texttt{kernel} — путь к файлу ядра, которое должно использоваться в гостевых доменах (строка);
igor@0: \item  \texttt{ramdisk} — путь к начальному виртуальному диску, который должен использоваться в гостевых доменах (строка);
igor@0: \item  \texttt{mem\_table} — распределение оперативной памяти для доменов (хэш);
igor@0: \item  \texttt{vcpus\_table} — виртуальные процессоры доменов (хэш);
igor@0: \item  \texttt{disk\_table} — дисковые устройства доменов; \textit{подробности ниже} (хэш);
igor@0: \item  \texttt{bridges} — виртуальные мосты (список);
igor@0: \item  \texttt{vlans} — номера VLAN\rq{}ов, на которые отражаются виртуальные мосты; перечисляются в том порядке, соответствующем порядку мостов (список);
igor@0: \item  \texttt{management\_vlan} — управляющий VLAN; через этот VLAN будет осуществляться доступ к узлам (строка);
igor@0: \item  \texttt{trunk} — какой физический интерфейс используется для соединения с тегированным каналом коммутатора (строка);
igor@0: \item  \texttt{management\_ip} — IP, который должен быть установлен на интерфейсе узла в управляющем VLAN\rq{}е (строка);
igor@0: \item  \texttt{management\_netmask} — маска этого интерфейса (строка);
igor@0: \item  \texttt{management\_gw} — шлюз по умолчанию для узла (строка);
igor@0: \item  \texttt{vbridges\_table} — сетевая конфигурацию доменов; \textit{поробности ниже} (хэш).
igor@0: \end{itemize}
igor@0: 
igor@0: Принцип описания всех параметром интуитивно понятен, 
igor@0: за исключением двух, требующих некоторых пояснений.
igor@0: 
igor@0: \paragraph{Параметр disk\_table}
igor@0: Переменная \texttt{disk\_table} должна содержать ассоциативный массив, 
igor@0: где в качестве ключей используются названия доменов, 
igor@0: а в качестве их значений — списки. Каждый список описывает
igor@0: какие дисковые устройства принадлежат домену.
igor@0: \begin{verbatim}
igor@0:   ['drbd8:mail:2G', 'drbd9:maildir:100G']
igor@0: \end{verbatim}
igor@0: Описание каждого виртуального дискового устройства состоит 
igor@0: из трёх элементов:
igor@0: \begin{enumerate}
igor@0: \item Имени блочного файла базового DRBD-устройства;
igor@0: \item Имени дискового устройства (в частности, это имя используется как название логического тома LVM, поверх которого создаётся DRBD-устройство);
igor@0: \item Размера тома при его создании (впоследствии размер тома можно изменить, но не через конфигурационный  файл и вообще без помощи xen-drbd).
igor@0: \end{enumerate}
igor@0: Значение размера используется только на этапе генерации системы. 
igor@0: Впослесдствии это поле может принимать любые значения — оно игнорируется.
igor@0: 
igor@0: \paragraph{Параметр vbridges\_table}
igor@0: 
igor@0: Переменная \texttt{vbridges\_table} должна содержать ассоциативный массив, 
igor@0: где в качестве ключей используются названия доменов, 
igor@0: а в качестве их значений — списки. Каждый список описывает
igor@0: к каким мостам подключаются сетевые интерфейсы домена.
igor@0: 
igor@0: Например, этот список:
igor@0: \begin{verbatim}
igor@0:   ['xenbr501', 'xenbr256', 'xenbr257']
igor@0: \end{verbatim}
igor@0: говорит о том, что у домена будет три сетевых интерфейса;
igor@0: интерфейс \textit{eth0} домена должен быть подключён к мосту \textit{xenbr501},
igor@0: интерфейс \textit{eth1} — к мосту \textit{xenbr256}, 
igor@0: а интерфейс \textit{eth2} — к мосту \textit{xenbr257}.
igor@0: 
igor@0: \subsubsection{Инсталляционные параметры}
igor@0: 
igor@0: В гостевые домены устанавливается операционная система Debian GNU/Linux.
igor@0: Если вы хотите использовать другую систему, 
igor@0: вы можете попробовать модифицировать скрипт самостоятельно или связаться с его разработчиками.
igor@0: 
igor@0: Эти параметры используются только при генерировании доменов.
igor@0: 
igor@0: \begin{itemize}
igor@0: \item  \texttt{ip\_address\_table} — IP-адресов, которые будут установлены на интерфейсах eth0 гостевых доменов (хэш);
igor@0: \item  \texttt{ip\_network} — сеть на интерфейсе eth0 гостевого домена (строка);
igor@0: \item  \texttt{ip\_netmask} — сетевая маска интерфейса eth0 гостевого домена (строка);
igor@0: \item  \texttt{ip\_gateway} — основной шлюз для гостевых доменов (строка);
igor@0: \item  \texttt{domain\_name} — домен DNS, который указывается в качестве основного для гостевых доменов (строка);
igor@0: \item  \texttt{ip\_nameserver} — DNS-сервер, который должен использоваться в качестве основного в гостевых доменах (строка);
igor@0: \item  \texttt{debian\_release} — какой дистрибутив Debian GNU/Linux необходимо использовать при подготовке гостевых доменов (строка);
igor@0: \item  \texttt{debian\_mirror} — какой репозиторий Debian GNU/Linux должен использоваться для подготовке гостевых доменов (строка);
igor@0: \item  \texttt{apt\_get\_install} — какие пакеты должны быть сразу же установлены во всех гостевые домены (строка);
igor@0: \item  \texttt{lvm\_vg\_name} — название группы томов, в которой будут создаваться логические тома для Xen (строка);
igor@0: \item  \texttt{lvm\_pv\_names} — физические тома, которые должны быть объединены в группу томов (строка);
igor@0: \item  \texttt{lvm\_lv\_drbd\_meta\_name} — название тома LVM, который будет использоваться как метадиск для DRBD (строка);
igor@0: \item  \texttt{lvm\_lv\_drbd\_meta\_size} — размер тома LVM, который будет использоваться как метадиск DRBD (строка);
igor@0: \item  \texttt{mkfs\_options} — опции mkfs, которые необходимо использовать при создании файловых систем (используется файловая система ext3).
igor@0: \end{itemize}
igor@0: 
igor@0: \subsection{Пример описания топологии}
igor@0: 
igor@0: 
igor@0: \begin{verbatim}
igor@0:    node1='debian'
igor@0:    node2='mirror'
igor@0:    #i_am=node1
igor@0: 
igor@0:    from socket import gethostname; i_am=gethostname()
igor@0:    if i_am != node1 and i_am != node2:
igor@0:        raise ValueError, "My hostname (%s) should be equal \
igor@0:        to node1 (%s) or node2 (%s)" % (i_am, node1, node2)
igor@0: 
igor@0:    ip_address = {
igor@0:        node1: '10.0.80.220',
igor@0:        node2: '10.0.80.221',
igor@0:    }
igor@0: 
igor@0:    node1_ip=ip_address[node1]
igor@0:    node2_ip=ip_address[node2]
igor@0: 
igor@0:    domains=['gw','igw','dns','vpn','apt','pgw','ldap','mail','uucp','samba',]
igor@0: 
igor@0:    domain_home = {
igor@0:            node1 : ['dns','gw','igw','pgw','ldap','mail','vpn','uucp','apt'],
igor@0:            node2 : ['samba'],
igor@0:        }
igor@0: 
igor@0:    kernel = "/boot/vmlinuz-2.6.18-4-xen-686"
igor@0:    ramdisk = "/boot/initrd.img-2.6.18-4-xen-686-domU"
igor@0: 
igor@0:    mem_table={
igor@0:        'dns'   :64,
igor@0:        'gw'    :64,
igor@0:        'igw'   :128,
igor@0:        'pgw'   :64,
igor@0:        'ldap'  :64,
igor@0:        'mail'  :256,
igor@0:        'samba' :512,
igor@0:        'vpn'   :192,
igor@0:        'uucp'  :128,
igor@0:        'apt'   :128,
igor@0:    }
igor@0: 
igor@0:    vcpus_table={
igor@0:        'dns'   :1,
igor@0:        'gw'    :1,
igor@0:        'igw'   :1,
igor@0:        'pgw'   :1,
igor@0:        'ldap'  :1,
igor@0:        'mail'  :4,
igor@0:        'samba' :4,
igor@0:        'vpn'   :4,
igor@0:        'uucp'  :4,
igor@0:        'apt'   :2,
igor@0:    }
igor@0: 
igor@0:    disk_table={
igor@0:        'gw'        : ['drbd1:gw:2G'], 
igor@0:        'igw'       : ['drbd2:igw:2G'], 
igor@0:        'dns'       : ['drbd3:dns:2G'], 
igor@0:        'vpn'       : ['drbd4:vpn:2G'],
igor@0:        'apt'       : ['drbd5:apt:10G'],
igor@0:        'pgw'       : ['drbd6:pgw:2G'],
igor@0:        'ldap'      : ['drbd7:ldap:2G'], 
igor@0:        'mail'      : ['drbd8:mail:2G','drbd9:maildir:100G'], 
igor@0:        'uucp'      : ['drbd11:uucp:3G'], 
igor@0:        'samba'     : [ 
igor@0:                    'drbd12:samba:3G', 
igor@0:                    'drbd13:samba-home:100G', 
igor@0:                    'drbd17:samba-profiles:100G' 
igor@0:                ],
igor@0:    }
igor@0: 
igor@0:    bridges=['tagged0','xenbr1','xenbr256','xenbr257','xenbr3','xenbr4','xenbr501']
igor@0:    vlans=  ['tagged',       1,       256,       257,       3,       4,       501 ]
igor@0:    management_vlan=1
igor@0:    trunk='eth0'
igor@0:    management_ip=ip_address[i_am]
igor@0:    management_gw='10.0.80.253'
igor@0: 
igor@0:    vbridges_table={
igor@0:        'dns'       : ['xenbr3'], 
igor@0:        'gw'        : ['xenbr501', 'xenbr256', 'xenbr257'], 
igor@0:        'igw'       : ['tagged0','xenbr3'], 
igor@0:        'pgw'       : ['xenbr3','xenbr501'], 
igor@0:        'ldap'      : ['xenbr3'], 
igor@0:        'mail'      : ['xenbr3'], 
igor@0:        'samba'     : ['tagged0', 'xenbr3'],
igor@0:        'vpn'       : ['xenbr3'],
igor@0:        'apt'       : ['xenbr3'],
igor@0:        'uucp'      : ['xenbr3'],
igor@0:    }
igor@0: 
igor@0:    # FOR INSTALLATION ONLY
igor@0: 
igor@0:    ip_network="10.20.30"
igor@0:    ip_netmask="255.255.255.224"
igor@0:    domain_name="crimea.example.com"
igor@0:    ip_nameserver="10.20.30.4"
igor@0:    ip_gateway="10.20.30.6"
igor@0: 
igor@0:    ip_address_table={
igor@0:        "dns"   :"10.20.30.4",
igor@0:        "gw"    :"10.20.30.254",
igor@0:        "igw"   :"10.20.30.3",
igor@0:        "pgw"   :"10.20.30.6",
igor@0:        "ldap"  :"10.20.30.11",
igor@0:        "mail"  :"10.20.30.9",
igor@0:        "samba" :"10.20.30.1",
igor@0:        "vpn"   :"10.20.30.5",
igor@0:        "apt"   :"10.20.30.7",
igor@0:        "uucp"  :"10.20.30.16",
igor@0:        "jabber":"10.20.30.12",
igor@0: 
igor@0:    }
igor@0: 
igor@0:    debian_release="lenny"
igor@0:    debian_mirror="http://debian.org.ua/debian/"
igor@0:    apt_get_install="less tcpdump dnsutils vim ntp screen snmpd libc6-xen openssh-server"
igor@0: 
igor@0:    lvm_vg_name="TURBO"
igor@0:    lvm_pv_names="/dev/md2"
igor@0:    lvm_lv_drbd_meta_name="meta"
igor@0:    lvm_lv_drbd_meta_size="5G"
igor@0:    mkfs_options="-m1"
igor@0: \end{verbatim}
igor@0: 
igor@0: \subsection{Пример использования}
igor@0: Создаём файл с описанием топологии:
igor@0: \begin{verbatim}
igor@0:   %# vi topology1.py
igor@0: \end{verbatim}
igor@0: 
igor@0: Проверяем, что топология была распознана верно:
igor@0: \begin{verbatim}
igor@0:   %# make-drbd-install topology1 make-drbd | less
igor@0: \end{verbatim}
igor@0: 
igor@0: Если ошибок не обнаружено, 
igor@0: выполняем
igor@0: \begin{verbatim}
igor@0:   %# make-drbd-install topology1 make-drbd | sh -s
igor@0: \end{verbatim}
igor@0: 
igor@0: Аналогичным образом выполняем команду 
igor@0: на втором узле кластера:
igor@0: \begin{verbatim}
igor@0:   %# make-drbd-install topology1 make-drbd
igor@0: \end{verbatim}
igor@0: 
igor@0: В результате на обоих узлах:
igor@0: \begin{enumerate}
igor@0: \item Настраивается система LVM (физические тома, группы томов, логические тома);
igor@0: \item Создаётся конфигурационный файл DRBD;
igor@0: \item Поверх одного из логических томов создаётся мета-диск для DRBD-устройств;
igor@0: \item Поверх логических томов LVM создаются DRBD-устройства.
igor@0: \end{enumerate}
igor@0: 
igor@0: \subsubsection{Создание и заполнение файловых систем доменов}
igor@0: Теперь нужно наполнить созданные разделы.
igor@0: 
igor@0: Наполнение выполняется только на одном из узлов кластера.
igor@0: Второй получает все данные автоматически с помощью DRBD.
igor@0: 
igor@0: Проверьте что генерируется правильный скрипт:
igor@0: 
igor@0: \begin{verbatim}
igor@0: %# make-drbd-install topology1 make-domains | less
igor@0: \end{verbatim}
igor@0: 
igor@0: Если всё в порядке, можно его выполнить:
igor@0: 
igor@0: \begin{verbatim}
igor@0: %# make-drbd-install topology1 make-domains | sh -s
igor@0: \end{verbatim}
igor@0: 
igor@0: В результате выполнения будут:
igor@0: \begin{itemize}
igor@0: \item  созданы файловые системы доменов;
igor@0: \item  файловые системы доменов смонтированы;
igor@0: \item  выполнится наполнение файловых систем (с помощью debootstrap);
igor@0: \item  конфигурационные файлы внутри файловых систем (\texttt{/etc/fstab}, \texttt{/etc/network} и т.д.) модфицированы в соответствии с заданными в описании топологии значениями;
igor@0: \item  файловые системы доменов размонтированы.
igor@0: \end{itemize}
igor@0: 
igor@0: Теперь в системе есть LVM-тома отформатированные и наполненные образами виртуальных систем.
igor@0: Тома синхронизируются между узлами с помощью DRBD.
igor@0: 
igor@0: \subsection{Дополнительная информация}
igor@0: \begin{itemize}
igor@0: \item \htmladdnormallinkfoot{xen-drbd-install}{http://xgu.ru/wiki/xen-drbd-install} (рус.)
igor@0: \end{itemize}
igor@0: 




