Pull to refresh

Solaris Container (zone). Создание и администрирование. Часть 2

System administration *
Solaris Container (zone). Создание и администрирование. Часть 1

Добрый день, %username.

В первой части статьи я постарался рассказать о том, что такое зоны в Solaris, их преимущества как одного из подходов виртуализации. Так же была успешно установлена обычная зона, без «плюшек» и других «наворотов». В этой же части я хочу показать как можно баловаться плюшками и добавим наворотов в нашу зону.

Для начала удалим зону, которую мы создали в предыдущей статье, и т.к. у меня сервер установлен на файловую систему ZFS, мы нашу новую зону установим в ZFS датасет. Преимущества и особенности этой файловой системы достойны отдельной большой статьи. Но если коротко, то особенности ZFS это:

  • в ZFS входит не только сама файловая система, но и инструменты для управления разделами и администрирования
  • поддерживает емкие хранилища
  • резервирование данных, самолечение поврежденных частей ФС (за счет вычисленных ранее контрольных сум)
  • транзакционная модель записи файлов на диск
  • поддерживает горячее расширение ZFS пула
  • поддерживает неограниченное количество клонов и снепшотов
  • открытый исходный код и доступна в Solaris 10, MacOS X и FreeBSD


Установка «whole root» zone



И так у меня есть 1 физический диск, c1t1d0, на котором мы создадим zfs пул и установим туда новую зону.

# zpool create -f habrapool c1t1d0

Создаем zfs-датасет и устанавливаем квоту в 10G, размер датасета:

# zfs create habrapool/zone1
# zfs set quota=10G habrapool/zone1
# chown root:root /habrapool/zone1/
# chmod 700 /habrapool/zone1/


Сейчас у нас следующая структура ZFS

# zfs list -H | grep habrapool
habrapool 107K 66.9G 23K /habrapool
habrapool/zone1 21K 10.0G 21K /habrapool/zone1


На этот раз мы будем устанавливать “whole root” зону, зону в которой отсутствуют наследуемые директорий из глобальной зоны. Зона сможет управлять переданным ей отдельным ZFS -датасетом(например для данных), у нее будет свой отдельный сетевой интерфейс. Установка новых дополнительных пакетов в “whole root” ничем не будет отличаться от обычной ОС.

# zonecfg -z zone1
zonecfg:zone1> create -b

zonecfg:zone1> set ip-type=exclusive
zonecfg:zone1> add net
zonecfg:zone1:net> set physical=bge1
zonecfg:zone1:net> end
zonecfg:zone1> add dataset
zonecfg:zone1:dataset> set name=habrapool/test
zonecfg:zone1:dataset> end

zonecfg:zone1> verify
zonecfg:zone1> commit
zonecfg:zone1> exit


zonecfg:zone1> create –b — создаем «пустую» конфигурацию. Если не использовать ключ –b, то создается структура с наследуемыми диреториями
zonecfg:zone1> set ip-type=exclusive – означает что будем использовать отдельный интерфейс
zonecfg:zone1> add net
zonecfg:zone1:net> set physical=bge1 – добавляем только интерфейс
zonecfg:zone1:net> end
zonecfg:zone1> add dataset
zonecfg:zone1:dataset> set name=habrapool/test – предаем ZFS датасет в зону
zonecfg:zone1:dataset> end

После установки и конфигурации зоны внутри ее появляется датасет, в котором администратор зоны может создавать свои датасеты, назначать на них квоты, компрессию и т.д. Это позволяет достигнуть высокой гибкости и полноценного использования ZFS в зоне.

# zfs list
NAME USED AVAIL REFER MOUNTPOINT
habrapool 3.69G 63.2G 35K /habrapool
habrapool/test 44K 5.00G 23K /habrapool/test
habrapool/test/inzone 21K 1024M 21K /habrapool/test/inzone


Поскольку zonecfg может работать в интерактивном режиме (этот режим использовался до этого) и в режиме файла команд, то мы можем экспортировать файл команд из, например уже готовой зоны, и далее использовать его для создания новых зон.

# zonecfg -z zone1 export -f /zone1.cfg
# cat /zone1.cfg

add dataset
set name=habrapool/test

# zonecfg -z zone2 -f /zone1.cfg


