FreeBSD virtual environment management and repository

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, клетка не будет выводить записи и куда-либо протоколировать процесс.