2007/06/12

Знакомство с Linux-VServer

Статья "Зонная Защита Solaris 10" замечательно описывает подход и возможности виртуализации на уровне операционной системы на примере зон в Solaris. Она также содержит ссылки на подобные решения в Linux-среде - Linux-Vserver, OpenVZ. Так как я использую преимущественно Debian (а он уже содержит в себе поддержку linux-vserver), то вопрос выбора для меня стоял недолго, хотя желание ознакомиться с OpenVZ не пропало.
Linux-vserver - это отличное решение для хостинга и тестирования в различных окружениях - на одном физическом сервере используется одно для нескольких виртуальных серверов Linux-ядро. Главный (MAIN) сервер используется для контроля за виртуальными серверами, каждый из которых находится в закрытой адресной среде, не видя остальных. Разработчики указывают около 3-4% падения производительности системы при использовании VServer, но это настолько маленькие цифры, что их можно не учитывать - система работает как обычно - шустро.
В репозитарии Debian 4.0 уже есть пропатченное linux-ядро, готовое к работе. Минусом является отсутствие отдельного патча linux-vserver, чтобы иметь возможность наложить его на собранное своими руками ядрышко.
Установка и использование linux-vserver очень проста.
# apt-get install linux-image-2.6-vserver-686 util-vserver vserver-debiantools debootstrap
Пример команды для создания виртуального сервера
# newvserver --vsroot /var/lib/vservers/ --hostname srv002 --domain domain.ru --ip 192.168.1.102/24 --dist etch --mirror http://ftp.at.debian.org/debian --interface eth0
# uname -a
Linux srvmain 2.6.18-4-vserver-686 #1 SMP Thu May 10 01:37:59 UTC 2007 i686 GNU/Linux
Стартуем виртуальный хост
# vserver srv002 start
Входим в виртуальный хост
# vserver srv002 enter
# uname -a
Linux srv002 2.6.18-4-vserver-686 #1 SMP Thu May 10 01:37:59 UTC 2007 i686 GNU/Linux
Сейчас можно настроить виртуальный хост для требуемых нужд, установить все необходимое/дополнительное. Всё, как на обычном хосте.
Выходим из виртуального хоста
# vserver srv002 stop
Возможные проблемы могут возникнуть с Apache, если на main-хосте уже запущен Apache и не привязан к конкретному ip-адресу. В этом случае, пытаясь запустить apache на виртуальном хосте, в error.log можно встреить ошибку:
[crit] (98)Address already in use: make_sock: could not bind to port 80
Решение: привязать main-сервер к конкретному ip-адресу.

Проблема с Bind 9 решается не так просто:
cd /usr/src
apt-get build-dep bind9
apt-get source bind9
cd bind9-x.x.x
vi debian/rules
...
--disable-linux-caps \
--disable-threads \
...
dpkg-buildpackage
...
cd ..
dpkg -i *.deb
echo "bind9 hold" | dpkg --set-selections # чтобы заморощить автоматическое обновление
На официальном сайте есть отдел, посвященный "проблемному" soft'у. Проблем с OpenLDAP, Exim, Proftpd не наблюдалось - всё работает как обычно - как часы.

Для автозапуска виртуального сервера при перезагрузке необходимо выполнить следующее:
echo "default" > /etc/vservers/SERVERNAME/apps/init/mark
Чтобы сделать копию уже сконфигурированного виртуального хоста srv002 (например web-сервера).
vserver srv003 build --hostname srv003 --interface eth0:192.168.1.103/24 -m rsync -- -s /var/lib/vservers/srv002/
Если необходимо ограничить ресурсы (процессор, память) виртуальных хостов, linux-vserver и тут не подведет.
Пример (взят из FAQ) того, как избежать ситуации "Out of memory"
1. Проверить размер страниц (pagesize) в памяти (обычно 4Кб)
2. Создать директорию rlimits
mkdir /etc/vservers/srv002/rlimits
3. Установить значения максимума для резидентной памяти (rss) и максимума для всего объема виртуальной памяти (as). Хранимые значения указывают на число страниц памяти - например, чтобы установить предел в 200Мб при размере страницы 4Кб, нужно указать значение 50000.
echo 50000 > /etc/vserver//rlimits/rss # 200Mb
echo 100000 > /etc/vserver//rlimits/as # 400Mb
4. Чтобы изменения вступили в силу, необходимо перезапустить виртуальный хост.

