2020-10 upd: we reached the first fundraising goal and rented a server in Hetzner for development! Thank you for donating !
Внимание! Данные страницы описывают CBSD версии 13.0.x. Если вы используете более раннюю версию, рекомендуется сначала обновиться.
Параметры клеток cbsd
Каждая клетка cbsd имеет свой набор настроек, который используется при старте, останове и работе клеток. Часть из них указывается на этапе создания клетки, остальные вы сможете поменять через команду
% cbsd jconfig jname=jname
Очень немногие параметры в данный момент можно изменить на-лету. Здесь дана краткая информация стандартных параметров.
jname="jail1";
Непосредственно, уникальное имя клетки. Это то имя, которое видно по команде cbsd jls или в списке инвентаризации нод. Данное поле нельзя менять вручную. Если вы хотите поменять имя клетки, воспользуйтесь командой cbsd jrename, поскольку имя клетки используется во многих настройках и путях на файловой системе.
path="/usr/jails/jails/jail1";
Указывает на путь, который будет использован в качестве корня при старте клетки. Вышеописанная конфигурация характерна для клеток, которые имеют настройку baserw равную 0, тоесть, база которых смонтирована в только-чтение. В этом случае, алгоритм работы jstart будет следующим:
- 1) смонтировать через nullfs базу определенной версии (см. ниже) в каталог /usr/jails/jails/$jname
- 2) на уже смонтированную базу $workdir/jails/jails/$jname подмонтировать каталоги, относящиеся непосредственно к клетке (из каталога $workdir/jails-data/$jname), обычно уже в режиме записи.
- 3) стартовать клетку с корнем $workdir/jails/jails/$jname
Если же baserw=1, то nullfs не исползуется, и клетка сразу стартует с каталогом $workdir/jails-data/$jname в качестве корня. В этих случаях, параметр path обычно выглядит как
path=/usr/jails/jails-data/jail1-data
host_hostname="jail1.my.domain";
FQDN, полное имя клетки. Данное поле нельзя менять вручную. Если вы хотите поменять имя клетки, воспользуйтесь командой cbsd jrename
ip4_addr="10.0.0.5/24";
IP адрес клетки. Если планируется использовать несколько IP адресов, они записываются через запятую:
ip4_addr="10.0.0.5/24,192.168.0.2/30,54:04:a6:b2:11:c4/64″;
mount_devfs="1";
Смонтировать ли в клетку файловую систему devfs (каталог /dev). Как правило, большинство сервисов без этого просто не смогут работать.
allow_mount="1";
Можно ли пользователям или сервисам, находящимся внутри клетки монтировать другие файловые системы.
allow_devfs="0";
Можно ли пользователям или сервисам, находящимся внутри клетки монтировать devfs
allow_nullfs="0";
Можно ли пользователям или сервисам, находящимся внутри клетки монтировать nullfs
mount_fstab="/usr/jails/jails-fstab/fstab.jail1";
Путь к файлу, содержащему список каталогов или файловых систем, которые будут примонтированы в клетку при ее запуске
arch="amd64";
Архитектура клетки (и соответственно, базы из $workdir/basejail)
mkhostsfile="1";
Поправить ли в /etc/hosts клетки запись вида
$ip4_add $jname $jname.my.domain
в соответствии с IP адресом и именем (FQDN) клетки
devfs_ruleset="4";
набор правил devfs, которые будут применены на файловую систему devfs в каталоге /dev клетки (список правил в файле /etc/devfs.rules мастер-ноды)
interface="auto";
Запись управляет поведением по автоматическому созданию и удалению IP адресов на интерфейсе либо использованию ранее установленных.
Значение auto означает, что cbsd сама выберет интерфейс, на котором создать IP адрес клетки.
Например: имеется нода с двумя интерфейсами. На интерфейсе igb0 установлен IP и подсеть 10.0.0.2/24 и при этом шлюз по-умолчанию для сервера является 10.0.0.1, в следствии чего igb0 является сетевой картой, через который идет трафик по-умолчанию. На интерфейсе igb1 прописан IP/подсеть 192.168.0.1/24. В случае, если в rc.conf клетки ip4_addr принимает значение 192.168.0.{1-255}, то cbsd автоматически выберет интерфейс igb1 для прописывания IP клетки.
Если ни на одном из интерфейсов нет подсети, в которую входит IP клетки, будет выбран интерфейс по-умолчанию.
Также, значение может быть выставлено в имя интерфейса, если вы не хотите использовать поиск наиболее подходящего интерфейса. Например запись
interface="igb0";
пропишет IP адрес клетки на интерфейсе igb0.
Также как и при запуске, когда cbsd пропишет на интерфейсе нужные клетке IP, при остановке их снимет с интерфейса. Поэтому, будьте предельно аккуратны — если вы пропишите по ошибке в качестве IP клетки адрес непосредственно ноды, то при остановке клетки cbsd выполнит
ifconfig <iface> <ip> -alias
и нода будет потеряна по сети.
Для того, чтобы пресечь управление IP адресами, параметр interface можно закомментировать или удалить, либо значение оставить пустым:
interface="";
В этом случае, cbsd сразу будет запускать jail с соответствующим IP, подразумевая, что он уже инициализирован. Такая ситуация может быть необходима, когда сервер имеет лишь 1 IP адрес, а вы планируете запустить jail (или несколько клеток) на одном имеющимся IP, но с сервисами внутри, которые не конфликтуют по портам. Например, имея 1 IP адрес, вы можете запустить одну клетку с WEB сервером на 80 порту, другую клетку с почтовым сервером на 25 порту и тд.
ver="10.0";
Версия базы для клетки. Имеет прямое отношение к версии FreeBSD. Так, если в rc.conf клетки установлены параметры
arch="amd64" ver="10.0" baserw=0
то при старте клетки в качестве базы будет выбрана ${workdir}/basejail/base_amd64_10.0.
Если стоит
arch="i386" ver="9.1" baserw=0
то, соответственно, будет использован ${workdir}/basejail/base_i386_9.1.
Таким образом вы можете переключать версию базы с одной версии на другую
случае, когда baserw=1, подразумевается что вся база уже была проинициализирована и наполнила собой ${workdir}/jails-data/$jname-data, поэтому эти параметры роли не играют
basename="";
Имя базы. Вы можете собирать кастомизированные base, например собрать минимальное окружение и разместить его в $workdir/base_lite_amd64_9.2. Для того, чтобы указать cbsd что нужно смонтировать данный каталог, basename должен содержать префикс lite:
basename="lite"
baserw="0";
Если 1, подразумевается что клетка имеет свою собственную базовую файловую систему и имеет в нее запись. Как правило, этот параметр задается на этапе создания клетки. Если же вы создали изначально клетку baserw=0 (readonly), но хотите перевести ее в режим baserw=1, вам предварительно необходимо скопировать все базовые файлы в каталог $workdir/jails-data/$jname-data. Например:
cd /usr/jails/basejail/base_amd64_10/ pax -p eme -X -rw . /usr/jails/jails-data/jail1-data
либо, если вы собрали в мастер-ноде объектные файлы:
make -C /usr/src installworld DESTDIR="/usr/jails/jails-data/jail1-data"
Таким же образом на данном этапе, предполагается обновлять клетки, работающие в режиме baserw=1, тк каждая клетка имеет персональную копию базы. Напротив, при использовании baserw=0, вы можете использовать лишь одну копию базы, которая монтируется через nullfs в read-only всем клеткам. Вы можете иметь одну базу (например минимального объема с именем lite) на несколько десятков клеток, размещенную на md-ramfs для ускорения работы базовых утилит в клетках. Помимо этого, с baserw=0 вы имеете возможность обновлять версию баз меньшими затратами. Кроме этого, смонтированная база в режиме read-only дает вам дополнительную безопасность, если вашу клетку взломали и попробуют модифицировать файлы системы — это у взломщиков просто не получится.
mount_src="0";
Смонтировать ли в /usr/src каталог клетки исходные коды FreeBSD в read-only, если они есть
mount_obj="";
Смонтировать ли в /usr/obj каталог клетки объектные файлы FreeBSD в read-only, если они есть
mount_kernel="0";
Смонтировать ли в /boot/kernel ядро FreeBSD. Это может быть полезно, к примеру, для работы CTF-информации, необходимую для работы DTRACE.
mount_ports="1";
Смонтировать ли в /usr/ports порты из мастер-ноды в readonly. Вы можете иметь одно дерево портов на всю ноду, которое развернуть в /usr/ports каталоге мастер-ноды и которое подмонтировано во все клетки. Для того, чтобы одновременная копмиляция одного и того же порта не конфликтовала в двух и более клетках, в /etc/make.conf параметр WRKDIRPREFIX ставится в альтернативное место, например /tmp (если клетка имеет applytpl=1, это происходит автоматически)
astart="1";
Следует ли запускать клетку автоматически при старте ноды. Если astart=0, клетка не запустится сама с перезагрузки мастер-хоста.
vnet="0";
applytpl="1";
Применить ли некоторые модификации в конфигурации клетки: выставить pkg.conf, внести записи в /etc/hosts и тд.
mdsize="0";
floatresolv="1";
Автоматически поправить /etc/resolv.conf , назначив автоматически в качестве первичного nameserver кеширующий named в мастер-ноде, остальные nameserver — из инвентаризации ноды.
exec_start="/bin/sh /etc/rc";
exec_stop="/bin/sh /etc/rc.shutdown";
Системные команды для запуска и останова клетки. Если вы хотите писать дополнительные скрипты, отрабатывающих при запуске и останове клеток, прочитайте: Конфигурации клетки
cpuset="0";
Привязать jail и его процессы к конкретным ядрам CPU. Значение 0 (по-умолчанию) означает, что привязок к ядрам нет и процессы будут занимать все доступные ядра. Значение отличное от нуля идентифицирует ядро или список ядер, на которых дозволено работать клетке. Запись должна соответствовать форме записи параметра -l cpu-list у команды cpuset(1), например:
cpuset="1";
означает, что процессы будут работать только на ядре 1.
cpuset="0-3"
означает, что процессы будут работать на ядрах 0,1,2,3
cpuset="0,3"
означает, что процессы будут работать на ядрах 0 и 3
Данный функционал полезен, например, для профилирования ПО, или если вы хотите ограничить клетку определенными ядрами (или давать каждой клетке по своему ядру).
setfib="0";
Привязать jail и его процессы к отдельной таблице маршрутизации. Значение 0 (по-умолчанию) означает, что привязок нет и будет использоваться стандартная таблица маршрутизации. Для того, чтобы использовать setfib, в файле /boot/loader.conf вам необходимо установить лимиты таблиц через параметр net.fibs. Например, если вы хотите использовать пять отдельных таблиц маршрутизации, в /boot/loader.conf вы должны иметь следующую запись:
net.fibs="5"
exec.consolelog="0";
Регулирует протоколирование вывода jail(8) при старте и останове клетки. По-умолчанию, используется значение 0.Возможные значения:
- 0 — выключить exec.consolelog. В этом случае, при jstart/jstop будет показываться весь вывод процедуры запуска и останова.
- 1 — Включить протоколирование в файл ${workdir}/var/log/${jname}.log, где $jname — соответствующее имя клетки. При этом, на терминале этих сообщений не будет.
/path/to/file — Произвольное имя файла. Например при значении /dev/null, клетка не будет выводить записи и куда-либо протоколировать процесс.