вторник, 23 ноября 2010 г.

Зоны Solaris I: Установка

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

Про зоны написано уже достаточно много, не буду повторяться. Постараюсь писать о том, чего, на мой взгляд, еще не было.

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

Установка зон очень сильно завязана на файл /var/sadm/install/contents, это всем известно. При повреждениях любого рода данного файла установка зон становится невозможной.

Но тот факт, что она еще и очень сильно завязана на директории /var/sadm/pkg/*/save был для меня полной неожиданностью.

Достаточно часто в административной практике с целью экономии пространства  после установки и тестирования патчей директории save просто удаляются. Сюрприз! После их удаления  успешная установка зон также становится невозможной.

Иначе говоря, удаление бэкаутов для патчей нужно выполнять не командой:

# find /var/sadm/pkg -name save -exec rm -Rf {} \;

а командой

# find /var/sadm/pkg -name -name obsolete.Z -o -name undo.Z -exec rm -f {} \;

Учтите, что в случае акцидентального удаления директорий save не помогает ни апгрейд системы (при апгрейде обновляются только файлы, уже имеющиеся в системе), ни установка патч-кластеров (они, как правило, не содержат обновлений всех без исключения установленных пакетов). И для нормальной инсталляции зон (конфигурирование обычно не вызывает никаких струдностей) может потребоваться полная переустановка системы.

Еще один сюрприз касается создания датасетов файловых систем ZFS в зонах.

В общем-то логично использовать с зонами ZFS.

Однако не все так гладко и, тем более, не все хорошо задокументировано. Некоторые вопросы не документированы в принципе.

Простой эксперимент показывает, что, если формировать zonepath от уровня пула хранения (stprage pool) ZFS, то датасеты зон создаются автоматически в процессе инсталляции зоны. После чего можно на эти датасеты установить квоты, которые будут видны внутри зон как максимальный объем системы хранения:

root @ pegasus /stage # zfs get quota data/zone1
NAME        PROPERTY  VALUE  SOURCE
data/zone1  quota     2G     local
root @ pegasus /stage # zlogin -C zone1
[Connected to zone 'zone1' console]

# df -h
Filesystem             size   used  avail capacity  Mounted on
/                      2.0G   313M   1.7G    16%    /
/data/stage            8.7G    61K   8.7G     1%    /data/stage
/dev                   2.0G   313M   1.7G    16%    /dev
/lib                    13G   3.6G   9.0G    29%    /lib
/opt                    13G   3.6G   9.0G    29%    /opt
/platform               13G   3.6G   9.0G    29%    /platform
/sbin                   13G   3.6G   9.0G    29%    /sbin
/usr                    13G   3.6G   9.0G    29%    /usr
proc                     0K     0K     0K     0%    /proc
ctfs                     0K     0K     0K     0%    /system/contract
mnttab                   0K     0K     0K     0%    /etc/mnttab
objfs                    0K     0K     0K     0%    /system/object
swap                   1.9G   244K   1.9G     1%    /etc/svc/volatile
/usr/lib/libc/libc_hwcap1.so.1
                        13G   3.6G   9.0G    29%    /lib/libc.so.1
fd                       0K     0K     0K     0%    /dev/fd
swap                   1.9G     0K   1.9G     0%    /tmp
swap                   1.9G    12K   1.9G     1%    /var/run


Вот здесь подстерегает сюрприз номер два.

Если попытаться определить путь зоны не от пула хранения, а от предварительно созданного датасета (с необходимыми глобальными для зон свойствами, скажем, с заданным recordsize отличным от умолчания), то при инсталляции зоны датасет следующего уровня создан не будет, а будет создана директория в существующем датасете. Причем квота будет действовать на все зоны лишь глобальная, т.е. заданная на уровне датасета, и одна на все зоны.

Сказать, что это неудобно - не то слово.

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

PS. Мне не нравится подход оставлять значения параметров хранения ZFS по умолчанию. В большинстве случаев recordsize по умолчанию слишком велико, если только мы не строим хранилище под огромные объемы и для хранения действительно больших файлов.  Соответственно, под зоны действительно лучше выделить отдельный пул хранения и определить на нем необходимые значения параметров хранения, которые будут наследоваться зонами.