В комплекте пакета util-vserver идут замечательные утилиты для наблюдения за виртуальными хостами. Вот как это выглядит:
# vserver-stat
CTX PROC VSZ RSS userTIME sysTIME UPTIME NAME
0 59 197.9M 43.7M 36m51s32 9m37s35 5d22h45 root server
49166 9 137M 20.2M 0m02s98 0m03s40 4d00h03 srv008
49169 9 137M 20.2M 0m39s41 0m06s62 3d23h59 srv009
49170 13 174.3M 102.6M 16m30s91 1m03s46 3d20h57 srv002
49171 3 21.1M 4.6M 0m00s40 0m00s10 3h22m13 srv001
49176 9 137M 20.2M 0m00s80 0m00s20 1h28m18 srv007
#
#
# vps ax
PID CONTEXT TTY STAT TIME COMMAND
1 0 MAIN ? Ss 0:01 init [2]
...
1045 0 MAIN ? S< 0:12 [md1_raid1]
1049 0 MAIN ? S< 0:00 [md2_raid1]
1126 0 MAIN ? S< 0:00 [kjournald]
1611 0 MAIN ? S< 0:00 [kedac]
1662 0 MAIN ? S< 0:00 [kpsmoused]
1922 0 MAIN ? S< 0:00 [kmirrord]
1970 0 MAIN ? S< 0:00 [kjournald]
1972 0 MAIN ? S< 0:15 [kjournald]
2259 0 MAIN ? Ss 0:02 /sbin/syslogd
2265 0 MAIN ? Ss 0:00 /sbin/klogd -x
2617 0 MAIN ? Ss 0:00 /usr/sbin/inetd
2632 0 MAIN ? Ss 0:00 /usr/sbin/sshd
2874 0 MAIN ? Ss 0:00 /sbin/mdadm
2905 0 MAIN ? Ss 0:00 /usr/sbin/cron
2922 0 MAIN ? Ss 0:00 /usr/sbin/apache
2949 0 MAIN tty1 Ss+ 0:00 /sbin/getty 38400 tty1
2950 0 MAIN tty2 Ss+ 0:00 /sbin/getty 38400 tty2
2951 0 MAIN tty3 Ss+ 0:00 /sbin/getty 38400 tty3
2952 0 MAIN tty4 Ss+ 0:00 /sbin/getty 38400 tty4
2953 0 MAIN tty5 Ss+ 0:00 /sbin/getty 38400 tty5
2954 0 MAIN tty6 Ss+ 0:00 /sbin/getty 38400 tty6
22845 0 MAIN ? Ss 0:00 /usr/sbin/exim4 -bd -q30m
26097 0 MAIN ? S 0:00 /usr/sbin/apache
26098 0 MAIN ? S 0:00 /usr/sbin/apache
26099 0 MAIN ? S 0:00 /usr/sbin/apache
26100 0 MAIN ? S 0:00 /usr/sbin/apache
26101 0 MAIN ? S 0:00 /usr/sbin/apache
15571 49166 srv008 ? Ss 0:00 /sbin/syslogd
15590 49166 srv008 ? Ss 0:00 proftpd: (accepting connections)
15596 49166 srv008 ? Ss 0:00 /usr/sbin/cron
15606 49166 srv008 ? Ss 0:00 /usr/sbin/apache
16397 49169 srv009 ? Ss 0:00 /sbin/syslogd
16416 49169 srv009 ? Ss 0:00 proftpd: (accepting connections)
16422 49169 srv009 ? Ss 0:00 /usr/sbin/cron
16432 49169 srv009 ? Ss 0:00 /usr/sbin/apache
17970 49170 srv002 ? Ss 0:08 /sbin/syslogd
17982 49170 srv002 ? Ss 0:00 /usr/sbin/named -u bind
17989 49170 srv002 ? Ss 0:00 /usr/sbin/lwresd
18005 49170 srv002 ? Ss 15:58 /usr/sbin/clamd
18088 49170 srv002 ? Ss 0:00 /usr/bin/freshclam -d --quiet
18233 49170 srv002 ? Ss 0:06 /usr/sbin/exim4 -bd -q30m
18259 49170 srv002 ? Ss 0:00 /usr/sbin/cron
6387 49169 srv009 ? S 0:00 /usr/sbin/apache
6388 49169 srv009 ? S 0:00 /usr/sbin/apache
6389 49169 srv009 ? S 0:00 /usr/sbin/apache
6390 49169 srv009 ? S 0:00 /usr/sbin/apache
17469 0 MAIN ? Ss 0:00 sshd: root@pts/0
17471 0 MAIN pts/0 Ss+ 0:00 -bash
18505 49171 srv001 ? Ss 0:00 /sbin/syslogd
18515 49171 srv001 ? Ssl 0:00 /usr/sbin/slapd -g openldap -u openldap
18531 49171 srv001 ? Ss 0:00 /usr/sbin/cron
19505 0 MAIN ? Ss 0:00 sshd: root@pts/2
19507 0 MAIN pts/2 Ss 0:00 -bash
20434 0 MAIN pts/2 S+ 0:00 mc
20436 0 MAIN pts/3 Ss 0:00 bash -rcfile .bashrc
21026 49176 srv007 ? Ss 0:00 /sbin/syslogd
21045 49176 srv007 ? Ss 0:00 proftpd: (accepting connections)
21051 49176 srv007 ? Ss 0:00 /usr/sbin/cron
21061 49176 srv007 ? Ss 0:00 /usr/sbin/apache
21083 49176 srv007 ? S 0:00 /usr/sbin/apache
21084 49176 srv007 ? S 0:00 /usr/sbin/apache
21846 49170 srv002 ? S 0:00 /usr/sbin/exim4 -bd -q30m
21847 1 ALL_PROC pts/3 S+ 0:00 vps ax
21848 1 ALL_PROC pts/3 R+ 0:00 ps ax
Ссылки:
  1. Installing Linux-VServer
  2. Howtos Linux-Vserver Debian Sarge
  3. Problematic Programs - Linux-VServer
  4. Vserver DRBD - Linux-VServer
  5. The /etc/vservers directory
  6. "Системный администратор" (октябрь 2006)

