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

Конфигурации клетки

Команда jconfig, jset

			% cbsd jconfig
			% cbsd jset
		

Описание:

Конфигурирование параметров jail

Каждая клетка CBSD хранит настройки в SQLite3 базе. Помимо этого, в каталоге $workdir/jails-fstab/ могут быть fstab файлы (см. ниже). Для изменения настроек клетки может служить команда cbsd jconfig, запускающая TUI меню для изменения основных параметров.

IP адреса клеток

IP адреса, которые привязываются к клетке, указываются в параметре ip4_addr. В качестве IP могут выступать как IPv4, так и IPv6 адреса. При запуске и останове клетки, работа с IP может проходить в двух режимах:

  • автоматическое создание на-лету IP адресов для клетки в момент запуска и автоматическое удаление IP с интерфейса при останове
  • использование ранее иницииализированных IP адресов.

Если клетке назначаются более одного адреса, они должны быть указаны через запятую без пробелов. IP могут содержать префикс сети, указанный через IP/prefix. По-умолчанию, alias создается с префиксом /32, что может не подходить, если jail использует подсеть отдельную от сети сервера — в этом случае, корректный /prefix необходим.

interface является параметром, который управляющий этим поведением. Если он установлен в значение 0, то при jstart и jstop не будут вызываться ifconfig alias и ifconfig -alias соответственно. Если его значение равно auto или имени физического интерфейса (например bce0), то перед запуском клетки будет вызвана команда

			% ifconfig interface ips alias
		

а при остановке —

			% ifconfig interface ips -alias
		

Будьте предельно аккуратны с этим параметром. Если в наличие есть только 1 IP сервера, который используется и основной системой и этот же IP назначается клетке, убедитесь, что interface выставлен в значение 0, иначе при остановки клетки, единственный ip адрес сервера будет удален автоматически и сервер станет недоступен. Например, чтобы запустить конфигуратор для клетки jail1, выполните:

			% cbsd jconfig jname=jail1
		

Монтирование файловых систем в jail

Каждый jail может иметь свой fstab файл, в котором перечисляются файловые системы, монтирующиеся в jail при запуске клетки. Системные записи (ими управляет CBSD и править этот файл ненадо) располагаются в файле $workdir/jails-fstab/fstab и совпадает по синтаксису с форматом системного файла /etc/fstab с тем исключением, что в качестве точки монтирования указывается путь относительно корня JAIL, а не мастер системы. Для пользовательских записей, вы можете использовать файл в том же каталоге с расширением .local. Например, если вы хотите сделать между клетками jail1 и jail2 один общий каталог (через nullfs), который физически расположен в мастер ноде (например /home/sharefs), в файлах $workdir/jails-fstab/jail1/fstab.local и $workdir/jails-fstab/jail2/fstab.local должна присутствовать строчка:

			/home/sharefs /home/sharefs nullfs rw 0 0
		

если вы хотите смонтировать в каталог /tmp клетки jail1 tmpfs (те, фактически в /usr/jails/jails/jail1/tmp), то запись в $workdir/jails-fstab/jail1/fstab.local должна выглядить так:

			tmpfs /tmp tmpfs rw 0 0
		

обе записи выполняют действие, аналогичное командам:

			mount -t nullfs -o rw /home/sharefs /jailroot/home/sharefs
			mount -t tmpfs -o rw tmpfs /jailroot/tmp
		

Если вы хотите смонтировать в jail2 каталог из jail1, путь к jail1 должен указывать на каталог содержащий данные jail1 (а их точки монтирования ${workdir}/jails/jail1). Например запись в $workdir/jails-fstab/jail2/fstab.local:

			/usr/jails/jails-data/jail1-data/usr/local/www /usr/local/www nullfs ro 0 0
		

Сделает каталог /usr/local/www между jail1 и jail2 общим, но в jail2 он будет в режиме read-only

Бывают случаи, когда монтирование через mount -t /type/ не работает или монтирование должно происходить нестандартным способом. В этом случае используйте зарезервированное слово 'external', где поле 'source' будет указывать на ваш внешний скрипт, результат работы которого должен быть смонтированный каталог.

Пример такой записи в fstab.local:

		/root/ntfs-3g.sh        /home/web/downloads external rw 0 0
		

и пример рабочего скрипта /root/ntfs-3g.sh для этой записи: ntfs-3g.sh, который монтирует внешний USB-диск напрямую в.

Презентация ZFS файловых систем в jail

