Домашний сервер: виртуализация на основе Xen

originally posted at http://habrahabr.ru/blogs/linux/37824/ by penpen 22.08.2008

Волей случая, пришлось обновить домашний сервер, в новом сервере оказался процессор core 2 duo и прилично памяти (3 гигабайта). Т.к. обычно сервер использовался в качестве файлопомойки, раутера и музыкального сервера, решил его чем-нибудь занять, чтобы не простаивали ресурсы, благо их теперь достаточно много. Решил настроить довольно популярную в последнее время технологию виртуализации, чтобы было возможно проводит различные опыты с настройкой и собирать пакеты в различных дистрибутивах/системах.

Технологии и системы

Для начала, рассмотрим существующие технологии виртуализации:

OpenVZ

Технология заключается в выполнении различных систем с разными настройками и корневой системой под одним ядром. Данная технология часто используется при предоставлении услуги VDS/VPS. Т.к. ядро по сути одно и тоже, потеря производительности минимальна, но выбор систем ограничивается дистрибутивами linux'а с одним ядром. Существует платный вариант данной системы с большим количеством функций: Virtuozzo.

Xen

В основе лежит технология паравиртуализации. Вкратце: гостевая система специально подготавливается для работы с Xen, и соответственно получается довольно небольшая потеря производительности. В качестве гостевой системы может выступать Linux (ядро гостевой системы может отличатся от ядра основной системы), FreeBSD, NetBSD, OpenBSD, OpenSolaris, Plan 9 и другие. Также возможен запуск практически любой системе через технологии виртуализации Intel/AMD, но нужен процессор с поддержкой данных архитектур. Мой сервер, в отличии от ноутбука как оказалось не поддерживает данные технологии, по этому данный метод виртуализации расcматриваться не будет.

VirtualBOX/VMWare/Qemu и подобные системы эмуляции

Данные системы обеспечивают эмуляцию, ценой потери производительности, по этому они рассматриваться не будут.

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

Установка и настройка

Все действия проводились на домашнем сервере с ubuntu-server, для других дистрибутивов возможно придется немного изменить действия. Первоначально нужно установить ядро и необходимый набор утилит:

apt-get install linux-headers-2.6.24-19-xen linux-image-2.6.24-19-xen \
linux-ubuntu-modules-2.6.24-19-xen xen-hypervisor-3.2 xen-tools

Перезагружаемся в новое ядро и устанавливаем xen-utils-3.2:

apt-get install xen-utils-3.2

Важно: если до установки xen-3.2 вы пытались установить xen-3.1, необходимо удалить все пакеты содержащие упоминания xen3.1, после становить xen-hypervisor-3.2, и перезагрузится, т.к. xen-hypervisor вносит некоторые правки для загрузки ядра. Если попытаться установить xen-utils-3.2 до перезагрузки, выйдет ошибка, т.к. xend не сможет загрузится на ядре для этого не предназначенном. Те же симптомы будут при попытки установить enomalism (web интерфейс для управления xen), т.к. он тянет за собой xen3.1

Xen + Nvidia

Так получилось, что у меня видео-карта от Nvidia, и на данном сервере планируется запустить медиацентр, соответственно приходится использовать пропиетарные драйвера. Изначально попробовал установить через envyng (связка скриптов для удобной установки пропиетарных драйверов видео-карт в ubuntu), но ядро запаниковало. При попытке удалить драйвер и собрать руками возникла неприятная вещь: перезагружаясь в ядро, dkms заново устанавливал драйвер. Пришлось удалить драйвер на всех ядрах (dkms remove -m nvidia -v 173.14.12 --all) и ставить руками. При установки не envy драйверов, устанавливаеться старая версия (9x.xx.xx), с которой возможны проблемы.

Нужно сразу сказать, что стандартный драйвер ругается на xen ядро, и устанавливатся отказывается. Небольшой рецепт чтобы это обойти: Т.к. драйверу необходимы права root'а для установки, а при sudo не используются переменные текущего пользователя, то все команды нужно выполнять от рута. В связи с тем, что в ubuntu нет пароля у рута, и неизвестно как скажется на системе его установка, приходится использовать небольшое ухищрение чтобы получить консоль с правами суперпользователя: sudo su или sudo bash(zsh, csh, etc)

# export IGNORE_XEN_PRESENCE=1
# chmod a+x NVIDIA-Linux-x86-173.14.12-pkg2.run
# ./NVIDIA-Linux-x86-173.14.12-pkg2.run

После завершения установки необходимо выйти из консоли суперпользователя: exit

Внимание: данный метод установки не рекомендован и является довольно плохой практикой, в связи с тем что будет довольно сложно в будущем удалить данный драйвер, но т.к. иного способа нет, а создавать и поддерживать пакет для этих целей, который возможно будет конфликтовать с пакетами в репозитории довольно проблематично, я использовал этот способ. Вы можете собрать пакет с драйверами.

Создание и использование образов

В xen можно использовать как готовые образы для виртуальных машин, так и создавать свои. Большой архив готовых образов есть на jailtime.org. Мы же будем создавать свой образ, с помощью xen-utils. Образы создаются с помощью команды xen-create-image.

Создадим образ с debian etch 64-bit:

xen-create-image -hostname=имя-машины -size=10Gb -swap=512Mb -ide -ip=192.168.0.100 \
-netmask=255.255.255.0 -gateway=192.168.0.1 -force -dir=/xen -memory=128Mb -arch=amd64 -dist=etch \
-passwd

Важно: основная система должна быть 64-битная, чтобы была возможность создавать 64-битные гостевые системы.

Опции:

запускаем машину на основе созданного образа:

xm create /etc/xen/имя-машины.cfg

Т.к. мы используем xen3.2 скорей всего вывалится сообщение об ошибке:

Error: Device 769 (vbd) could not be connected. losetup /dev/loop0 /xen/domains/имя-машины/swap.img failed

Это связанно с тем, что xen-tools3.2 в конфигурационном файле использует пути до файлов дисков через file:/, тогда как этот параметр удален из Xen3.2. Чтобы данной ошибки не было, необходимо в конфигурационном файле /etc/xen/имя-машины.cfg в секции disk заменить пути с file:/xen/... на tap:aio:/xen/...

Также необходимо настроить поддержку сети на основной системе, для этого в файлу /etc/network/interfaces нужно добавить к внутреннему интерфейсу следующие параметры: up ip addr 192.168.0.100/28 dev eth0

Теперь у нас есть виртуальная машина, к которой можно присоединиться по сети, с любого компьютера.

В случае если машина загрузилась, но что-то пошло не так, всегда можно зайти в локальную консоль с помощью команды: xm console имя_машины

Для автозагрузки виртуальной машины при старте системы необходимо сделать симлинк с конфигурационного файла машины в /etc/xen/auto: ln -s /etc/xen/имя-машины.cfg /etc/xen/auto/

Основные команды для управления виртуальными машинами

Вот собственно и все. Позже возможно напишу про развертывание Xen на production-сервере с использование LVM.