UPD от 07 января 2016 Описанный ниже вариант рабочий, приверял на FreeBSD 11, платформа arm, Понятно, за отсуствтвием в доступе мира, использовал скомпилированный камрадом alexey123. Но в большинстве случаев гораздо проще и быстрее клетками управлять через TheBrig часть 1, часть 2 или, при установленном Finch chroot, через qjail /UPD
Но сначала – предупреждения.
NB 1. Практически всё делается через командную строку. Что требует опыта. Я буду стараться разъяснять происходящее, но без некоторого минимального понимания можно наломать дров. С другой стороны, поднять полную FreeBSD не намного сложнее и кому-то этот путь может показаться прямее и проще.
NB 2. Для работы нужна уже сконфигурированная и имеющая доступ в Интернет система с nas4free embedded. В ней zfs пул на жестких дисках (у меня по имени Pool), с доступом по ssh. Например – через Putty.
Сделано на основе этого с исправлением погрешностей, из-за которых на embedded не работало и дополнениями.
Подготовка.
Прим. Если у вас пул называется иначе, например MYpool, везде в командах надо заменить Pool на MYpool. Напомню, большие и маленькие буквы – это разные буквы в *nix.
Если у вас zfs не используется - это не препятствие. Просто создаёте папки вместо датасетов и пропускаете команды по созданию снимков (снапшотов)
Создадим на пуле датасет под джейл
Все команды, что даны жирным курсивом, вводятся в консоли - например по ssh
zfs create -o compression=lzjb -o dedup=off -o sync=standard -o atime=off -o snapdir=visible Pool/Jail
Сделаем снимок пустого датасета, чтобы к нему при необходимости откатитьсяzfs snapshot Pool/Jail@clean
Через вебгуй сохраним конфиг nas4free
Создаем папки на диске в памяти и на пуле, объединяем их
mkdir /jail
mkdir /mnt/Pool/Jail/{work,proto,conf}
mount_nullfs /mnt/Pool/Jail /jail
nullfs – потрясающий *nix трюк, позволяющий сделать единую папку из двух совершенно разнородных.
Загрузка.
cd /mnt/Pool/Jail/work
fetch ftp://ftp.freebsd.org/pub/FreeBSD/releas
fetch ftp://ftp.freebsd.org/pub/FreeBSD/releas
Должно быть сообщение об успешной загрузке.
Разархивация
tar xvf /mnt/Pool/Jail/work/base.txz -C /mnt/Pool/Jail/proto/
tar xvf /mnt/Pool/Jail/work/lib32.txz -C /mnt/Pool/Jail/proto/
Установка
cd /mnt/Pool/Jail
mkdir -p conf/root/{etc/rc.d/,usr/bin,usr/sbin}
cp proto/etc/rc.d/jail conf/root/etc/rc.d/
cp proto/usr/sbin/{jail,jexec,jls} conf/root/usr/sbin/
cp proto/usr/bin/mktemp conf/root/usr/bin/
копируем nameserver
cp /etc/resolv.conf /mnt/Pool/Jail/proto/etc/
устанавливаем Московское время
cp /jail/proto/usr/share/zoneinfo/Europe/Mo
Создаём пустой fstab, на случай если придётся монтировать устройства
touch /mnt/Pool/Jail/conf/fstab.proto
Создаём rc.conf.local
touch /mnt/Pool/Jail/conf/rc.conf.local
Теперь нам необходимо узнать задать некоторые параметры.
Имя сетевого интерфейса узнаём через
ifconfig
он даст вывод что-то вроде
em0: flags=8843 metric 0 mtu 1500
options=9b
и т.д.
em0 здесь – рабочий сетевой интерфейс. У вас могут быть другие буквы, напр. re0. Используйте их.
Редактируем конфиг
nano /mnt/Pool/Jail/conf/rc.conf.local
И копируем туда строки ниже. Выделенное жирным, возможно, придётся заменить.
Вместо ="em0" ставим то, что дал ifconfig
Вместо ="192.168.1.33" – выбираем свободный фиксированный ip вашей сети.
Вместо ="proto.nas4free.local": зайдите вебгуем nas4free на System|General Setup. Смотрим верхних две строки – Hostname и Domain. У меня они nas4free и local соответственно. Если у вас другие – используйте ваши. “proto” впереди – оставляем
Итак, содержимое /mnt/Pool/Jail/conf/rc.conf.local
### EXAMPLE - MODIFY TO FIT YOUR NEEDS ###
jail_enable="YES" # enable jails YES|NO
jail_list="proto" # name of the jails to start "proto www..."
jail_proto_rootdir="/jail/proto" # path to our jail
jail_proto_hostname="proto.nas4free.local" # hostname
jail_proto_ip="192.168.1.33" # ip of the jail
jail_proto_interface="em0" # Network Interface to use, replace on your NAS interface name
jail_proto_devfs_enable="YES" # use devfs
jail_proto_mount_enable="YES" # mount YES|NO
jail_proto_fstab="/jail/conf/fstab.proto"
Теперь содержимое надо сохранить, жмем последовательно
Ctrl-X
Y
[Enter]
Создаём папку, в которую будем отображать медиатеку, к которой должны иметь доступ программы из джейла. Вместо Media можете выбрать любые буквы, можете сделать несколько таких папок, например для аудио и видео или для нескольких пулов
mkdir /mnt/Pool/Jail/proto/mnt/Media
Создаём инициализирующий скрипт.
nano /mnt/Pool/Jail/conf/jail_start
Его содержимое:
#!/bin/tcsh -x
#mounting to /jail
mkdir /jail
mount_nullfs /mnt/Pool/Jail /jail
mount_nullfs /mnt/Pool/Media /jail/proto/mnt/Media
# copy jail binaries to /usr
cp -r /jail/conf/root/ /
# link config files to /etc
ln -s /jail/conf/rc.conf.local /etc
#start all jails
/etc/rc.d/jail start
Обратите внимание на строку
mount_nullfs /mnt/Pool/Media /jail/proto/mnt/Media
Она "строит мост" между файловой системой основной машины и файловой системой джейла.
Вместо /mnt/Pool/Media вам надо выбрать ту папку, с которой реально лежит медиатека. Вместо /jail/proto/mnt/Media – то, что вы создали предыдущей командой. Если надо связать несколько папок – пишем несколько строк.
Сохраняем - жмём
Ctrl-X
Y
[Enter]
Даём права на исполнение
chmod 755 /mnt/Pool/Jail/conf/jail_start
Теперь идем в вебгуй, и в System|Advanced|Command Scripts добавляем
Command: /mnt/Pool/Jail/conf/jail_start
Type: PostInit
В принципе мы закончили, осталось испытать.
Но давайте сначала сохраним работу. Сохраним конфиг через вебгуй и дадим команду
zfs snapshot Pool/Jail@freshly_created
Перегружаем машину, например командой
reboot
Снова входим по ssh (я теперь привожу системные приглашения, напр. nas4free:~#)
nas4free:~# jls
Если вы нигде не ошиблись, то выведется что-то вроде
JID IP Address Hostname Path
1 192.168.1.33 proto.nas4free.local /jail/proto
Ура, получилось. Входим в jail. Вместо 1 набираем цифру, стоящую под JID
nas4free:~# jexec 1 $SHELL
Системное приглашение меняется
proto#
Мы – внутри. Завтра займемся установкой miniDLNA в джейл.
Пока выйдем
proto# exit
exit
nas4free:~#
Если же что-то не получилось – внимательно проверяем что наделали. Можно откатиться к исходному
nas4free:~# zfs rollback –r Pool/Jail@clean
и, уж если хочется умыть руки и всё это закончить – восстановить предыдущий конфиг через вебгуй.