Сегодня запустим менеджер клеток (jails) ezjail на nas4free embedded. В отличие от всех остальных приблуд для облегчения управления клетками, он прямо описан аж во FreeBSD Handbook отдельной главой. То есть можно ожидать стабильной поддержки. Прим. не факт, что мне ezjail понадобится - но потыкать палочкой хочу. Особенно подкупает автоматизация раскладки каждой клетки по отдельному датасету. Я пытался ранее что-то такое делать вручную - очень удобно делать снимки, откатываться к ним.
UPD от 16 авг 2015
Нашел и кое-как адресовал проблему с /etc/fstab.${ezjail_safename}
/UPD
1) Создаём датасет под ezjail. У меня будет Pool/Ext/ezjail
Можно через вебгуй (Disks|ZFS|Datasets|Dataset), параметры по умолчанию OK, я только люблю ставить atime в off.
2) Идём в командную строку - устанавливаем ezjail
Будь у нас полная система - сработало бы pkg install ezjail. Но у нас embedded и такое не переживёт перезагрузки. (Впрочем, тоже способ - подменить конфиг и можно заставить работать. Но мы пойдём другим путём)
Качаем пакет и проверяем, что скачался
nas4free: ~# pkg fetch ezjail
nas4free: ~# ls /var/cache/pkg
ezjail-3.4.1_1-c522862a6f.txz ezjail-3.4.1_1.txz
Идём в рабочую папку, выбранную в п 1, достаём их пакета нужное, удаляем лишнее. У нас должна остаться папочка local.
nas4free ~/ root~$ cd /mnt/Pool/Ext/ezjail/
nas4free: ezjail# tar xf /var/cache/pkg/ezjail-3.4.1_1.txz
tar: Removing leading '/' from member names
nas4free: ezjail# ls
+COMPACT_MANIFEST +MANIFEST usr
nas4free: ezjail# cp -Rp usr/ ./
nas4free: ezjail# rm -rf +*
nas4free: ezjail# rm -rf usr
3) согласно freshports ezjail не тянет зависимостей. Но, как оказалось, он использует пару системных утилит, выпиленных из nas4free - xzdec и cpio. Их можно достать из архива freebsd, я для быстроты скопировал из finch.
nas4free etc/ root~$ cd /mnt/Pool/Ext/ezjail/local/bin/
nas4free bin/ root~$ cp /mnt/Pool/Ext/Finch/usr/bin/xzdec ./
nas4free bin/ root~$ cp /mnt/Pool/Ext/Finch/usr/bin/bsdcpio ./
nas4free bin/ root~$ ln bsdcpio cpio
cpio оказалась симлинком на bsdcpio - сделал хардлинк для простоты.
4) Создаём и редактируем конфиг
nas4free bin/ root~$ cd /mnt/Pool/Ext/ezjail/local/etc/
nas4free: etc# cp -a ezjail.conf.sample ezjail.conf
nas4free: etc# nano ezjail.conf
Здесь нам понадобятся строки
ezjail_jaildir=/mnt/Pool/Ext/ezjail/jail dirzfs
ezjail_use_zfs="YES"
ezjail_use_zfs_for_jails="YES"
ezjail_jailzfs="Pool/Ext/ezjail/jaildirz fs"
Первая - обязательно (иначе будет ставиться на диск в памяти, заполнит его и вылетит)
Остальные - только если вы хотите использовать zfs функционал ezjail.
Естественно, если у вас другие папки, не как у меня - ставим свои.
ВАЖНО. Эти папки и датасеты НЕ создаём! Система сама справится.
5) Здесь же делаем грязный хак - в файлах ezjail и ezjail-admin выставляем переменную ezjail_prefix. Я понимаю, что грязный - но иначе перезагрузку клетки не переживают, а копировать постинит скриптом - тоже не ах вариант.
nano /mnt/Pool/Ext/ezjail/local/etc/rc.d/ezja il
В самом верху должно стать так - оригинальную строку комментируем, создаём в соответствии с реальным расположением
#ezjail_prefix=/usr/local
ezjail_prefix=/mnt/Pool/Ext/ezjail/local
nas4free ~/ root~$ nano /mnt/Pool/Ext/ezjail/local/bin/ezjail-ad min
# ezjail_prefix=/usr/local
ezjail_prefix=/mnt/Pool/Ext/ezjail/local
6) Надо адресовать ещё одну проблему.
при создании каждой клетки скрипт ezjail-admin создаёт
/etc/fstab.${ezjail_safename}
Для новой клетки с именем test6 там лежит что-то типа
/mnt/Pool/Ext/ezjail/jaildirzfs/basejail /mnt/Pool/Ext/ezjail/jaildirzfs/test6/ba
Понятно, что при рестарте этот fstab.${ezjail_safename} пропадает. Проверил, если его руками создать - клетка стартует успешно.
То есть эти файлы надо сохранять и при загрузке хоста возобновлять. Возобновлять нетрудно - добавим команду в стартовый скрипт.
А вот сохранять автоматически не так просто. Можно, конечно, по cron проверять не изменилось ли что-то. Но мне ближе идея руками скопировать при создании клетки или изменении ей таблицы монтирования её fstab.${ezjail_safename} в папку хранения.
Создадим такую папку хранения.
nas4free ~/ root~$ cd /mnt/Pool/Ext/ezjail/
nas4free ezjail/ root~$ mkdir fstabkeep
При старте хоста будем из неё возобновлять fstab клеток
cp -a /mnt/Pool/Ext/ezjail/fstabkeep/fstab.* /etc/
А при создании клетки или изменении её таблицы монтирования ручками будем изменения сохраниять
cp -a /etc/fstab.имя_нашей_клетки /mnt/Pool/Ext/ezjail/fstabkeep/
Ну и при удалении клетки было бы аккуратно удалить и её fstab из папочки fstabkeep
7) Монтируем наше хозяйство в систему
nas4free: etc# mount_unionfs -o below /mnt/Pool/Ext/ezjail/local/ /usr/local
8) Делаем тестовый запуск
nas4free: etc# /usr/local/etc/rc.d/ezjail onestart
Если не ругается - настраиваем автостарт при перезагрузке
Если ругается - смотрим, что напортачили
9) Настраиваем автостарт при перезагрузке
Редактируем rc.conf через вебгуй

