Назначение систем виртуализации
Виртуализация – это термин, обозначающий, в частности, имитацию
отдельного компьютера и/или отдельной операционной системы с помощью
специального программного обеспечения.
В настоящее время виртуализация популярна по нескольким причинам.
Во-первых, она уменьшает потребность в физических компьютерах, так
как одна машина получает возможность одновременно выполнять несколько
разнотипных операционных систем. При этом улучшается утилизация
вычислительных ресурсов, так как для большинства задач современное
оборудование обладает избыточной мощностью.
Во-вторых, повышается безопасность за счёт возможности переноса в
изолированные окружения таких сервисов, как 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-дистрибутивы.
Установка сводится к следующим шагам:
- Подключение yum-репозитария:
cd /etc/yum.repos.d wget http://download.openvz.org/openvz.repo rpm --import http://download.openvz.org/RPM-GPG-Key-OpenVZ
|
- Отключение SELinux (строка «SELINUX=disabled» в файле /etc/sysconfig/selinux) и настройка sysctl.
- Установка ядра, перезапуск, установка утилит:
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 и
некоторые вопросы, связанные с ее установкой и практическим
использованием. В следующей, завершающей статье цикла подробнее
расскажем об использовании этой системы виртуализации.
Об авторе В
сфере IT с 1986 года. Работает системным администратором в компании
"Икс-Трим” (Интернет и домашние сети). Основные рабочие инструменты на
данный момент: Perl, ALT Linux и FreeBSD. Занятие в свободное время
(когда оно есть) - борьба с газоскрёбами. Источник
|