, последнее обновление:

Первоначальная настройка клеток

В мире Linux у меня был дебиановский присид для виртуалок и шаблон для LXC контейнеров. Это было очень удобно, потому что можно было не повторять одни и те же действия по настройке, вроде установки ZSH в качестве шелла, использования своего конфига, ввода виртуалки или контейнера в домен и т.д. Захотелось чего-то подобного и тут, во фряхе. Выход был найден - делаем, как я это называю, “метаклетку”, в которой все настраиваем, а новые клетки делаем уже копированием этой метаклетки.

Тут стоит сделать важное замечание - я использую ZFS, поэтому мне это было делать хорошо, годно и удобно. С UFS у меня очень натянутые отношения, потому что она по производительности сильно проигрывает ZFS (по моим ощущениям), да и снапшотов нормальных у нее нет. Так что все дальнейшие действия подразумевают использование ZFS в качесте ФС и установку Root-On-ZFS с помощью инсталлятора фряхи.

Перво-наперво

Включаем автозапуск клеток через /etc/rc.conf:

jail_enable="YES"

Нам же нужен автозапуск наших клеток, правда? :)

Если не нужен - то эту опцию можно не добавлять.

Подготовка клетки

Для начала определимся с директорией, где будут лежать клетки. Я не мудрствовал - использовал /usr/jails для этого. Создаем датасет:

zfs create -o compression=lz4 -o mountpoint=/usr/jails zroot/usr/jails

Далее - создаем датасет для нашей метаклетки:

zfs create -o compression=lz4 -o mountpoint=/usr/jails/11-2-amd64 zroot/usr/jails/11-2-amd64

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

После чего выкачиваем фряшную базу:

cd /usr/jails
fetch https://mirror.yandex.ru/freebsd/releases/amd64/11.2-RELEASE/base.txz
fetch https://mirror.yandex.ru/freebsd/releases/amd64/11.2-RELEASE/lib32.txz
fetch https://mirror.yandex.ru/freebsd/releases/amd64/11.2-RELEASE/ports.txz

Внимание: если вы не предполагаете использование портов в клетках, то последний файл можете не выкачивать. Аналогично и про lib32 - если вы не планируете запускать 32битные приложения в 64битном окружении, то lib32.txz вам так же не нужен.

Разархивируем:

tar -xf base.txz -C /usr/jails/11-2-amd64
tar -xf lib32.txz -C /usr/jails/11-2-amd64
tar -xf ports.txz -C /usr/jails/11-2-amd64

Далее надо создать конфиг для клеток. Он разделен на две части - общий, для всех клеток, и для каждой клетки отдельно. Таким образом можно задать общие параметры всем клеткам и каждой отдельной назначить, например, хостнейм и IP адрес. Пишем в /etc/jail.conf:

exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
exec.clean;
mount.devfs;
path = "/usr/jails/$name";
interface = "tap0";
allow.raw_sockets = 1;
exec.fib = 1;
 
# Reference thing.
11-2-amd64 {
    host.hostname = "11-2-amd64";
    ip4.addr = "tap0|192.168.1.250/24";
    allow.chflags = 1;
    allow.socket_af = 1;
}

Сначала мы задаем общие параметры для всех клеток, такие как скрипты, которые будут выполняться при запуске и выключении клетки, путь до клеток, интерфейс, который будет использоваться клетками, разрешение использовать сырые сокеты (для ping, traceroute, etc) и таблицу маршрутизации.

Далее следует секция описания нашей метавиртуалки, в которой:

  1. Назначается хостнейм.
  2. Назначается IP адрес на интерфейс tap0.
  3. Разрешаем использовать спецфлаги на файлах (типа suid). По-умолчанию это запрещено.
  4. Разрешаем открывать любые виды сокетов для любых протоколов (по-умолчанию это запрещено).

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

Подробное описание каждой опции можно почитать в man jail.conf.

Создаем клетку:

jail -c 11-2-amd64

Эта команда сделает все необходимое для запуска клетки и запустит ее в первый раз. Все, теперь с клеткой можно работать :).

Первый вход в клетку

Во время первого входа нам нужно просто включить ssh, для этого выполняем:

jexec 11-2-amd64 sh

Нас кинет в шелл этой клетки. Добавим в /etc/rc.conf этой клетки строчку:

sshd_enable="YES"

Для чего это нужно? Чтобы SSH использовал правильную таблицу маршрутизации, потому что при jexec используется таблица с хоста, которая не подходит для работы с клеткой.

После этого жмем CTRL+D для выхода из клетки и перезапускаем ее:

service jail stop 11-2-amd64
service jail start 11-2-amd64

Внимание: если вам не нужен автозапуск клеток и вы не указывали jail_enable в /etc/rc.conf, то вместо stop используйте onestop!

Все, теперь можно входить в клетку по SSH и с правильной таблицей маршрутизации. Настройте ее под себя (свой шелл, конфиг, нужные приложения и т.д.).

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

rm /usr/jails/11-2-amd64/etc/ssh/ssh_host*

Создание боевой клетки

Повторяем практически те же действия. Например, создаем клетку для файлопомойки с samba:

zfs create -o compression=lz4 -o mountpoint=/usr/jails/fileserver zroot/usr/jails/fileserver
# Копируем метаклетку в новую клетку.
zfs send zroot/jails/11-2-amd64 | zfs recv -F zroot/jails/fileserver

Добавляем в конец файла /etc/jail.conf:

fileserver {

    host.hostname = "fileserver";
    ip4.addr = "tap0|192.168.1.2/24";

}

Даем команду:

jail -c fileserver

Все, можно SSHиться :).

Автозапуск только выбранных клеток

Добавляем в /etc/rc.conf хоста:

jail_list="jail1 jail2"

Можно добавить неограниченное количество клеток в автостарт. Самое классное - клетки будут запускаться в указанном порядке, то есть сначала запустится jail1, потом jail2 и т.д. Это полезно, если у вас в разных клетках стоит, к примеру, mysql и веб-приложение, которому эта mysql нужна - логично, что сначала должен запуститься mysql (или клетка с ним), а потом уже веб-приложение.