Первоначальная настройка клеток
В мире 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) и таблицу маршрутизации.
Далее следует секция описания нашей метавиртуалки, в которой:
- Назначается хостнейм.
- Назначается IP адрес на интерфейс tap0.
- Разрешаем использовать спецфлаги на файлах (типа suid). По-умолчанию это запрещено.
- Разрешаем открывать любые виды сокетов для любых протоколов (по-умолчанию это запрещено).
Последние два параметра назначены специально, чтобы можно было провести предварительную настройку и указывать их для других (боевых) клеток нет необходимости, если только это не требует приложение.
Подробное описание каждой опции можно почитать в 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 (или клетка с ним), а потом уже веб-приложение.