2gusia (2gusia) wrote,
2gusia
2gusia

Category:

Jails или Как расширить функционал nas4free

Сегодня мы создадим на nas4free embedded FreeBSD jail в ручном режиме.
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/releases/`uname -m`/`uname -m`/`uname -r | cut -d- -f1-2`/base.txz
fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/`uname -m`/`uname -m`/`uname -r | cut -d- -f1-2`/lib32.txz


Должно быть сообщение об успешной загрузке.

Разархивация

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/Moscow /mnt/Pool/Jail/proto/etc/localtime

Создаём пустой 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"   # File with Filesystems to mount


Теперь содержимое надо сохранить, жмем последовательно
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

и, уж если хочется умыть руки и всё это закончить – восстановить предыдущий конфиг через вебгуй.
Tags: jail, nas, nas4free, zfs
Subscribe

  • Потрясающе

    Андрея Козлова, гражданина России и Израиля из плена ХАМАС освободили израильские военные. То есть наши дипломаты, столь ярко и пламенно…

  • Булат Окуджава

    Ъ «Я думаю, что патриотизм — биологическое чувство. Хочу я или нет — я патриот» «Интеллигентный человек должен…

  • Похвала глупости. Байден

    Покойный Збигнев Бжезинский ненавидел Россию всеми фибрами того, что заменяло ему душу. Но он был исключительно умным человеком, не чета его…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

  • 11 comments

  • Потрясающе

    Андрея Козлова, гражданина России и Израиля из плена ХАМАС освободили израильские военные. То есть наши дипломаты, столь ярко и пламенно…

  • Булат Окуджава

    Ъ «Я думаю, что патриотизм — биологическое чувство. Хочу я или нет — я патриот» «Интеллигентный человек должен…

  • Похвала глупости. Байден

    Покойный Збигнев Бжезинский ненавидел Россию всеми фибрами того, что заменяло ему душу. Но он был исключительно умным человеком, не чета его…