FreeBSD virtual environment management and repository

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