Клонирование зон



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

# zonecfg -z zone1 export -f /zone1.cfg

Теперь нам необходимо отредактировать конфиг, исправив zonepath, имя зоны и IP. После редактирование конфиг выглядит приблизительно так:

create -b
set zonepath=/habrapool/zone2
set autoboot=true
set ip-type=shared
add net
set address=10.44.3.90
set physical=bge1
end
add attr
set name=comment
set type=string
set value=zone2


Далее запускам клонирование:

# time zoneadm -z zone2 clone zone1
Cloning snapshot habrapool/zone1@SUNWzone1
Instead of copying, a ZFS clone has been created for this zone.
real 0m4.522s
user 0m2.342s
sys 0m0.388s


За счет того, что используется ZFS, зона разворачивается из снапшота zone1, и процедура занимает около 5 секунд. Реально новая зона после клонирования по размеру равна 0Мб, т.к. это «дельта» (разница между датасетом zone1 и zon2). Чем больше новых данных будет появляться в zone2, тем больше она будет отличаться от zone1. Реально такое решение необходимо для быстрого разворачивания новых зон, которые буду минимально отличаться между собой. Если есть необходимо создать зону копированием, а не из снепшота, то это можно сделать с параметром –m copy, но времени затрачивается значительно больше, около 6 минут, и zone2 будет занимать ровно столько же на диске сколько и zone1:

# time zoneadm -z zone2 clone -m copy zone1
A ZFS file system has been created for this zone.
Copying /habrapool/zone1...
real 6m2.939s
user 0m9.545s
sys 1m29.881s


Миграция зоны на другой хост



Например, есть задача, мигрировать одну зону с одного хоста на другой хост, чтобы разгрузить один из них. Для начала надо «отцепить» мигрирующую зону от текущего хоста и подготовить ее к миграции:

# zoneadm -z zone2 halt
# zoneadm -z zone2 detach


Теперь нам необходимо скопировать данные на другой хост. Делаем tar архив и копируем его на другой хост в путь /export/data1/ любыми удобными средствами. После копирования на целевом хосте разпаковываем tar-архив в директорию /export/data1/migrzone1. Создаем зону используя zonecfg –z newzone и указываем путь перемещенной detached-зоны. После этого создаcтся конфиг зоны, делаем attach зоны и boot:

# zonecfg -z newzone 'create -a /habrapool/zone2'
# zoneadm -z newzone attach
# zoneadm -z newzone boot


СPU и RAM для зоны



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

zonecfg:zone1> add capped-memory
zonecfg:zone1:capped-memory> set physical=512m
zonecfg:zone1:capped-memory> set swap=1024m
zonecfg:zone1:capped-memory> end


zonecfg:zone1> add capped-memory – выделяем собственную память для зоны
zonecfg:zone1:capped-memory> set physical=512m — это кол-во памяти, которое будет выдано зоне из пула физической памяти.
zonecfg:zone1:capped-memory> set swap=1024m — это не тот swap, к которому мы привыкли. Здесь указывается максимальная виртуальная память, котороя может быть адресована внутри зоны.

Для выделения dedicated cpu, отдельных VCPU, которые будут использоваться только в этой зоне, и не в какой другой (даже в глобальной). Есть более другой способ выделения ресурсов CPU для зон через специальный менеджер ресурсов, но это тема отдельной статьи.

zonecfg:zone1> add dedicated-cpu– выделяем 1 CPU для зоны
zonecfg:zone1: dedicated-cpu > set ncpus=1
zonecfg:zone1: dedicated-cpu > end

Зоне это выглядит так:
bash-3.00# psrinfo -v
Status of virtual processor 0 as of: 07/07/2011 02:14:08
on-line since 07/01/2011 06:56:38.
The sparcv9 processor operates at 1504 MHz,
and has a sparcv9 floating point processor.

bash-3.00# prtconf | grep Memory
Memory size: 512 Megabytes

В этой статье я постарался учесть замечания, который были в комментариях к предидущей части, и продемонстрировать и описать то, что обещал.

Спасиоб за внимание!
Tags:
Hubs:
Total votes 20: ↑18 and ↓2 +16
Views 4.9K
Comments Comments 4