Поиск по сайту
 

Памятка по настройке Xen

Опубликовано Сентябрь 26, 2016

Xen - довольно распространённая и хорошо зарекомендовавшая себя система виртуализации. В ней можно выделить три главных компонента:
Гипервизор - небольшое ядро, осуществляющее управление памятью и процессором,
dom0 - система, находящаяся под управлением гипервизора, но определяющая политику распределения памяти и процессоров, которую и реализует гипервизор,
domU - система, находящаяся под управлением гипервизора.

dom0, как и гипервизор, в системе может быть только один. domU может быть несколько. Для простоты в статье будем называть dom0 хост-системой, а domU - гостевыми системами, хотя строго говоря - они оба скорее гости, просто один из них имеет право управлять гипервизором.

Сервисы Xen, работающие в dom0 и осуществляющие управление гипервизором, написаны на Python. Соответственно, файлы конфигурации являются фактически исходными текстами на языке Python.

Ниже собран мой небольшой опыт работы с этой системой виртуализации. Не описываются настройка репозиториев, настройка сети, фаерволла и другого базового ПО. Описано только то, что имеет непосредственное отношение к настройке виртуализации.

1. Настройка гипервизора

Устанавливаем пакет xen-linux-system:
Выставляем приоритет загрузки гипервизора Xen из GRUB:
# dpkg-divert --divert /etc/grub.d/08_linux_xen --rename /etc/grub.d/20_linux_xen
Для отмены приоритета загрузки Xen из GRUB можно выполнить следующую команду:
# dpkg-divert --rename --remove /etc/grub.d/20_linux_xen
Чтобы настройки GRUB вступили в силу, запустим обновление конфигурации GRUB:
# update-grub


2. Настройка хост-системы

Образы гостевых систем будем размещать на логических томах LVM2, поэтому сначала установим утилиты для управления логическими томами: lvm2
Создадим новый физический том на специально выделенном для этого разделе:
# vgcreate vg0 /dev/sda3
Установим инструменты для создания образов и управления гостевыми системами: xen-tools
Пропишем в файле /etc/xen-tools/xen-tools.cfg опции, задающие настройки создаваемой по умолчанию виртуальной машины:
# Использовать для образов гостевых систем физический том VG0
lvm = vg0# Использовать debootstrap для установки системы на гостевой томinstall-method = debootstrap# Выделить для вновь создаваемой гостевой системы 10 гигабайт на логическом томеsize = 10Gb# По умолчанию создавать гостевую систему, которой выделено 2 гигибайта оперативной памятиmemory = 2Gb# По умолчанию создавать гостевую систему, которой выделен 1 гигабайт раздела подкачки

swap = 1Gb

# По умолчанию использовать файловую систему ext4fs = ext4

# Настройки монтирования раздела ext4ext4_options = noatime,nodiratime,errors=remount-ro

# Настройки задают ветку дистрибутива, версию ядра и загрузочного образа

dist = `xt-guess-suite-and-mirror --suite`
image = sparse
kernel = /boot/vmlinuz-`uname -r`
initrd = /boot/initrd.img-`uname -r`
mirror = `xt-guess-suite-and-mirror --mirror`
Все гостевые системы будут подключаться к виртуальному сетевому мосту, соединённому с физической сетевой картой. На самом деле сетевой мост является по сути виртуальным коммутатором, поддерживающим протокол STP, но по сложившейся традиции называется сетевым мостом. Установим утилиты для управления сетевым мостом: bridge-utils
Настроим интерфейс xenbr0, подсоединив его к физическому сетевому интерфейсу eth0. Для этого впишем в файл /etc/network/interfaces следующие настройки:
auto xenbr0
iface xenbr0 inet static
  address 10.0.0.1
  netmask 255.255.255.0
  bridge_ports eth0
  bridge_maxwait 0

3. Создание образа гостевой системы

Для создания образа новой гостевой системы с именем ns, настройками по умолчанию, но с двумя выделенными системе ядрами процессора, введём на хост-системе следующую команду:
# xen-create-image --hostname ns --ip 10.0.0.2 --vcpus 2 --pygrub --dist wheezy
После создания образа будет выведен пароль пользователя root в только что созданной системе. Его необходимо запомнить или записать и поменять при первом запуске созданного образа.

Теперь можно отредактировать конфигурацию только что созданной гостевой машины /etc/xen/ns.cfg:
vif = [ 'script=vif-bridge, bridge=xenbr0' ]
При запуске гостевой машины её первый интерфейс будет подключен к мосту хост-машины xenbr0. Если необходимо создать несколько сетевых интерфейсов, можно перечислить их внутри квадратных скобок через запятую.

