Система виртуализации OpenVZ : Часть 1.Введение


Назначение систем виртуализации

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

В настоящее время виртуализация популярна по нескольким причинам.

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

Во-вторых, повышается безопасность за счёт возможности переноса в изолированные окружения таких сервисов, как Samba и Apache, работающих с правами суперпользователя и имеющих большое количество выявленных и потенциальных уязвимостей. Если различные сервисы управляются разными администраторами, каждый администратор может получить права суперпользователя в своём окружении, в то же время не имея доступа ни к соседним окружениям, ни к основной системе.

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

В-третьих, упрощается обслуживание. Например, так как гостевые окружения не содержат аппаратно-зависимых настроек, упрощается их перенос (миграция) с одного компьютера на другой. Создание новых виртуальных окружений происходит намного быстрее, чем инсталляция новой системы на компьютер. Настройки сервисов, разнесённых по разным окружениям, перестают пересекаться, что облегчает их сопровождение. Настройка дисков, межсетевого экрана, резервное копирование и прочие задачи выполняются однократно в основной системе.

Краткое сравнение популярных систем

Программное обеспечение для виртуализации полезно оценивать по следующим критериям:

  • необходимость аппаратной поддержки (например, Intel VT и AMD SVM);
  • возможность использовать аппаратную поддержку при её наличии;
  • установка и запуск из-под существующей операционной системы (Windows, Linux) или на «голое железо»;
  • способность запускать операционные системы, отличные от установленной;
  • наличие и необходимость драйверов паравиртуализации для запускаемых операционных систем;
  • необходимость графической консоли для работы.

С одной стороны, по предоставляемым возможностям OpenVZ уступает большинству других решений: запускается только из-под Linux, в виртуальных окружениях запускает только Linux и для работы на десктопе не предназначен.

С другой стороны, OpenVZ выигрывает по предъявляемым требованиям: аппаратная поддержка виртуализации ему не требуется, потребление ресурсов и разница в быстродействии между базовой и виртуальной средой минимальны, установка и управление упрощены до предела.

Таким образом, главной нишей применения OpenVZ являются:

  • хостинги Linux-VPS;
  • серверы, на которых запущено несколько сервисов с правами суперпользователя (разнесение по изолированным окружениям повысит безопасность) или со сложными настройками (разнесение упростит сопровождение).

В этой нише по набору возможностей OpenVZ превосходит FreeBSD Jails и linux-vserver, и приближается к Solaris Zones.

Данная статья в первую очередь адресована не специалистам хостинг-провайдеров, так как изложенная здесь информация им давно известна, а рядовым Linux-администраторам, серверы которых подпадают под второй пункт.

Архитектура

OpenVZ разрабатывается как патч (набор улучшений и дополнений) к исходным текстам ядра Linux. В модифицированном ядре добавлен массив дополнительных сущностей – виртуальных окружений (virtual environments, VE), а для всех имеющихся объектов (процессы, сокеты и т. д.) введены дополнительные поля – номер VE, к которому этот объект относится, и номер объекта внутри VE.

Каждое виртуальное окружение имеет собственный набор квот на потребление системных ресурсов и отдельный каталог для использования в качестве корневой файловой системы.

Дополнительные модули ядра – vzdev, vzmon и прочие – отвечают за работу ограничений, мониторинг, эмуляцию сети в VE, сохранение и восстановление текущего состояния запущенных контейнеров.

К преимуществам OpenVZ по сравнению с более универсальными инструментами виртуализации, такими как Xen и KVM, является прозрачный доступ из внешней системы к процессам, файлам и прочим ресурсам в гостевых. Например, если потребуется остановить во всех контейнерах сервис, в котором обнаружилась уязвимость, во внешней системе («хост-системе») достаточно выполнить команду «killall имя_исполняемого_файла».

Данный пример выводит номера (PID) всех процессов init с номерами контейнеров, в которых они запущены:

	# ps -A | grep -w init | awk '{print $1}' | xargs vzpid
	Pid    VEID    Name
	1         0    init
	6905     11    init
	7462     12    init

Процессы init, запущенные в контейнерах 11 и 12, внутри контейнеров, как им и положено, имеют PID 1, при этом в хост-системе они видны как PID 6905 и 7462. Номер контейнера, которому принадлежит процесс с указанным PID, сообщает утилита vzpid.

Установка OpenVZ

