воскресенье, 1 июня 2014 г.

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

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

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

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

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

Устанавливаем пакет xen-linux-system:
# apt-get install 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, поэтому сначала установим утилиты для управления логическими томами:
# apt-get install lvm2
Создадим новый физический том на специально выделенном для этого разделе:
# vgcreate vg0 /dev/sda3
Установим инструменты для создания образов и управления гостевыми системами:
# apt-get install xen-tools
Пропишем в файле /etc/xen-tools/xen-tools.cfg опции, задающие настройки создаваемой по умолчанию виртуальной машины:
# Использовать для образов гостевых систем физический том VG0
lvm = vg0

# Использовать debootstrap для установки системы на гостевой том
install-method = debootstrap

# Выделить для вновь создаваемой гостевой системы 10 гигабайт на логическом томе
size = 10Gb

# По умолчанию создавать гостевую систему, которой выделено 2 гигибайта оперативной памяти
memory = 2Gb

# По умолчанию создавать гостевую систему, которой выделен 1 гигабайт раздела подкачки
#noswap = 0
swap = 1Gb

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

# Настройки монтирования раздела ext4
ext4_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`
pygrub = 1
mirror = `xt-guess-suite-and-mirror --mirror`
Все гостевые системы будут подключаться к виртуальному сетевому мосту, соединённому с физической сетевой картой. На самом деле сетевой мост является по сути виртуальным коммутатором, поддерживающим протокол STP, но по сложившейся традиции называется сетевым мостом. Установим утилиты для управления сетевым мостом:
# apt-get install 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 --netmask 255.255.255.0 --gateway 10.0.0.1 --vcpus 2 --dist wheezy
После создания образа будет выведен пароль пользователя root в только что созданной системе. Его необходимо запомнить или записать и поменять при первом запуске созданного образа.

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

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

Запуск гостевой машины:
# xm create /etc/xen/ns.cfg
Просмотр списка активных гостевых машин:
# xm list
Просмотра потребления ресурсов внутри каждой гостевой машины:
# xm top
Остановка гостевой машины:
# xm shutdown ns
Вход на консоль гостевой машины:
# xm 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. Что следует установить в гостевую систему?

Я для себя сформировал следующий контрольный список:
# apt-get install vim less apt-file resolvconf binutils screen rsync
# apt-get install sysstat tcpdump file dnsutils telnet psmisc 
# apt-get install openntpd sudo postfix bsd-mailx logwatch
Не всё из этого необходимо, поэтому вы можете оставить из этого списка то, что вам нужно и дополнить его пакетами по своему вкусу. При установке openntpd и postfix стоит подумать об их настройке.

Если вам когда-нибудь понадобится воспользоваться консолью гостевой системы, стоит установить пакеты, ответственные за консоль, клавиатуру и локаль:
# apt-get install console-setup keyboard-configuration
Соответственно, можно задать их настройки при помощи следующих команд:
# dpkg-reconfigure console-setup
# dpkg-reconfigure keyboard-configuration
# dpkg-reconfigure locales
Ниже приведены пункты конфигурирования, отличающиеся от значений по умолчанию, которые я обычно выбираю для настройки этих пакетов:
Keyboard layout: Other
Country of origin for the keyboard: Russian
Keyboard layout: Russian

Encoding to use on the console: UTF-8
Character set to support: Cyrillic - KOI8-R and KOI8-U

Default locale for the systemm environment: ru_RU.UTF-8
7. Отключение сохранения-восстановления гостевых систем

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

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

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

9.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)
9.2. Ошибка запуска xen

Если команда xm 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

2 комментария:

Анонимный комментирует...

apt-get install xen-linux-system
не может найти пакет xen-linux-system или xen-linux-system-amd64

morbo комментирует...

Заметка писалась относительно Debian Wheezy. Сейчас у меня под рукой Debian Stretch. Поищем, что нужно ставить в ней:

$ apt-cache search xen-linux
xen-linux-system-amd64 - Xen system with Linux for 64-bit PCs (dummy package)
$ apt-cache show xen-linux-system-amd64
Package: xen-linux-system-amd64
Source: linux-latest (80+deb9u7)
Version: 4.9+80+deb9u7
Installed-Size: 12
Maintainer: Debian Kernel Team <debian-kernel@lists.debian.org>
Architecture: amd64
Depends: xen-system-amd64, linux-image-amd64
Description-en: Xen system with Linux for 64-bit PCs (dummy package)
This is a dummy transitional package. It can be safely removed.
Description-md5: 898420de469a9dd07cc668ebec0ad42d
Tag: role::shared-lib
Section: oldlibs
Priority: extra
Filename: pool/main/l/linux-latest/xen-linux-system-amd64_4.9+80+deb9u7_amd64.deb
Size: 6050
MD5sum: 2ab5a3d0b5a44a11bb247ea8f2b7873e
SHA256: d1f8f0f33bbd811ddda6543aceb103c78609eccd8a78c970bc7b3ea18de6ea51

Package: xen-linux-system-amd64
Source: linux-latest (80+deb9u6)
Version: 4.9+80+deb9u6
Installed-Size: 12
Maintainer: Debian Kernel Team <debian-kernel@lists.debian.org>
Architecture: amd64
Depends: xen-system-amd64, linux-image-amd64
Description-en: Xen system with Linux for 64-bit PCs (dummy package)
This is a dummy transitional package. It can be safely removed.
Description-md5: 898420de469a9dd07cc668ebec0ad42d
Section: kernel
Priority: optional
Filename: pool/updates/main/l/linux-latest/xen-linux-system-amd64_4.9+80+deb9u6_amd64.deb
Size: 6036
MD5sum: edd7ff195077036eb437d524e0c6f4ac
SHA1: b80ff20703a4c59144dee022902900ca1edd00a1
SHA256: d01f5dba5d0270b87d8fc893ab4549b1734c91e1e265d91494b036e6a72f79b9
$ apt-cache search xen-system-amd64
xen-system-amd64 - Xen System on AMD64 (meta-package)
$ apt-cache show xen-system-amd64
Package: xen-system-amd64
Source: xen
Version: 4.8.5+shim4.10.2+xsa282-1+deb9u11
Installed-Size: 41
Maintainer: Debian Xen Team <pkg-xen-devel@lists.alioth.debian.org>
Architecture: amd64
Provides: xen-system
Depends: xen-hypervisor-4.8-amd64, xen-utils-4.8
Description-en: Xen System on AMD64 (meta-package)
This package depends on the latest Xen hypervisor for use on AMD64 and the
Xen utils.
Description-md5: f9a399da9b1f85d66b7c24b24d068efc
Section: kernel
Priority: optional
Filename: pool/main/x/xen/xen-system-amd64_4.8.5+shim4.10.2+xsa282-1+deb9u11_amd64.deb
Size: 24154
MD5sum: d19c046ec15eecb46ae9a0448fd88030
SHA256: 9e2cf01bcd6c371f725eb6bddf4a3b64376d445b8983baa71a0d73a77d204573

Таким несложным способом можно найти, какие пакеты нужно ставить в вашей системе. Как видно выше, ставить нужно пакеты xen-hypervisor-4.8-amd64 иxen-utils-4.8. В вашей системе это могут быть другие пакеты.