Создаём скрипт из трёх комманд
/sbin/mount_unionfs -o below /mnt/Pool/Ext/ezjail/local/ /usr/local
/bin/cp -a /mnt/Pool/Ext/ezjail/fstabkeep/fstab.* /etc/
/usr/local/etc/rc.d/ezjail start
и добавляем его как PostInit в System|Advanced|Command scripts
Чтобы не плодить сущности, я добавил сами команды в одну строку
/sbin/mount_unionfs -o below /mnt/Pool/Ext/ezjail/local/ /usr/local && /bin/cp -a /mnt/Pool/Ext/ezjail/fstabkeep/fstab.* /etc/ && /usr/local/etc/rc.d/ezjail start
10) Перегружаем хост
11) Идём в командную строку и качаем архивы оси
nas4free etc/ root~$ ezjail-admin install
Если ругается - скорее всего напортачили с конфигом.
Останавливаем ezjail
/usr/local/etc/rc.d/ezjail stop
Редактируем конфиг как в п 4, чистим то, что создалось (датасет удаляется командой zfs destroy -r имя вместе со всеми дочерними)
Запускаем
/usr/local/etc/rc.d/ezjail start
12) Проверяем
Появились датасеты
nas4free etc/ root~$ zfs list
NAME USED AVAIL REFER MOUNTPOINT
Pool 16.3T 3.71T 30.7G /mnt/Pool
(бла-бла)
Pool/Ext/ezjail 504M 3.71T 1.12M /mnt/Pool/Ext/ezjail
Pool/Ext/ezjail/jaildirzfs 503M 3.71T 503K /mnt/Pool/Ext/ezjail/jaildirzfs
Pool/Ext/ezjail/jaildirzfs/basejail 491M 3.71T 491M /mnt/Pool/Ext/ezjail/jaildirzfs/basejail
Pool/Ext/ezjail/jaildirzfs/newjail 11.1M 3.71T 11.1M /mnt/Pool/Ext/ezjail/jaildirzfs/newjail
IMHO в вебгуй их импортировать НЕ надо - но можно при желании. Их будет больше - на каждую клетку - свой.
13) Смотрим наш сетевой интерфейс по ifconfig
nas4free etc/ root~$ ifconfig
re0: flags=8843 metric 0 mtu 1500
бла-бла
Видно, что у меня re0.
14) Создаём тестовую клетку
nas4free etc/ root~$ ezjail-admin create test 're0|192.168.1.65'
Warning: Some services already seem to be listening on all IP, (including 192.168.1.65)
This may cause some confusion, here they are:
972 Plex DLNA 3921 12 udp4 *:1900 *:*
972 Plex DLNA 3921 15 tcp4 *:2038 *:*
бла-бла
Она предупреждает, что другие сервисы тоже могут слушать этот IP
15) Стартуем её
nas4free etc/ root~$ ezjail-admin start test
Starting jails: test
/etc/rc.d/jail: WARNING: Per-jail configuration via jail_* variables is obsolete. Please consider to migrate to /etc/jail.conf.
Предупреждает, что используется устаревший метод настройки - но пока переживём.
16) Дальше можно посмотреть что получилось, войти в клетку
nas4free ~/ root~$ ezjail-admin list
STA JID IP Hostname Root Directory
--- ---- --------------- ------------------------------ ------------------------
ZR 3 192.168.1.65 test /mnt/Pool/Ext/ezjail/jaildirzfs/test
nas4free ~/ root~$ jls
JID IP Address Hostname Path
1 192.168.1.52 fail2ban /mnt/Pool/Ext/Finch/usr/jails/fail2ban
2 192.168.1.54 tm /mnt/Pool/Ext/Finch/usr/jails/tm
3 192.168.1.65 test /mnt/Pool/Ext/ezjail/jaildirzfs/test
nas4free ~/ root~$ jexec 3 tcsh
root@test:/ #