4 comments:

al3x said...

Чем не мясо linux-vserver.org в плане получения патчиков? Они правда накладываются на vanilla.

morbo said...

Сейчас усиленно щупаю OpenVZ. В OpenVZ есть два типа сетевых интерфейсов:
1. venet - Point-to-Point соединение с аппаратной машиной,
2. veth - интерфейс Ethernet, который настраивается внутри VPS, а на аппаратной машине его можно бриджом соединить с реальным сетевым интерфейсом или другими такими же интерфейсами.

Можно ещё переместить во внутрь одной из VPS Ethernet-интерфейс аппаратной машины.

Так вот. Реально разработчиками предусмотрена настройка venet, с veth возникают проблемы - его нельзя настроить автоматом при старте VPS. Для меня это критично, т.к. в одной из VPS собираюсь запустить Samba.

Где можно почитать про отличия VServer от OpenVZ? Каковы сильные и слабые стороны каждой из систем?

Roman Sozinov said...

to morbo:
По доступным описаниям на момент выбора платформы для виртуализации OpenVZ был более продвинутее во всех отношениях, нежели VServer + имел коммерческое "продолжение". Сознаюсь, единственное, что оттолкнуло от использования его было отсутствие его в собранном виде в стабильной ветке Debian.
Это было мой первый опыт работы с виртаулизацией, я был зелен и многое ещё не принимал во внимание.
Несмотря ни на что, могу сказать, что за почти 2 года работы VServer предоставил мне необходимую функциональность и отличную стабильность. Я им доволен.

Anonymous said...

VServer поддерживете больше платформ. Я использовал для старого сервера на спарк64. Альтернатив вроде для меня нет.