В ALT Linux Server поддержка OpenVZ присутствует из «коробки», ядро и утилиты находятся на инсталляционном CD-ROM’е и устанавливаются по умолчанию:

	$ rpm -qa | grep vz 
	vzctl-3.0.22-alt3 
	alterator-ovz-0.4-alt8 
	spt-profiles-ovz-0.2.2-alt1 
	vzquota-3.0.11-alt1 
	kernel-image-ovz-smp-2.6.27-alt6

Debian, начиная с текущей стабильной версии 5.0 «Lenny», также содержит OpenVZ в стандартном репозитории. Его установка выполняется следующей командой («-686» для 32-разрядной системы, «-amd64» для 64-разрядной):

	sudo aptitude install vzctl vzquota linux-image-openvz-686

В Ubuntu ситуация обратная: OpenVZ поддерживался в версии 8.04, а из 8.10 был исключён в связи с появлением KVM. Так как версия 8.04 имеет увеличенный срок поддержки до 2013 года, с точки зрения безопасности допустимо подключить её репозитарий к более новой системе. Это делается созданием файла /etc/apt/sources.list.d/8.04-hardy-main со следующим содержимым:

	deb http://mirror.yandex.ru/ubuntu hardy main 
	deb http://mirror.yandex.ru/ubuntu hardy-updates  main 
	deb http://mirror.yandex.ru/ubuntu hardy-security main

Чтение подключённого репозитария и установка OpenVZ:

	sudo apt-get update
	sudo apt-get install vzctl vzquota linux-openvz

Естественно, при этом в обмен на поддержку OpenVZ придётся пожертвовать функциональностью, появившейся в новых версиях ядра после выхода Ubuntu 8.04.

Поддержка Fedora, RHEL (RedHat Enterprise Linux) и CentOS выполняется самими разработчиками OpenVZ. Со своей стороны, разработчики Fedora добавили драйвер для OpenVZ в libvirt, универсальную библиотеку управления виртуальными окружениями, включаемую во многие Linux-дистрибутивы.

Установка сводится к следующим шагам:

  1. Подключение yum-репозитария:
    cd /etc/yum.repos.d 
    wget http://download.openvz.org/openvz.repo
    rpm --import http://download.openvz.org/RPM-GPG-Key-OpenVZ
  2. Отключение SELinux (строка «SELINUX=disabled» в файле /etc/sysconfig/selinux) и настройка sysctl.
  3. Установка ядра, перезапуск, установка утилит:
    yum install ovzkernel
    reboot
    yum install vzctl vzquota

Для всех дистрибутивов некоторые переменные ядра рекомендуется установить в следующие значения:

	net.ipv4.conf.default.forwarding=1 
	net.ipv4.conf.default.proxy_arp = 0 
	net.ipv4.ip_forward=1 
	net.ipv4.conf.all.rp_filter = 1 
	kernel.sysrq = 1 
	net.ipv4.conf.default.send_redirects = 1 
	net.ipv4.conf.all.send_redirects = 0

Добавьте эти строки в /etc/sysctl.conf и примените командой «sudo sysctl -p».

После завершения установки можно запустить OpenVZ командой «/etc/init.d/vz start» и включить автоматический запуск при старте системы командой chkconfig или update-rc.d.

Структура каталогов

