Механизм зон в 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, то датасеты зон создаются автоматически в процессе инсталляции зоны. После чего можно на эти датасеты установить квоты, которые будут видны внутри зон как максимальный объем системы хранения:
Вот здесь подстерегает сюрприз номер два.
Если попытаться определить путь зоны не от пула хранения, а от предварительно созданного датасета (с необходимыми глобальными для зон свойствами, скажем, с заданным recordsize отличным от умолчания), то при инсталляции зоны датасет следующего уровня создан не будет, а будет создана директория в существующем датасете. Причем квота будет действовать на все зоны лишь глобальная, т.е. заданная на уровне датасета, и одна на все зоны.
Сказать, что это неудобно - не то слово.
Опаньки. Это означает, что установить зону с недефолтными параметрами в принципе можно. Однако для этого придется для зон создать отдельный пул хранения и определить необходимые дефолтные значения на нем. В противном случае раздельное квотирование датасетов зон сделать не удастся.
PS. Мне не нравится подход оставлять значения параметров хранения ZFS по умолчанию. В большинстве случаев recordsize по умолчанию слишком велико, если только мы не строим хранилище под огромные объемы и для хранения действительно больших файлов. Соответственно, под зоны действительно лучше выделить отдельный пул хранения и определить на нем необходимые значения параметров хранения, которые будут наследоваться зонами.
Еще один сюрприз касается создания датасетов файловых систем 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 по умолчанию слишком велико, если только мы не строим хранилище под огромные объемы и для хранения действительно больших файлов. Соответственно, под зоны действительно лучше выделить отдельный пул хранения и определить на нем необходимые значения параметров хранения, которые будут наследоваться зонами.
