Рубрика:
Администрирование /
Продукты и решения
|
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|
Дмитрий Столяров
Linux-VServer: настраиваем виртуальные серверы
Если становится сложным справляться с администрированием множества служб на одном сервере или вы не хотите давать привилегии суперпользователей другим администраторам, попробуйте распределить службы по виртуальным серверам.
В наше время неудержимого прогресса информационных технологий и развития глобальных сетей многим системным администраторам приходится сталкиваться с задачами, связанными с созданием ресурсов для широкого пользования. С увеличением объема таких ресурсов, находящихся в руках одного администратора, растет сложность администрирования и, как правило, страдает безопасность. Встают вопросы частичного делегирования административных полномочий. Техники VPS (Virtual Private Server) и VDS (Virtual Dedicated Server) позволяют решать такие задачи – задачи «эффективного разделения целого на меньшее». В отличие от других небезызвестных технологий, таких как VMWare и Xen, VPS предоставляет минимальную виртуализацию. Подробнее различные виды виртуализации описаны здесь: http://en.wikipedia.org/wiki/Virtualization.
В этой статье рассматривается технология Linux-VServer (http://linux-vserver.org). Описываются основные возможности, а также вы найдете инструкции по установке программного обеспечения, и настройке виртуальных серверов.
Основные возможности
Технология Linux-VServer позволяет создавать несколько виртуальных серверов (VPS), работающих независимо под управлением одного ядра операционной системы.
Каждый виртуальный сервер связан с одним контекстом, в котором выполняются его процессы. Контекст –это окружение, объединяющее группу процессов в системе, и отделяющее их от процессов, не входящих в этот контекст. Имена пользователей и групп, а также их идентификаторы принадлежат контексту. Процессы главного (корневого) сервера входят в контекст с нулевым номером и обладают большими возможностями, они имеют доступ к процессам и данным всех виртуальных серверов. В файловой системе главного сервера корни файловых систем виртуальных серверов расположены в некоторой директории.
VPS внутри выглядит как полноценная Linux-система. Вы можете предоставить права root на него и совершенно не бояться, что как-то могут быть повреждены другие виртуальные серверы или главный сервер. Все сервисы, такие как электронная почта, базы данных, Web, SSH, могут быть запущены без модификаций (или с некоторыми минимальными модификациями) на виртуальном сервере (список программ, с которыми возникают проблемы, вы можете можете просмотреть здесь: http://wiki.linux-vserver.org/ProblematicPrograms). Каждый VPS может обладать как одним IP-адресом, так и несколькими.
Для виртуального сервера может быть настроено множество параметров и ограничений. Вот наиболее часто используемые из них:
- Место, занимаемое на диске и количество индексных дескрипторов (файлов).
- Объем физической и виртуальной памяти.
- Доля использования мощности процессора и список процессоров, на которых может выполняться VPS.
- Максимальное количество процессов, принадлежащих контексту.
Для каждого VPS могут отслеживаться такие показатели, как:
- Использованное процессорное время.
- Количество совершенных системных вызовов fork (с его помощью создаются новые процессы).
- Количество полученных и переданных сетевых пакетов.
Программное обеспечение
Также потребуется образ, который будет использоваться на VPS. Вот некоторый список архивов, содержащих готовые образы:
Отличается такой образ от полноценной Linux-системы обычно измененными скриптами инициализации, а в особенности – скриптами, направленными на проверку целостности корневой файловой системы и т. п.
Разумеется, никто не отменяет возможности самостоятельного создания образа на основе используемого вами дистрибутива.
Установка поддержки Linux-VServer в ядре
Скачаем ядро, разархивируем его и добавим патч:
# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.17.13.tar.bz2
# wget http://ftp.linux-vserver.org/pub/kernel/vs2.0/patch-2.6.17.13-vs2.0.2.1.diff.bz2
# tar -xjf linux-2.6.17.13.tar.bz2
# bunzip2 patch-2.6.17.13-vs2.0.2.1.diff.bz2
# cd linux-2.6.17.13
# patch -p1 < ../patch-2.6.17.13-vs2.0.2.1.diff
# make menuconfig
После того, как вы примените патч к ядру, в меню конфигурации появится новая секция «Linux-VServer», ей мы и уделим внимание.
Опции, отвечающие за совместимость со старым управляющим программным обеспечением, и не представляющие в нашем случае никакого интереса. Их надо отключить.
Linux-VServer -> Show a Legacy Version Number (VSERVER_LEGACY_VERSION=n)
Linux-VServer -> Enable Legacy Kernel API (VSERVER_LEGACY=n)
|
Следующая опция отвечает за устаревшую поддержку сети в виртуальных серверах, эта поддержка, как написано в документации, нужна:
Linux-VServer -> Disable Legacy Networking Kernel API (CONFIG_VSERVER_NGNET=n) |
Опция, отвечающая за то, чтобы виртуальные серверы видели только свои процессы (в отличие от главного сервера, который может просматривать процессы всех VPS (с помощью специальных утилит):
Linux-VServer -> Enable Proc Security (VSERVER_PROC_SECURE=y) |
Опция, отвечающая за возможность жесткого управления процессами. Если VPS превысил свой лимит процессорной мощности и для него установлено жесткое управление, выполнение процессов контекста будет заморожено на некоторый промежуток времени (подробнее смотреть «Ограничение ресурсов»):
Linux-VServer -> Enable Hard CPU Limits (VSERVER_HARDCPU=y) |
Следующая опция отвечает за ограничение времени простоя контекста, она позволяет добиться большей интерактивности (меньшего времени отклика), но и сильно увеличивает перегрузку, связанную с планированием процессов (отправкой их на выполнение). Оставлю выбор на ваше усмотрение:
Linux-VServer -> Limit The IDLE task (VSERVER_HARDCPU_IDLE) |
Опция, отвечающая за разделение битов в идентификаторах пользователя и группы на биты, характеризующие номер контекста, и биты являющиеся идентификатором пользователя внутри VPS. Изменяя эти числа, можно достичь разного максимального числа возможных групп и пользователей в системе. Используется это при сохранении принадлежности файла к конкретному VPS в файловой системе. Рекомендую оставить значение по умолчанию:
Linux-VServer -> Persistent Inode Context Tagging -> UID24/GID24 (INOXID_UGID24=y) |
Опция отвечает за поддержку встроенного в ядро NFS демона:
Linux-VServer -> Tag NFSD User Auth and Files (XID_TAG_NFSD=n) |
После настройки этих опций скомпилируем и установим ядро, поправим соответствующим образом загрузчик, а потом не забудем перезагрузиться:
# make bzImage modules modules_install install
Устанавливаем программное обеспечение для управления VPS
Для работы утилит нам понадобится программа vconfig (http://www.candelatech.com/~greear/vlan.html).
Скачаем и разархивируем утилиты:
# wget http://ftp.linux-vserver.org/pub/utils/util-vserver/util-vserver-0.30.210.tar.bz2
# tar -xjf util-vserver-0.30.210.tar.bz2
# cd util-vserver-0.30.210
Конфигурацию производим следующим образом:
# ./configure --prefix=/usr/local/vserver –with-vrootdir=/var/vservers
Опция «vrootdir» указывает папку, в которой будут располагаться корни виртуальных фаловых систем.
Компилируем и устанавливаем:
# make
# make install
Дополним переменные окружения новыми путями (это лучше прописать, например, в bashrc):
# PATH=$PATH:/usr/local/vserver/sbin
# MANPATH=$MANPATH:/usr/local/vserver/man
Настроим файловую систему, в которой будут располагаться виртуальные серверы (в ней будет находиться vrootdir, в нашем случае – /var/vservers).
При монтировании нам нужно обязательно указать опцию «tagxid»: она включает установку принадлежности файлов конкретному VPS (см. «Ядро: Linux-VServer -> Persistent Inode Context Tagging»).
Также, если вы используете reiserfs, вам понадобится опция «attrs», включающая поддержку атрибутов файла (chattr, lsattr) (проверьте, включена ли в ядре опция REISERFS_FS_XATTR, при использовании reiserfs).
Монтирование производится следующим образом:
# mount /dev/sda2 /var/ -o tagxid,attrs
Или, в случае fstab, это будет строчка вида:
/dev/sda2 /var reiserfs tagxid,attrs 1 1
В этом примере монтирование производится в директорию /var, это не обязательно.
После установки поддержки в ядре, установки утилит, настройки файловой системы произведем перезагрузку.
Создаем директорию, в которой будут храниться наши VPS и устанавливаем для нее флаг «Chroot Barrier» («барьер смененного корня»). Отвечает этот флаг за то, что никакой процесс из VPS (контекста) не сможет выбраться за этот барьер.
# mkdir /var/vservers
# /usr/local/vserver/sbin/setattr --barrier /var/vservers/
Для продолжения понадобится выполнить команду, делающую видимыми для самого сервера некоторые части /proc (см. «Ядро: Linux-VServer -> Enable Proc Security»). Полезно добавить эту команду к скриптам инициализации системы.
# /usr/local/vserver/etc/init.d/vprocunhide start
Для того чтобы перезагрузка и выключение виртуальных серверов обрабатывались корректно, потребуется сделать следующее:
# echo 'kernel.vshelper =/usr/local/vserver/lib/util-vserver/vshelper' >> /etc/sysctl.conf
# sysctl -p
Следующая команда должна вывести информацию о версии Linux-VServer API в ядре и версии утилит. Если она делает это, то установка прошла успешно.
# vserver-info
Создание VPS
Для начала нужен образ VPS. Мы выберем для себя образ на основе Gentoo. Скачаем и распакуем его:
# wget http://distfiles.gentoo.org/experimental/x86/vserver/stage3-i686-20060317.tar.bz2
# mkdir /usr/src/stage3-vserver
# tar -xjf stage3-i686-20060317.tar.bz2 -C /usr/src/stage3-vserver
# mkdir /usr/src/stage3-vserver/usr/portage
Если вы используете не Gentoo в качестве дистрибутива для главного сервера, вам понадобится скачать и установить дерево портежей (это дерево можно можно монтировать к нескольким VPS для совместного использования):
# wget http://distfiles.gentoo.org/snapshots/portage-latest.tar.bz2
# tar -xjf portage-latest.tar.bz2 -C /usr
Создадим базовую конфигурацию для нашего нового VPS:
# vserver testvps build -m skeleton --context 5 --initstyle plain
Рассмотрим параметры команды:
- testvps – имя виртуального сервера.
- -m skeleton – метод, означающий, что надо создать только конфигурационные файлы.
- --context 5 – идентификатор контекста.
- --initstyle plain – стиль загрузки (http://oldwiki.linux-vserver.org/InitStyles).
После выполнения команды для нового сервера создана конфигурация в /usr/local/vserver/etc/vservers/testvps, зайдем в эту директорию.
Скопируем файловую систему нашего будущего VPS:
# cp /usr/src/stage3-vserver/* /var/vservers/testvps/ -pPR
Дополним fstab следующим образом:
# cat >> /usr/local/vserver/etc/vservers/testvps/fstab
/usr/portage /usr/portage none bind,ro 0 0
/usr/portage/distfiles /usr/portage/distfiles none bind,rw 0 0
Первая строчка монтирует «дерево портежей» в режиме «только чтение», вторая – директорию, содержащую архивы исходных файлов, используемые пакетным менеджером emerge.
Запустим наш новый виртуальный сервер:
# vserver testvps start
Посмотрим информацию о запущенных серверах:
# vserver-stat
CTX PROC VSZ RSS userTIME sysTIME UPTIME NAME
0 106 1.6G 744.4M 36m41s10 6m39s70 17h45m58 root server
5 1 1.4M 492K 0m00s21 0m00s13 0m00s75 testvps
|
Обратите внимание, что главный сервер представляется как VPS с номером 0 и именем «root server».
Для входа в консоль VPS можно использовать следующую команду:
# vserver testvps enter
Настройка сети в VPS
Прежде всего перейдем в каталог с конфигурацией интерфейсов виртуального сервера и создадим директорию для первого интерфейса:
# cd /usr/local/vserver/etc/vservers/testvps/interfaces
# mkdir 0
# cd 0/
Установим имя устройства, к которому будет присоединен IP-адрес нашего VPS:
# echo 'eth0' > dev
Укажем псевдоним устройства, создаваемого при инициализации VPS:
# echo 'testvps' > name
Настроим IP-адрес и маску сети:
# echo '192.168.0.2' > ip
# echo '24' > prefix
Перезагрузим VPS:
# vserver testvps restart
Для того чтобы посмотреть получившийся результат, воспользуемся командой ip (входит в iproute2: http://linux-net.osdl.org/index.php/Iproute2).
# ip addr | grep 192.168.0.1
На экране мы увидим:
inet 192.168.0.2/24 brd 192.168.0.255 scope global eth0:testvps |
Обратите внимание, что полное имя устройства вида <имя>:<псевдоним> не может быть в длину больше 15 символов.
В VPS можно увидеть результат:
# vserver testvps enter
# ifconfig
Выход из консоли VPS осуществляется стандартно: комбинацией клавиш <Ctrl+D> или командой logout.
Если по аналогии создать второй виртуальный сервер и присвоить ему IP-адрес из той же сети (например, 192.168.0.3) серверы смогут осуществлять коммуникации друг с другом.
Архитектурные рекомендации
Наиболее востребованной технология VPS оказалась для создания хостинговых решений. Большую актуальность она имеет и в образовательной среде, так как предоставляет возможность без последствий давать привилегии суперпользователя (root). А как без них обучить администрированию?
Рассмотрим четыре способа организации доступа к виртуальным серверам. Некоторые из них могут быть использованы для организации публичного (для неограниченной аудитории) доступа, другие – для групп пользователей конечного размера. Выбирая наиболее эффективные варианты доступа в конкретной ситуации и правильно комбинируя их, можно добиться больших гибкости, удобства использования и надежности.
Публичный IP на каждый VPS
Это самый простой вариант для реализации и в то же время самый расточительный для адресного пространства IP. Заключается он в том, что на каждый VPS выделяется один (или более) публичный IP. Таким образом, любой сервис, запущенный на VPS и слушающий на каком-то порту, будет доступен из глобальной сети.
Приватный IP + Port Forwarding (DNAT)
Этот вариант очень удобен, когда вы хотите предоставить доступ к одному или нескольким сервисам, запущенным на VPS, например, для администрирования.
VPS-серверам выделяются IP-адреса из приватного диапазона некоторой виртуальной сети. Для нужных сервисов на VPS-серверы пробрасываются порты с публичных IP-адресов, привязанных к самому серверу. Таким образом, обращаясь на один и тот же IP-адрес, например, по портам 21 (FTP) и 80 (HTTP), мы можем в действительности обращаться к разным VPS.
Основным недостатком такой реализации является то, что она совершенно не пригодна для HTTP-хостинга. Скорее всего, вас не поймут, если вы предложите одним своим клиентам обращаться к своему сайту по порту 1080, а другим – по 8080, что простительно в случае с административным доступом.
Приватный IP + VPN
Так же, как и в предыдущем варианте, VPS назначаются приватные IP-адреса. В получившуюся приватную сеть организовывается VPN-доступ с использованием, например, PPTP или OpenVPN, или IPSec.
Этот вариант может быть использован не для публичного доступа, а для административного или для доступа некоторой небольшой группы людей. Многие VPN-реализации предоставляют шифрование: таким образом, работая через VPN с сервисами, запущенными на VPS, можно гарантировать некоторый, достаточно высокий, уровень сохранности данных. В образовательной среде этот вариант имеет большие преимущества, так как позволяет малыми затратами адресного пространства сделать многое.
Приватный IP + HTTP-прокси
На главном сервере или на одном из VPS с публичным IP-адресом мы запускаем реверсный HTTP-прокси-сервер, перенаправляющий, в зависимости от доменного имени, запросы внутрь виртуальной сети на нужные VPS. Таким образом, через 80 порт на одном публичном IP мы можем предоставлять HTTP-доступ к сайтам, расположенным на разных VPS. В качестве реверсного прокси-сервера прекрасно подходит продукт российского производства nginx (http://sysoev.ru).
Этот вариант, к большому сожалению (в силу внутреннего устройства протокола), пригоден только для HTTP.
Настройка ограничений дискового пространства
Для настройки перейдем в директорию с конфигурацией VPS и создадим там каталог:
# cd /usr/local/vserver/etc/vservers/testvps/
# mkdir dlimits
# mkdir dlimits/0
# cd dlimits/0
Укажем директорию, для которой мы устанавливаем ограничения:
# echo '/var/vservers/testvps' > directory
Ограничим количество индексных дескрипторов файлов:
# echo '100000' > inodes_total
Ограничим пятью гигабайтами место, доступное VPS:
# echo '5242880' > space_total
Установим процент от общего размера, резервируемый для пользователя root.
# echo '5' > reserved
После этого перезагрузим VPS, войдем в него и посмотрим, что получилось:
# df -h
/dev/hdv1 5,0G 0 4,8G 0% /
|
Так как для файлов образа не установлен идентификатор контекста (XID), место на диске, занимаемое ими, не учитывается. Если вы хотите, чтобы и оно учитывалось, можно сделать следующее:
# vserver testvps stop
# chxid -c 5 -R /var/vservers/testvps
# vserver testvps start
Входим и проверяем:
# df -h
/dev/hdv1 5,0G 503M 4,3G 11% /
|
Настройка ограничений ресурсов
Перейдем в директорию с конфигурацией виртуального сервера:
# cd /usr/local/vserver/etc/vservers/testvps/
# mkdir rlimits
# cd rlimits
Существуют следующие ресурсы: cpu, fsize, data, stack, core, rss, nproc, nofile, memlock, as, locks. Более подробно о типах ресурсов можно прочитать в man setrlimit.
В директории создаются файлы с именами <имя ресурса>.min, <имя ресурса>.soft, <имя ресурса>.hard, в которых и определяются конкретные ограничения для ресурсов.
В файле /usr/local/vserver/etc/vservers/testvps/flags вы можете установить флаги, рассмотрим некоторые часто используемые:
- virt_uptime – показывать внутри VPS время работы виртуального сервера.
- virt_load – показывать индикатор загрузки VPS, а не главного сервера.
- sched_hard – указывает планировщику замораживать процесс, если он превысил лимит мощности процессора.
- sched_prio – указывает планировщику понижать приоритет процесса, если он превысил лимит процессора.
- fork_rss – запрещать системный вызов fork, если превышен rlimit rss.
В файле /usr/local/vserver/etc/vservers/schedule вы можете установить параметры планировщика. Например, для того чтобы VPS выделялось 7/32 (21.9%) каждого процесса, а в случае превышения он приостанавливался на (200/7)*32=928 так называемых «мгновений» (jiffies), нужно создать файл следующего содержания:
7
32
500
200
1000
string
928 jiffies – это порядка одной секунды, если частота таймера равна 1000 Гц и примерно десять секунд, если частота равна 100 Гц (частота таймера в конфигурации ядра: «Processor type and features -> Timer frequency»).
Управление планировщиком находится в стадии разработки и может измениться.
Более подробно об этих и многих других настройках вы можете прочитать в документации на официальном сайте: http://wiki.linux-vserver.org/VServerConfiguration.
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|