Solaris Container (zone). Создание и администрирование. Часть 1
Технология Solaris Zone (Solaris Container) – это технология, позволяющая разделить на программном уровне Solaris 10 ОС на контейнеры(зоны), почти самостоятельные ОС, которые могут иметь отдельные независимые ресурсы (процессоры, память, дисковое пространство) и своих собственных пользователей.
Конетейнеры – это хорошее решение для построение серверов приложений, в которых каждое приложение будет иметь свой честный гарантированный (или разделяемый между всеми зонами) кусочек ресурсов, с которым сможет работать. Такое решение позволит консолидировать инфраструктуру на более мощных серверах, что в общем понизит стоимость и сложность информационных систем.
- Домены – Oracle VM Server for SPARC (ex LDom от Sun) или IBM LPARы
- Виртуальные машины – Vmware, Microsoft Hyper-V etc
- Изолированные разделы на уровне ОС – Solaris Zones, FreeBSD Jail, LVS (Linux Virtual Server)
Особенности Solaris Zones:
- Безопасность – приложение, запущенное в зоне, запущено в «песочнице», то есть процесс, даже запущенный от имени root в рамках зоны, не может повлиять на другие зоны или на global зону (управляющая, корневая зона). Перезагрузка или выключение доступно только из global зоны.
- Изоляция – зоны имеют исключительное право на выделенные ей ресурсы; зоны могу иметь своих собственных пользователей и свое собственного пользователя root. Перезагрузка зоны никак не может повлиять на другие зоны, работающие на хосте
- Гибкость – ресурсы зоне могу быть назначены жестко или зона может использовать общий пул ресурсов хоста.
Для демонстрации установим зону с именем habrazone.
У меня Solaris OS 10 09/10 и установлена она на ZFS. В следующей статье я опишу процесс создания отдельного пула на ZFS, установки в этот пул зоны, а так же выделение гарантированных CPU и RAM для зоны, а в этой – только установка зоны в отдельную директорию без привязки ее к ресурсам. Зона будет без изысков (проброса физических сетевых интерфейсов, raw устройств etc), а просто с виртуальным сетевым интерфейсом на уровне хоста.
Итак, для начала создадим директорию, в которую будет установлена зона, и назначим права для нее
# mkdir /export/habrazone # chown root:root /export/habrazone # chmod 700 /export/habrazone
Все просто. Только root может смотреть в эту зону и больше никто.
Для создания зоны используем команду zonecfg с ключом –z.
# zonecfg -z habrazone habrazone: No such zone configured Use 'create' to begin configuring a new zone. zonecfg:habrazone> create zonecfg:habrazone> set zonepath=/export/habrazone zonecfg:habrazone> set autoboot=true zonecfg:habrazone> add net zonecfg:habrazone:net> set physical=bge0 zonecfg:habrazone:net> set address=10.44.3.92 zonecfg:habrazone:net> end zonecfg:habrazone> add attr zonecfg:habrazone:attr> set name=comment zonecfg:habrazone:attr> set type=string zonecfg:habrazone:attr> set value="Habrahabr" zonecfg:habrazone:attr> end zonecfg:habrazone> verify zonecfg:habrazone> commit zonecfg:habrazone> exit
Теперь немного прокомментирую то, что тут произошло:
zonecfg:habrazone> create — создаем зону. На самом деле зоны еще как таковой нет. Это всего навсего ее конфиг в XML. zonecfg:habrazone> set zonepath=/export/habrazone — зона будет располагаться по пути /export/habrazone zonecfg:habrazone> set autoboot=true — зона будет запускать автоматически вместе с загрузкой хоста, например после ребута. zonecfg:habrazone> add net — добавляем сетевой интрефейс в конфиг зоны zonecfg:habrazone:net> set physical=bge0 — виртуальный интерфейс будет размещен над bge0 zonecfg:habrazone:net> set address=10.44.3.92 — адрес нашей зоны zonecfg:habrazone:net> end — конец zonecfg:habrazone> add attr — добавил «название» для зоны zonecfg:habrazone:attr> set name=comment zonecfg:habrazone:attr> set type=string zonecfg:habrazone:attr> set value=«Habrahabr» — наш любимый ресурс zonecfg:habrazone:attr> end — и опять конец zonecfg:habrazone> verify — проверим конфиг. Если в конфиге есть ошибки, то в этом месте нам об этом сообщат zonecfg:habrazone> commit — коммит zonecfg:habrazone> exit — выход
Посмотрим наш конфиг целиком. Обратите внимание на inherit-pkg-dir. Они указывают на директории, которые «наследуются» из global зоны.
# zonecfg -z habrazone info zonename: habrazone zonepath: /export/habrazone brand: native autoboot: true bootargs: pool: limitpriv: scheduling-class: ip-type: shared hostid: inherit-pkg-dir: dir: /lib inherit-pkg-dir: dir: /platform inherit-pkg-dir: dir: /sbin inherit-pkg-dir: dir: /usr net: address: 10.44.3.92 physical: bge0 defrouter not specified attr: name: comment type: string value: Habrahabr
Сейчас у нас только 1 зона – глобальная. Список зон можно посмотреть командой zoneadm c ключами list –iv:
# zoneadm list -iv ID NAME STATUS PATH BRAND IP 0 global running / native shared
Теперь у нас все готов к инсталляции зоны. Для инсталляции зоны используется уже знакомая команда zoneadm, но в качестве параметров ей передается имя еще незаинсталлиной зоны с командой install:
# zoneadm -z habrazone install A ZFS file system has been created for this zone. Preparing to install zone habrazone. Creating list of files to copy from the global zone. Copying 3137 files to the zone. Initializing zone product registry. Determining zone package initialization order. Preparing to initialize 1207 packages on the zone. Initialized 1207 packages on zone. Zone habrazone is initialized. The file /export/habrazone/root/var/sadm/system/logs/install_log contains a log of the zone installation. Хотел бы обратить внимание, что в зону файлы ОС копируются из global зоны, а часть директорий наследуются. Наследуемые директории в зоне находятся в read only.
В списке зон у нас появилась новоустановленная зона:
# zoneadm list -iv ID NAME STATUS PATH BRAND IP 0 global running / native shared - habrazone installed /export/habrazone native shared
И размер ее очень небольшой как для почти отдельной ОС.
# du -shk /export/habrazone/ 79M /export/habrazone
Запуск и остановка выполняется с помощью команды zoneadm –z <имя зоны> boot и zoneadm –z <имя зоны> halt соответственно:
# zoneadm -z habrazone boot
После запуска зоны можно проверить что поменялось, например в конфигурации сетевых интерфейсов хоста. # /sbin/ifconfig -a lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1 inet 127.0.0.1 netmask ff000000 lo0:1: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1 zone habrazone inet 127.0.0.1 netmask ff000000 bge0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2 inet 10.44.3.93 netmask ffffff00 broadcast 10.44.3.255 ether 0:14:4f:79:91:1a bge0:1: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2 zone habrazone inet 10.44.3.92 netmask ffffff00 broadcast 10.44.3.255
Как видно из вывода ifconfig, в системе появился виртуальный интерфейс, на который назначен адрес зоны. Зоне можно так же отдать отдельный физический интерфейс, например, в случае если в зоне поднято приложение, которое активно эксплуатирует сеть, и дать возможность другим зонам нормально функционировать.
После того, как зона загрузилась, необходимо зайти в нее консоль и провести минимальную конфигурацию (hostname, time zone, name service, пароль root etc).
Зайти можно используя zlogin –C <имя зоны>:
# zlogin –C habrazone
Далее отвечаем на вопросы ОС о hostname, time zone, name service, вводим пароль root. После всех конфигурационных шагов зона сама перезагрузится и мы сможем попасть в ее консоль по средстава все того же zlogin <имя зоны> или по ssh:
# hostname globalzone # zlogin habrazone [Connected to zone 'habrazone' pts/1] Last login: Fri Jul 1 18:43:32 on pts/3 Oracle Corporation SunOS 5.10 Generic Patch January 2005 # hostname habrazone
В следующей статье я постараюсь описать то, как можно выделать ресурсы(raw, CPU, RAM) для зоны и как можно мигрировать зоны между хостами.