Если вы хотите привязать отдельные ZFS файловые системы в jail ( тоесть, хотите иметь возможности внутри jail выполнить zfs mount ), список ZFS необходимо перечислить в $workdir/jails-fstab/$jnamefstab.local файле, указав в поле FStype ключевое слово zfs. Например, если вы хотите презентовать файловую систему ZFS: zroot/jail1_webfs для клетки jail1, запись в $workdir/jails-fstab/jail1/fstab.local должна выглядеть так:

			zroot/jail1_webfs /home/web zfs rw 0 0
		

Примечание: точка монтирования (/home/web в данном примере) роли не играет

Примечание2: клетка должна иметь параметр allow_zfs установленным в 1, что можно сделать через cbsd jconfig jname=$jname

Фактически, это заставляет CBSD выполнить команды:

			% zfs set jailed=on $FS
			% zfs jail $jname $FS
			

при старте клетки, и

			% zfs set jailed=off $FS
			% zfs unjail $jname $FS
		

при ее остановке.

Изменение параметров через jset

Другая возможность изменить определенные параметры клетки — воспользоваться командой cbsd jset Полный список возможных аргументов можно получить через --help:

			% cbsd jget --help
		

Например, поменять ip адрес для клетки jail1:

			% cbsd jset jname=jail1 ip4_addr="10.0.0.20/24,192.168.0.20/24" 
		

 

cbsd jconfig jname=jail2

cbsd jset

Пользовательские скрипты при запуске и останове клеток

Вы можете написать собственные сценарии, которые будут выполняться внутри клетки и в мастер-хосте при запуске и останове клетки. Для этого, в системном каталоге клетки ( $workdir/jails-system/$jname/ ) имеются следующие каталоги:

  • master_poststart.d - скрипты для отработки в мастер-хосте после того, как jail запустится (будьте аккуратны, поскольку скрипты выполняются не в окружении)
  • master_poststop.d - скрипты для отработки в мастер-хосте после того, как jail остановится (будьте аккуратны, поскольку скрипты выполняются не в окружении)
  • master_prestart.d - скрипты для отработки в мастер-хосте до того, как jail запустится (будьте аккуратны, поскольку скрипты выполняются не в окружении)
  • master_prestop.d - скрипты для отработки в мастер-хосте после того, как jail остановится (будьте аккуратны, поскольку скрипты выполняются не в окружении)
  • start.d - скрипты для отработки внутри клетки при ее запуске. Аналог параметра exec.start оригинального jail.conf
  • stop.d - скрипты для отработки внутри клетки при ее останове. Аналог параметра exec.stop оригинального jail.conf
  • remove.d - (с версии CBSD 11.0.10) скрипты отработают при удалении окружения

Писать скрипты для master_\* каталогов может быть полезно, если при старте-останове клеток вам необходимо выполнить какой-то действие не связанное с самим окружением в клетке - например, создать ZFS снапшот, поставить счетчики в IPFW и т.п.

Пример скрипта, который перед запуском клетки с именем asterisk проверяет не изменился ли один из IP-адресов, выдаваемый по DHCP от провайдера.

#!/bin/sh
iface="vlan200"

ufanetip_from_dhcp=$( ifconfig ${iface} | awk '/inet /{print $2}' )

current_asterisk_jail_ip=$( /usr/local/bin/cbsd jget mode=quiet jname=${jname} ip4_addr | cut -d, -f2 )

if [ "$ufanetip_from_dhcp" != "$current_asterisk_jail_ip" ]; then
	echo "Setting NEW Ufanet IP from DHCP!!!!"
	echo "Current ip4_addr setting in ${jname} jail is: 192.168.1.250,$ufanetip_from_dhcp"
	/usr/local/bin/cbsd jset jname=${jname} ip4_addr="192.168.1.250,$ufanetip_from_dhcp"
fi
		

В скриптах вы можете использовать переменные CBSD, такие как $jname, $path, $data, $ip4_addr, например, поместив такой скрипт (с правами на выполнение) в /usr/jails/jails-system/jail1/master_poststart.d/notify.sh:

		#!/bin/sh
		echo "Jail $jname started with $ip4_addr IP and placed on $path path" | mail -s "$jname started" root@example.net
		

Вы будете получать уведомление по факту запуска клетки на email: root@example.net

Функционал запуска пользовательских скриптов и доступность переменных в окружениях может играть большую роль при интеграции CBSD и внешних приложений, таких как Consul

В качестве примера использования, посмотрите статьи:

Очередность запуска клеток

В CBSD имеется возможность указать, в какой последовательности будут запускаться клетки. Например, вы можете пожелать, чтобы клетка mysqljail и redisjail стартовали раньше чем wwwjail. Данный функционал реализует cbsd jorder и регулируется в настройке каждой клетки.

//продолжение следует