igor@0: \section{Подготовка кластера виртуализации с помощью xen-drbd-install} igor@0: igor@0: \subsection{Использование} igor@0: \begin{verbatim} igor@0: Usage: igor@0: xen-drbd-install (to view) igor@0: xen-drbd-install | sh -s (to run) igor@0: igor@0: 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: