С выходом десятой версии операционная система Solaris стала наиболее технологичной из всех существующих сегодня вариантов UNIX. Такие технологии как ZFS, DTrace и Zones сделали «Солнечную ОС» не просто очень привлекательной серверной системой, но и превратили ее в лакомый кусочек. И особую заслугу в этом сыграла удивительная по своей мощи, красоте и простоте конфигурирования система виртуализации под названием Solaris Zones.

 

На зоне

Еще в 1999 году FreeBSD обзавелась технологией Jail, позволившей соз давать изолированные окружения исполнения внутри одной операционной системы. Это достигалось за счет расширенной версии системного вызова chroot, который существенно ограничивал полномочия суперпользователя внутри виртуального окружения. Jail стала весьма популярной технологией, которая и по сей день применяется для изолирования небезопасных сервисов и виртуализации. С выходом юбилейной, десятой, версии Solaris получил похожий механизм — Zones, который оказался не просто дальнейшим развитием Jail, а гораздо более хорошо продуманной и глубоко интегрированной в операционку системой.

Solaris Zones есть ничто иное, как виртуализация уровня операционной системы. С ее помощью одна инсталляция ОС может превратиться в целый парк виртуальных машин, каждая из которых обладает собственными дисковыми разделами, виртуальной памятью, процессами, пользователями и т.д. В отличие от классической виртуализации, подразумевающей полную эмуляцию всей железной начинки сервера, Zones эмулирует только окружение исполнения приложений, но не саму аппаратную составляющую: все виртуальные серверы используют единое ядро, которое как раз и выступает в роли распределителя (мультиплексора) ресурсов между виртуальными окружениями. Благодаря такой архитектуре виртуальные окружения Zones не теряют производительности, однако могут принадлежать только к одному типу ОС — Solaris (хотя последние версии имеют слой совместимости с Linux). Все это очень похоже на модель процессов: в системе могут одновременно функционировать тысячи процессов, у каждого из которых будет доступ к ресурсам ПК, но ни один из них не сможет помешать другому.
В Solaris 10 всегда есть как минимум одна зона (виртуальное окружение), имеющая идентификатор 0 и имя global. Это так называемая глобальная зона, которая представляет собой корневое окружение исполнения, суперпользователь которой имеет полные полномочия в управлении системой. Это своего рода корневой процесс (init), все остальные зоны наследуют ресурсы от глобальной и создаются на ее основе. Все пакеты (с некоторыми исключениями) и заплатки, установленные в глобальную зону, автоматически применяются ко всем остальным зонам.

Так называемые неглобальные зоны создаются путем копирования глобальной зоны. Однако каждая из них является самостоятельной средой исполнения со своим IP-адресом, пользователями, сервисами и т.д. Суперпользователь любой зоны (кроме глобальной) ограничен в привилегиях только своей зоной и не может не только выбраться из нее, но и просто узнать о существовании других зон. Последние версии Solaris и OpenSolaris включают в себя механизм эмуляции сторонних операцион ных систем внутри выбранных зон.

Это возможно благодаря технологии под названием BrandZ (или, говоря языком маркетологов, Solaris Containers for Linux Applications), позволяющей изменить поведение ядра, наделяя его другим набором API, механизмами создания потоков, блокировок и т.д. В частности, BrandZ позволяет эмулировать ядро Linux, Solaris 8, Solaris 9 внутри зон Solaris 10 (и даже Solaris 10 внутри зон OpenSolaris). Однако для полной эмуляции понадобятся также родные файлы и библиотеки эмулируемой операционной системы.

 

Подготовка к зоне

Неглобальные зоны могут находиться в одном из семи состояний:

  • Configured — зона правильной конфигурации и готова к установке.
  • Installed — зона успешно установлена и готова к запуску.
  • Ready — зона «запущена». Это состояние сигнализирует, что зона полностью готова: виртуальные устройства выделены, виртуальные сетевые интерфейсы подняты, файловые системы смонтированы, зоне назначен уникальный ID. Ни один процесс еще не запущен.
  • Running — зона запущена. В это состояние она переходит только после запуска процесса init.
  • Incomplete — промежуточное состояние, часто возникающее в результате ошибки. Означает, что зона не была полностью установлена или удалена.
  • Shutting down — зона находится в состоянии остановки.
  • Down — зона остановлена.

Чтобы «поднять» новую зону, необходимо сделать так, чтобы она прошла через четыре первых состояния. Но сначала следует подготовить почву. В качестве корневой файловой системы любой зоны выступает обычный каталог, который может быть расположен на любом из доступных дисков. При этом хорошей практикой считается размещение файловых систем зон в каталоге /zones, а самого этого каталога — в пуле ZFS:

# zfs create -o mountpoint=/zones rpool/zones

Удобство заключается в том, что для каждой зоны теперь можно выделить
собственную файловую систему и назначить ей квоту:

# zfs create rpool/zones/myzone
# zfs set quota=3g rpool/zones/myzone

Не возбраняется также использование образов файловых систем с
жестко заданным размером. Тогда файл можно будет легко передать на
другую машину. Динамически растущий образ создается с помощью
стандартной команды mkfile:

# mkdir /zones
# mkfile 3g /zones/myzone.img

Затем этот образ можно смонтировать к корневому каталогу зоны:

# mkdir /zones/myzone
# lofiadm -a /zones/myzone.img /dev/lofi/1
# newfs /dev/rlofi/1
# mount /dev/lofi/1 /zones/myzone
# chmod go-rwx /zones/myzone

 

Новая зона

Обычно зоны используются для виртуализации или изолирования небезопасных сетевых сервисов от базовой системы. Рассмотрим второй случай использования зон и попробуем установить Apache в собственный маленький виртуальный сервер. В соответствии с информацией из предыдущего раздела сначала мы создадим новую файловую систему ZFS:

# zfs create -o mountpoint=/zones rpool/zones
# zfs create rpool/zones/apache
# zfs quota=1g rpool/zones/apache
# chmod 700 /zones/apache
# zfs list

Естественно, размер квоты выбирается индивидуально для каждого случая. Теперь мы должны создать зону и перевести ее в состояние Configured. Это можно сделать с помощью команды zonecfg:

# zonecfg -z apache

Нас встретит интерактивный командный интерпретатор. Чтобы создать зону, выполним команду create:

zonecfg:apache> create

Далее укажем путь до файловой системы зоны:

zonecfg:apache> set zonepath=/zones/apache

Установим флаг автозагрузки, чтобы зона стартовала вместе со стартом ОС:

zonecfg:apache> set autoboot=true

Создадим виртуальный сетевой интерфейс с адресом 192.168.0.1 и привязкой к настоящему интерфейсу pcn0:

zonecfg:apache> add net
zonecfg:apache:net> set address=192.168.0.2/24
zonecfg:apache:net> set physical=pcn0
zonecfg:apache:net> end

Импортируем каталог /opt из глобальной зоны, чтобы иметь доступ к установленным пакетам:

zonecfg:apache> add inherit-pkg-dir
zonecfg:apache:inherit-pkg-dir> set dir=/opt
zonecfg:apache:inherit-pkg-dir> end

Выведем конфигурацию на экран:

zonecfg:apache> info

Запустим проверку конфигурации, применим ее и выйдем:

zonecfg:apache> verify
zonecfg:apache> commit
zonecfg:apache> exit

Теперь зона полностью сконфигурирована и готова к установке. Но это лишь базовая настройка, команда zonecfg понимает огромное количество самых разнообразных команд, примеры использования которых приведены ниже:

1. Подключение каталога /usr/local глобальной зоны к каталогу /opt/local настраиваемой зоны в режиме «только для чтения» и с отключенными файлами устройств (обрати внимание на опцию type=lofs, она говорит, что в качестве файловой системы должна использоваться loopback fs):

zonecfg:myzone> add fs
zonecfg:myzone:fs> set dir=/usr/local
zonecfg:myzone:fs> set special=/opt/local
zonecfg:myzone:fs> set type=lofs
zonecfg:myzone:fs> add options [ro,nodevices]
zonecfg:myzone:fs> end

По умолчанию из глобальной зоны подключаются также разделы /lib, /platform, /sbin и /usr, поэтому в их ручном подключении смысла нет.

2. Подключение дискового устройства /dev/dsk/c0t0d0s7 с файловой
системой UFS к каталогу /mnt:

zonecfg:myzone:fs> set dir=/mnt
zonecfg:myzone:fs> set special=/dev/dsk/c0t0d0s7
zonecfg:myzone:fs> set raw=/dev/rdsk/c0t0d0s7
zonecfg:myzone:fs> set type=ufs
zonecfg:myzone:fs> end

3. Ограничение выделенной оперативной и swap-памяти для зоны (100 Мб):

zonecfg:myzone> add capped-memory
zonecfg:myzone:capped-memory> set physical=100m
zonecfg:myzone:capped-memory> set swap=100m
zonecfg:myzone:capped-memory> end

4. Выделение зоне только 50% ресурсов процессора:

zonecfg:myzone> add capped-cpu
zonecfg:myzone>capped-cpu> set ncpus=.50
zonecfg:myzone>capped-cpu> end

5. Создание Linux-зоны:

zonecfg:linux> create -t SUNWlx
zonecfg:linux> set zonepath=/zones/linux
zonecfg:linux> set autoboot=true
zonecfg:linux> verify
zonecfg:linux> commit
zonecfg:linux> exit