Ниже перечислены наиболее важные файлы и каталоги OpenVZ:

  • /etc/vz/vz.conf – файл с общими настройками;
  • /etc/vz/conf/*.conf – файлы с настройками контейнеров;
  • /var/lib/vz/private – каталог с корневыми файловыми системами контейнеров;
  • /var/lib/vz/root – каталог с точками монтирования корневых файловых систем запущенных контейнеров;
  • /var/lib/vz/template/cache – каталог для архивов с образами корневых файловых систем для заполнения создаваемых контейнеров;
  • /proc/user_beancounters – счётчики ограничений.

В тот момент, когда контейнер остановлен, его каталог в /var/lib/vz/root пуст, и редактирование данных следует производить в /var/lib/vz/private. Когда контейнер запущен, рекомендуется вносить изменения в …/root и ничего не менять в …/private. Синхронизация произойдёт автоматически.

В первых версиях OpenVZ каталог /var/lib/vz располагался в /vz, т.е. непосредственно в корневом каталоге. Некоторые описания рекомендуют создавать символьную ссылку с нового имени на старое («ln -sf /var/lib/vz /»), чтобы гарантировать правильность работы устаревших инструментов.

Также рекомендуется выносить /var/lib/vz/private на отдельный раздел, чтобы хост-система была лучше застрахована от нехватки свободного места на диске по вине одного из контейнеров.

Шаблоны

Шаблон («template cache») представляет собой tar.gz-архив с образом корневой файловой системы. Этот образ используется для заполнения файловой системы в контейнере при его создании, например:

	vzctl create 101 --ostemplate ubuntu-9.04-x86_64

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

vzctl ищет шаблоны в каталоге /var/lib/vz/template/cache, добавляя к указанному в командной строке имени суффикс «.tar.gz». Готовые образы различных дистрибутивов можно скачать с Веб-сайта download.openvz.org/template/precreated. Часть из них подготовлена разработчиками OpenVZ, часть (в подкаталоге contrib) – сообществом пользователей.

Чем файловая система контейнера отличается от файловой системы физического компьютера?

  • не нужны загрузчик и ядро – каталоги /boot и /lib/modules;
  • в /etc/init.d должны быть отключены все сервисы для управления оборудованием и ядром – udev, hal, hotplug, hdparm, consolesaver, consolefont и т. д.;
  • создание текстовых консолей getty в /etc/inittab должно быть закомментировано;
  • сетевые настройки – IP-адрес, gateway, hostname и т. д., задаваемые уже после создания контейнера – можно сделать пустыми.

Более детальное описание можно найти на сайте OpenVZ.

При архивации файловой системы в шаблон желательно также очистить от ненужной информации каталоги /var/log, /var/spool, /var/cache и т. д.

Обновление шаблона свежими версиями программного обеспечения должно происходить по следующей схеме (на примере обновления ALT Linux с 4.1 до 5.0):

  • создаётся и запускается новый контейнер:
    vzctl create 101 --ostemplate altlinux-4.1-x86_64
    vzctl start 101
  • в контейнере в /etc/apt/sources.list оставляется единственный файл branch50.list:
    rpm  [updates]   http://mirror.yandex.ru/altlinux/5.0/branch    x86_64 classic 
    rpm  [updates]   http://mirror.yandex.ru/altlinux/5.0/branch    noarch classic 
    #rpm [updates]   http://mirror.yandex.ru/altlinux/updates/5.0   x86_64 updates 
    #rpm [backports] http://mirror.yandex.ru/altlinux/backports/5.0 x86_64 backports
  • запускается обновление:
    vzctl enter 101 
    apt-get update
    apt-get dist-upgrade
    apt-get clean
  • удаляются файлы *.rpmnew (свежие варианты настроек, конфликтующие с изменёнными вариантами из шаблона) и *.rpmsave (старые настройки, не использующиеся в обновлённой системе)
  • контейнер останавливается, его каталог запаковывается в новый шаблон:
    vzctl stop 101
    tar -C /var/lib/vz/private/101 \
    -czf /var/lib/vz/template/cache/altlinux-5.0-x86_64.tar.gz.

Конфигурации

Информация в данном разделе не требуется для практического использования в большинстве случаев, но будет полезной для общего понимания структуры OpenVZ.

Кроме файловой системы, создаваемому контейнеру назначается конфигурация. Как правило, «vzctl create» определяет её автоматически по имени файла-шаблона, но при необходимости можно указать её вручную параметром «—config». После создания контейнера имя его конфигурации хранится в его файле настроек (/etc/vz/conf/*.conf) – либо в строке «CONFIG=…», либо вычисляется по строке «OSTEMPLATE=…».

Конфигурации хранятся в каталоге /etc/vz/dists и содержат списки команд для управления настройками в системе, работающей внутри контейнера. Например, назначение IP-адреса для контейнера производится следующей командой:

	vzctl set 101 --ipadd 192.0.2.101

В зависимости от конфигурации, наряду с сохранением IP-адреса в /etc/vz/conf/11.conf, внутри запущенного контейнера будут выполнены следующие действия:

  • для Slackware: записать IP-адрес в файл /etc/rc.d/rc.inet1.conf
    и выполнить команду «/etc/rc.d/rc.inet restart»;
  • для Debian и Ubuntu: записать IP-адрес в /etc/network/interfaces
    и выполнить «/etc/init.d/networking restart»;
  • для ALT Linux: записать IP-адрес в /etc/net/ifaces/venet0/ipv4address
    и выполнить «ifup venet0».

Кроме перечисленных систем, готовые конфигурации имеются для Arch, Centos/Fedora/RHEL, Mandrake, SLES/OpenSUSE, Openwall, старых версий RedHat и SuSE. Конфигурация по умолчанию (dists/default) предназначена для систем от Redhat. Скелет для создания собственных конфигураций с подробными комментариями находится в dists/distribution.conf-template.

Заключение

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