Солярка из контейнера: Теория и практика зонной защиты OpenSolarisС выходом десятой версии операционная система Solaris стала наиболее технологичной из всех существующих сегодня вариантов UNIX. Такие технологии как ZFS, DTrace и Zones сделали «Солнечную ОС» не просто очень привлекательной серверной системой, но и превратили ее в лакомый кусочек. И особую заслугу в этом сыграла удивительная по своей мощи, красоте и простоте конфигурирования система виртуализации под названием Solaris Zones. На зонеЕще в 1999 году FreeBSD обзавелась технологией Jail, позволившей соз давать изолированные окружения исполнения внутри одной операционной системы. Это достигалось за счет расширенной версии системного вызова chroot, который существенно ограничивал полномочия суперпользователя внутри виртуального окружения. Jail стала весьма популярной технологией, которая и по сей день применяется для изолирования небезопасных сервисов и виртуализации. С выходом юбилейной, десятой, версии Solaris получил похожий механизм — Zones, который оказался не просто дальнейшим развитием Jail, а гораздо более хорошо продуманной и глубоко интегрированной в операционку системой. Solaris Zones есть ничто иное, как виртуализация уровня операционной системы. С ее помощью одна инсталляция ОС может превратиться в целый парк виртуальных машин, каждая из которых обладает собственными дисковыми разделами, виртуальной памятью, процессами, пользователями и т.д. В отличие от классической виртуализации, подразумевающей полную эмуляцию всей железной начинки сервера, Zones эмулирует только окружение исполнения приложений, но не саму аппаратную составляющую: все виртуальные серверы используют единое ядро, которое как раз и выступает в роли распределителя (мультиплексора) ресурсов между виртуальными окружениями. Благодаря такой архитектуре виртуальные окружения Zones не теряют производительности, однако могут принадлежать только к одному типу ОС — Solaris (хотя последние версии имеют слой совместимости с Linux). Все это очень похоже на модель процессов: в системе могут одновременно функционировать тысячи процессов, у каждого из которых будет доступ к ресурсам ПК, но ни один из них не сможет помешать другому. Так называемые неглобальные зоны создаются путем копирования глобальной зоны. Однако каждая из них является самостоятельной средой исполнения со своим IP-адресом, пользователями, сервисами и т.д. Суперпользователь любой зоны (кроме глобальной) ограничен в привилегиях только своей зоной и не может не только выбраться из нее, но и просто узнать о существовании других зон. Последние версии Solaris и OpenSolaris включают в себя механизм эмуляции сторонних операцион ных систем внутри выбранных зон. Это возможно благодаря технологии под названием BrandZ (или, говоря языком маркетологов, Solaris Containers for Linux Applications), позволяющей изменить поведение ядра, наделяя его другим набором API, механизмами создания потоков, блокировок и т.д. В частности, BrandZ позволяет эмулировать ядро Linux, Solaris 8, Solaris 9 внутри зон Solaris 10 (и даже Solaris 10 внутри зон OpenSolaris). Однако для полной эмуляции понадобятся также родные файлы и библиотеки эмулируемой операционной системы. Подготовка к зонеНеглобальные зоны могут находиться в одном из семи состояний:
Чтобы «поднять» новую зону, необходимо сделать так, чтобы она прошла через четыре первых состояния. Но сначала следует подготовить почву. В качестве корневой файловой системы любой зоны выступает обычный каталог, который может быть расположен на любом из доступных дисков. При этом хорошей практикой считается размещение файловых систем зон в каталоге /zones, а самого этого каталога — в пуле ZFS:
Удобство заключается в том, что для каждой зоны теперь можно выделить собственную файловую систему и назначить ей квоту:
Не возбраняется также использование образов файловых систем с жестко заданным размером. Тогда файл можно будет легко передать на другую машину. Динамически растущий образ создается с помощью стандартной команды mkfile:
Затем этот образ можно смонтировать к корневому каталогу зоны:
Новая зонаОбычно зоны используются для виртуализации или изолирования небезопасных сетевых сервисов от базовой системы. Рассмотрим второй случай использования зон и попробуем установить Apache в собственный маленький виртуальный сервер. В соответствии с информацией из предыдущего раздела сначала мы создадим новую файловую систему ZFS:
Естественно, размер квоты выбирается индивидуально для каждого случая. Теперь мы должны создать зону и перевести ее в состояние Configured. Это можно сделать с помощью команды zonecfg:
Нас встретит интерактивный командный интерпретатор. Чтобы создать зону, выполним команду create:
Далее укажем путь до файловой системы зоны:
Установим флаг автозагрузки, чтобы зона стартовала вместе со стартом ОС:
Создадим виртуальный сетевой интерфейс с адресом 192.168.0.1 и привязкой к настоящему интерфейсу pcn0:
Импортируем каталог /opt из глобальной зоны, чтобы иметь доступ к установленным пакетам:
Выведем конфигурацию на экран:
Запустим проверку конфигурации, применим ее и выйдем:
Теперь зона полностью сконфигурирована и готова к установке. Но это лишь базовая настройка, команда zonecfg понимает огромное количество самых разнообразных команд, примеры использования которых приведены ниже: 1. Подключение каталога /usr/local глобальной зоны к каталогу /opt/local настраиваемой зоны в режиме «только для чтения» и с отключенными файлами устройств (обрати внимание на опцию type=lofs, она говорит, что в качестве файловой системы должна использоваться loopback fs): По умолчанию из глобальной зоны подключаются также разделы /lib, /platform, /sbin и /usr, поэтому в их ручном подключении смысла нет. 2. Подключение дискового устройства /dev/dsk/c0t0d0s7 с файловой системой UFS к каталогу /mnt:
3. Ограничение выделенной оперативной и swap-памяти для зоны (100 Мб):
4. Выделение зоне только 50% ресурсов процессора:
5. Создание Linux-зоны:
6. Наделение зоны дополнительными привилегиями:
Эта команда разрешает процессам зоны совершать стандартные системные действия, по умолчанию разрешенные в любой зоне (default), а также изменять системное время (привилегия PRIV_SYS_TIME, которая в опции limitprev превращается в sys_time). Полный список привилегий можно посмотреть в man-странице privileges(5). Вернемся к нашему Apache. После настройки зону необходимо перевести в состояние Installed, а говоря простым языком — установить. Это процедура выполняется с помощью команды «zoneadm -z apache install», однако, если мы просто установим зону, то не получим стандартную систему без Apache и всего, что может понадобиться нашему сайту. Поэтому к указанной команде мы добавим флаг '-e', а после него перечислим все имена пакетов, которые хотим увидеть в устанавливае мой зоне. В нашем случае это стек AMP (Apache, MySQL, PHP):
Команда копирует необходимые файлы базовой установки ОС из глобальной зоны в каталог указанной зоны, создавая копию базовой установки ОС (каталог /usr подключается из глобальной зоны, поэтому копия становится полной), плюс добавляет к ней стандартный набор базовых пакетов и стек AMP. Все конфигурационные файлы приводятся к состоянию по умолчанию, поэтому неглобальные зоны необходимо настраивать индивидуально. Все зоны автоматически наследуют обновления ОС, поэтому если ты выполнишь команду «upgrade» в глобальной зоне, обновления будут автоматически применены ко всем остальным зонам. Чтобы перевести зону в состояние Ready, следует ее «загрузить » с помощью zoneadm:
Если запуск зоны прошел успешно, автоматически будет запущен процесс init, и зона перейдет в состояние Running. Чтобы это проверить, выполни следующую команду:
Если все в порядке, в зону можно войти с помощью команды zlogin:
Это первый запуск зоны, поэтому придется ответить на несколько стандартных вопросов, возникающих по ходу стандартной установки Solaris (настройка сети, выбор временной зоны, сервисов и т.д.) После этого мы получим доступ к консоли и сможем произвести настройку и запустить Apache и MySQL:
Проект «Арбалет»Начиная с версии 2009.06, OpenSolaris обзавелся целым набором технологий под названием Project Crossbow, позволяющих полностью виртуализировать сетевой стек без потерь в производительности. Условно новинку можно разделить на три взаимозависимых элемента:
Будучи объединенными, все эти три составляющие позволяют создавать внутри одной физической машины виртуальные сети практически неограниченных масштабов с выделенными машинами (спасибо технологии зон и VNIC), коммутаторами и маршрутизаторами с одним общим центром управления. Далее мы рассмотрим, как это может помочь при работе с зонами. Как это сделать? Во-первых, чтобы наладить связь виртуального интерфейса нашей зоны с физическим интерфейсом, нам придется создать простую виртуальную сеть, и здесь не обойтись без коммутатора. Создадим его с помощью команды dladm (Data Link Administration):
Также нам нужны два виртуальных сетевых интерфейса: один для глобальной зоны и еще один для зоны Apache. Подключив их к коммутатору, мы наладим связь между двумя этими зонами:
Теперь виртуальный интерфейс хоста можно «поднять» с помощью стандартного ifconfig:
Далее создаем зону Apache или редактируем настройки существующей. Все необходимо сделать так, как описано в предыдущем разделе, за исключением настроек сетевого интерфейса:
После входа в зону с помощью zlogin указываем в настройках адреса роутера (Router IP Address) IP-адрес интерфейса host1, то есть 192.168.0.1. Теперь зона Apache и глобальная зона объединены в сеть с помощью коммутатора, но наш Apache не имеет выхода в Сеть. Чтобы это исправить, необходимо включить форвардинг пакетов через глобальную зону и настроить NAT. Первая задача решается с помощью одной простой команды:
Для решения второй задачи воспользуемся ipnat и добавим в /etc/ipf/ipnat.conf следующие строки:
Также не забудь добавить в /etc/ipf/ipf.conf правила, разрешающие прохождение любых пакетов между двумя виртуальными интерфейсами. В целях отладки можно просто разрешить все:
Активируем брандмауэр и NAT:
Это все. Теперь у нас есть виртуальная сеть, состоящая из двух машин (одна из которых виртуальная) и одного коммутатора. Благодаря виртуализации сетевого стека, зона Apache может иметь собственный брандмауэр, таблицы маршрутизации и настройки управления потоком. Кстати, для конфигурирования последнего используется утилита flowadm. С помощью flowadm ты можешь использовать критерии, чтобы разбить сетевой трафик на независимо контролируемые потоки. Каждый из потоков может иметь собственные настройки QoS, ширины канала и привязки к процессорам (если в системе несколько процессоров/ядер, обработку сетевых потоков можно равномерно распределить между ними). Следующая команда создает независимый сетевой поток для HTTP-трафика и назначает ему имя httpflow:
После того, как поток будет создан, к нему можно применить правила (свойства) шейпинга и/или QoS. Например, следующая команда задает максимальную пропускную способность канала httpflow, равной 8 Мбит/с, и устанавливает высокий приоритет: На данный момент поток может иметь только три возможных свойства:
ВыводыКак видишь, зоны Solaris — действительно очень мощное, удобное и простое в настройке средство создания виртуальных окружений. Вкупе с возможностями Crossbow они превращают солярку в идеальную облачную операционную систему, не требующую установки дополнительного ПО для виртуализации, не оставляя отпечаток на производительности. Установка Apache из исходниковЕсли дистрибутивный пакет Apache тебя по каким-то причинам не устраивает, веб-сервер можно собрать из исходников. Для этого после создания и запуска зоны, но перед входом в нее скачай исходники Apache и положи их в каталог /httpd/src внутри зоны:
Запусти zlogin:
Каталог /usr подключается из глобальной зоны в режиме «только для чтения», поэтому он не пригоден для установки, и ты должен использовать каталог /httpd в качестве корня для Apache:
Теперь сконфигурируй и запусти сервер:
Links
Полезные команды zoneadmЛистинг состояний существующих зон:
Остановка зоны:
Загрузка зоны:
Перезагрузка зоны:
Удаление корневого каталога зоны:
Полное удаление зоны из системы:
|