6. Наделение зоны дополнительными привилегиями:

zonecfg:myzone> set limitpriv="default,sys_time"
zonecfg:myzone> exit

Эта команда разрешает процессам зоны совершать стандартные системные действия, по умолчанию разрешенные в любой зоне (default), а также изменять системное время (привилегия PRIV_SYS_TIME, которая в опции limitprev превращается в sys_time). Полный список привилегий можно посмотреть в man-странице privileges(5). Вернемся к нашему Apache.

После настройки зону необходимо перевести в состояние Installed, а говоря простым языком — установить. Это процедура выполняется с помощью команды «zoneadm -z apache install», однако, если мы просто установим зону, то не получим стандартную систему без Apache и всего, что может понадобиться нашему сайту. Поэтому к указанной команде мы добавим флаг '-e', а после него перечислим все имена пакетов, которые хотим увидеть в устанавливае мой зоне. В нашем случае это стек AMP (Apache, MySQL, PHP):

# zoneadm -z apache install -e amp

Команда копирует необходимые файлы базовой установки ОС из глобальной зоны в каталог указанной зоны, создавая копию базовой установки ОС (каталог /usr подключается из глобальной зоны, поэтому копия становится полной), плюс добавляет к ней стандартный набор базовых пакетов и стек AMP. Все конфигурационные файлы приводятся к состоянию по умолчанию, поэтому неглобальные зоны необходимо настраивать индивидуально. Все зоны автоматически наследуют обновления ОС, поэтому если ты выполнишь команду «upgrade» в глобальной зоне, обновления будут автоматически применены ко всем остальным зонам.

Чтобы перевести зону в состояние Ready, следует ее «загрузить » с помощью zoneadm:

# zoneadm -z apache boot

Если запуск зоны прошел успешно, автоматически будет запущен процесс init, и зона перейдет в состояние Running. Чтобы это проверить, выполни следующую команду:

# zoneadm list -v

Если все в порядке, в зону можно войти с помощью команды zlogin:

# zlogin -C apache

Это первый запуск зоны, поэтому придется ответить на несколько стандартных вопросов, возникающих по ходу стандартной установки Solaris (настройка сети, выбор временной зоны, сервисов и т.д.) После этого мы получим доступ к консоли и сможем произвести настройку и запустить Apache и MySQL:

# svcadm enable network/http:apache22
# svcadm enable application/database/
mysql:version_51

 

Проект «Арбалет»

Начиная с версии 2009.06, OpenSolaris обзавелся целым набором технологий под названием Project Crossbow, позволяющих полностью виртуализировать сетевой стек без потерь в производительности. Условно новинку можно разделить на три взаимозависимых элемента:

  • Виртуальные сетевые интерфейсы (VNIC), создаваемые поверх физических и обладающие всеми их возможностями.
  • Экземпляры IP-стека (IP instances) — виртуаль ные сетевые стеки, уникальные для каждой зоны.
  • Управление потоком — механизм управления пропускной способностью и потоком для каждого VNIC-интерфейса.

Будучи объединенными, все эти три составляющие позволяют создавать внутри одной физической машины виртуальные сети практически неограниченных масштабов с выделенными машинами (спасибо технологии зон и VNIC), коммутаторами и маршрутизаторами с одним общим центром управления. Далее мы рассмотрим, как это может помочь при работе с зонами.
В предыдущем разделе был приведен пример создания зоны, изолирующей веб-сервер от остальных частей операционной системы. Однако такая зона не обладает достаточной гибкостью в управлении, так как полностью опирается на сетевую подсистему глобальной зоны и использует ее же физический сетевой интерфейс. Зона не может модифицировать настройки сетевого интерфейса, изменять таблицу маршрутизации, использовать собственные правила брандмауэра, она полностью подчинена глобальной зоне. Воспользовавшись возможностями Crossbow, мы сможем исправить эту ситуацию, выделив для зоны виртуальный сетевой интерфейс и экземпляр виртуального TCP/IP-стека.

Как это сделать? Во-первых, чтобы наладить связь виртуального интерфейса нашей зоны с физическим интерфейсом, нам придется создать простую виртуальную сеть, и здесь не обойтись без коммутатора. Создадим его с помощью команды dladm (Data Link Administration):

# dladm create-etherstub etherstub0

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

# dladm create-vnic -l etherstub0 host1
# dladm create-vnic -l etherstub0 apache1

Теперь виртуальный интерфейс хоста можно «поднять» с помощью стандартного ifconfig:

# ifconfig host1 plumb
# ifconfig host1 inet 192.168.0.1 up

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

zonecfg:apache> add net
zonecfg:apache:net> set address=192.168.0.2/24
zonecfg:apache:net> set physical=apache1
zonecfg:apache:net> end

После входа в зону с помощью zlogin указываем в настройках адреса роутера (Router IP Address) IP-адрес интерфейса host1, то есть 192.168.0.1. Теперь зона Apache и глобальная зона объединены в сеть с помощью коммутатора, но наш Apache не имеет выхода в Сеть. Чтобы это исправить, необходимо включить форвардинг пакетов через глобальную зону и настроить NAT. Первая задача решается с помощью одной простой команды:

# routeadm -u -e ipv4-forwarding

Для решения второй задачи воспользуемся ipnat и добавим в /etc/ipf/ipnat.conf следующие строки:

map pcn0 192.168.0.0/24 -> 0/32 portmap tcp/udp auto
map pcn0 192.168.0.0/24 -> 0/32

Также не забудь добавить в /etc/ipf/ipf.conf правила, разрешающие прохождение любых пакетов между двумя виртуальными интерфейсами. В целях отладки можно просто разрешить все:

pass in quick all
pass out quick all

Активируем брандмауэр и NAT:

# svcadm enable network/ipfilter

Это все. Теперь у нас есть виртуальная сеть, состоящая из двух машин (одна из которых виртуальная) и одного коммутатора. Благодаря виртуализации сетевого стека, зона Apache может иметь собственный брандмауэр, таблицы маршрутизации и настройки управления потоком. Кстати, для конфигурирования последнего используется утилита flowadm.

С помощью flowadm ты можешь использовать критерии, чтобы разбить сетевой трафик на независимо контролируемые потоки. Каждый из потоков может иметь собственные настройки QoS, ширины канала и привязки к процессорам (если в системе несколько процессоров/ядер, обработку сетевых потоков можно равномерно распределить между ними). Следующая команда создает независимый сетевой поток для HTTP-трафика и назначает ему имя httpflow:

# flowadm add-flow -l pcn0 \
-a transport=tcp,local_port=80 httpflow

После того, как поток будет создан, к нему можно применить правила (свойства) шейпинга и/или QoS. Например, следующая команда задает максимальную пропускную способность канала httpflow, равной 8 Мбит/с, и устанавливает высокий приоритет:

# flowadm set-flowprop -p maxbw=8M,priority=high httpflow

На данный момент поток может иметь только три возможных свойства:

  • maxbw — максимальная пропускная способность потока на оба направления.
  • priority — приоритет потока, может принимать значения «low», «normal», «high» или «rt» (реальное время).
  • cpus — привязка пакетов потока к процессорам (в OpenSolaris пока недоступна).
 

Выводы

Как видишь, зоны Solaris — действительно очень мощное, удобное и простое в настройке средство создания виртуальных окружений. Вкупе с возможностями Crossbow они превращают солярку в идеальную облачную операционную систему, не требующую установки дополнительного ПО для виртуализации, не оставляя отпечаток на производительности.

 

Установка Apache из исходников

Если дистрибутивный пакет Apache тебя по каким-то причинам не устраивает, веб-сервер можно собрать из исходников. Для этого после создания и запуска зоны, но перед входом в нее скачай исходники Apache и положи их в каталог /httpd/src внутри зоны:

# mkdir -p /zones/apache/root/httpd/src
# cd /zones/apache/root/httpd/src
# wget www.sai.msu.su/apache/httpd/httpd-2.2.15.tar.bz2

Запусти zlogin:

# zlogin -C apache

Каталог /usr подключается из глобальной зоны в режиме «только для чтения», поэтому он не пригоден для установки, и ты должен использовать каталог /httpd в качестве корня для Apache:

# cd /httpd/src
# tar xjf httpd-2.2.15.tar.bz2
# cd httpd-2.2.15
# ./configure --prefix=/httpd --enable-so \
--enable-mods-shared=all
# make install

Теперь сконфигурируй и запусти сервер:

# /httpd/bin/apachectl start

 

Links

 

Полезные команды zoneadm

Листинг состояний существующих зон:

# zoneadm list -v

Остановка зоны:

# zlogin myzone shutdown

Загрузка зоны:

# zoneadm -z myzone boot

Перезагрузка зоны:

# zoneadm -z myzone reboot

Удаление корневого каталога зоны:

# zlogin zone1 shutdown
# zoneadm -z zone1 uninstall –F

Полное удаление зоны из системы:

# zlogin zone1 shutdown
# zoneadm -z zone1 uninstall –F
# zonecfg -z zone1 delete -F

Check Also

Фреймворки для постэксплуатации. Выбираем между Metasploit, Cobalt Strike, Merlin, Apfell, Faction C2, Koadic и другими

В этой статье мы поговорим о фреймворках, которые помогут эксплуатировать уязвимости, закр…

Оставить мнение