4. Управление гостевыми системами

Запуск гостевой машины:
# xl create /etc/xen/ns.cfg
Просмотр списка активных гостевых машин:
# xl list
Просмотра потребления ресурсов внутри каждой гостевой машины:
# xl top
Остановка гостевой машины:
# xl shutdown ns
Вход на консоль гостевой машины:
# xl console ns
Для отключения от консоли можно нажать Ctrl и ] К сожалению, эта же комбинация клавиш используется в telnet, поэтому я предпочитаю сразу настроить сеть и SSH, а дальнейшую настройку гостевой системы осуществлять уже через SSH.

5. Донастройка гостевых систем

Файл конфигурации гостевой системы может выглядеть примерно следующим образом:
# Загрузчик pygrub позволяет передавать в ядро настройки,
# подобно тому как это делается при использовании GRUB
bootloader = '/usr/lib/xen-4.1/bin/pygrub'

# Количество процессорных ядер и объём памяти, выделяемый гостевой системе
vcpus       = '2'
memory      = '2048'

root        = '/dev/xvda2 ro'
disk        = [ 'phy:/dev/vg0/ns-disk,xvda2,w', # Образ диска находится на томе LVM2
                'phy:/dev/sda3,xvda3,w' ]       # Том хост-системы монтируется внутри гостевой системы

# Имя гостевой системы
name        = 'ns'

# На гостевой системе будут созданы интерфейсы eth0 и eth1, подключенные
# соответственно к сетевым мостам хост-системы xenbr0 и xenbr1
vif         = [ 'script=vif-bridge, bridge=xenbr0',
                'script=vif-bridge, bridge=xenbr1' ]

# Что делать с гостевой системой, если она решила выключиться или перезагрузиться
on_poweroff = 'destroy'
on_reboot   = 'restart'

# Что делать с гостевой системой, если произошла ошибка на хост-системе
on_crash    = 'restart'

# Отдельно задаём поведение гостевых систем при перезапуске сервиса управления
on_xend_start = 'ignore'
on_xend_stop = 'ignore'

6. Отключение сохранения-восстановления гостевых систем

При остановке демона xen, а также при выключении и перезагрузке системы, демон по умолчанию пытается сохранить состояние всех гостевых систем в каталог /var/lib/xend/storage, из-за чего может закончиться всё место на диске.

Изменить это поведение можно в файле /etc/default/xendomains настройкой значения XENDOMAINS_SAVE. Можно указать другой каталог, в котором есть достаточно места для сохранения образов оперативной памяти гостевых систем, а можно полностью отключить сохранение, указав пустое значение:
XENDOMAINS_SAVE=
Чтобы удалить сохранённые образы памяти гостевых систем, можно воспользоваться следующими командами:
# cd /var/lib/xen
# find . -type f -delete


7. Автозапуск виртуальных машин

По умолчанию при перезагрузке хост-системы восстанавливается сохранённое состояние гостевых систем. Если мы отключили сохранение и восстановление гостевых систем, то гостевые системы запущены не будут. Чтобы гостевые системы автоматически загружались при загрузке хост-системы, нужно создать каталог автозапуска и поместить внутрь него символические ссылки на конфигурации необходимых гостевых систем:
# mkdir /etc/xen/auto
# cd /etc/xen/auto
# ln -s /etc/xen/ns.cfg .

8. Решение проблем

8.1. Ошибка настройки сети

Гостевая система долго запускается, а затем выдаёт ошибку настройки сети:
"Error: Device 0 (vif) could not be connected. Could not find bridge, and none was specified".
В этом случае нужно просто отключить скрипт настройки сети, который запускается для всех гостевых систем. Для этого нужно закомментировать строку в файле /etc/xen/xend-config.sxp на хост-системе:
#(vif-script vif-bridge)
8.2. Ошибка запуска xen

Если команда xl list выдаёт ошибку:
Error: Unable to connect to xend: No such file or directory. Is xend running?
При запуске демонов xen при помощи команды /etc/init.d/xen start выводится ошибка:
[FAIL] Starting Xen daemons: xenstored xenconsoled xend failed!
И в журнале /var/log/xen/xend.log имеется запись вида:
[2013-12-06 09:21:27 4789] ERROR (SrvDaemon:349) Exception starting xend (unclosed token: line 1282, column 32)
Значит повреждено содержимое хранилища xen в каталоге /var/lib/xend и для запуска демонов xen его необходимо очистить при помощи команд:
# cd /var/lib/xend
# find . -type f -delete