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

Внимание! Данные страницы описывают CBSD версии 13.0.x. Если вы используете более раннюю версию, рекомендуется сначала обновиться.

Создание jail через dialog меню

Команда jcreate, jconstruct-tui

		% cbsd jconstruct-tui
		
		% cbsd jcreate jconf=/path/to/conf.jconf
		
Описание:

Клетка создается по заранее сформированному конфигурационному файлу через cbsd jcreate jconf=path_to_cfg. Для формирования конфигурации, можно воспользоваться cbsd jconstruct (в режиме диалога вопрос-ответ), либо через dialog(1) интерфейс cbsd jconstruct-tui, либо через WEB интерфейс. При корректно настроеном pkg.conf и рабочем репозитории, есть возможность предустановить в клетку готовые пекеджи, маркировав их через pkglist меню. В целях безопасности, рекомендуется использовать официальный pkg репозиторий FreeBSD или создавать свои собственные версии сборок ПО.

Примечание: если репозиторий недоступен, пункт pkglist при cbsd jconstruct-tui диалога выбора пекеджей не выведет.

Примечание: мульти-репозитории и возможность их выбора при создании клетки пока не реализовано, используется репозиторий из основного pkg.conf.

Внимание! Поскольку список и выбор пекеджей формируется по pkg.conf мастер машины, имейте ввиду, что наполнение выбранных пекеджей по списку сработает лишь в том случае, если архитектура и версия клетки совпадает с нодой.

Используйте возможности профилей:

Если вы не пользуйтесь автоматизацией (Puppet, Ansible, собственная генерация jconf) по созданию окружений и вам приходится создавать контейнера с отличающимися параметрами, используйте возможность создать собственный профиль для переопределения значений по-умолчанию. Вы можете переопределить любой параметр - предлагаемый темплейт имени, версию, привязку к конкретному интерфейсу вместо 'auto' и т.д.

Для создания через DIALOG:

		% cbsd jconstruct-tui
		

Это же меню для создания jail доступно при конфигурировании CBSD через bsdconfig

Пускай вас не пугает небольшое ;-) количество настроек в jconstruct-tui - здесь выведены только самые важные, подходящие для большинства людей. Если вам нужно более гибкая настройка - используйте cbsd jconfig после создания окружения

Если jconstruct-tui отработала корректно, по окончанию будет задан вопрос о создании клетки. В случае положительно ответа, jcreate будет выполнен на новую конфигурацию автоматически. В противном случае, скрипт выведет путь к конфигурационному файлу (в $workdir/tmp), по которой можно создать клетку.

Внимание!

При создании новой клетки или получения ее из репозитория, возьмите за правило ВСЕГДА перебивать пароль пользователя root в клетке, даже если не планируете запускать в ней ssh/ftp/rsh и тому подобные сервисы.

Если клетка создается с applytpl=0, то по-умолчанию файлы /etc/{passwd,master.passwd,group} в клетке соответствуют оригинальным "чистым" файлам FreeBSD, те, пароль root пуст. При applytpl=1 а также при построении клеток для репозитория используется темплейт из $workdir/share/jail-skel, в котором хеш рута соответствует паролю CBSD в инсталляции CBSD по-умолчанию. Вы можете изменить стандартный пароль рута для создаваемых новых клеток, изменив хэш в skel-файле master.passwd через команду:

	% vipw -d ${workdir}/share/jail-skel/etc
	

либо, указывать альтернативный путь в jail-skel каталогу в .jconf (утилита jcreate) конфиге.

Вы можете переопределить параметр jailskeldir="$workdir/share/jail-skel", прописанный в $workdir/etc/defaults/jail-freebsd-default.conf для указания альтернативного каталога темплейтов, файлы в котором перезапишут оригинальные файлы базы при создании клетки. Для этого, создайте файл jail-freebsd-XXXXX.conf в каталоге $workdir/etc и впишите свое значение.

Подробнее смотрите: Профили для создания jail

Пример (заполнение jname, fqdn, ips полей + GO):

		% cbsd jconstruct-tui
		

Если репозиторий сконфигурирован корректно, можно выбрать пекеджи на установку. Используйте первый символ названия порта для более быстрого поиска и пробел для маркировки:

Обязательное поле для заполнения: короткое (одним словом) имя клетки. Это имя будет использоваться для идентификации jail:

Обязательное поле для заполнения: полное (с доменом) имя клетки. Это имя будет использовано как hostname клетки:

Обязательное поле для заполнения: IP адрес клетки. Может иметь сетевой префикс через запись вида IP/prefix.

Для установки более одного IP адреса, воспользуйтесь редактированием файла rc.conf клетки, описанным в конфигурации клетки

При вызове пункта GO, система предложит создать клетку немедленно, автоматически запустив cbsd jcreate jconf=... В противном случае, будет выведен путь к сохраненной конфигурации для запуска команды cbsd jcreate вручную:

Другие методы создание jail

Команда jcreate, часть 2

		% cbsd jconstruct
		
		% cbsd jcreate jconf=/path/to/conf.jconf
		
Описание:

Если DIALOG-based скрипт jconstruct-tui по каким-то причинам не подошел, для конфигурации новой клетки можно воспользоваться скриптом-диалогом вида "вопрос-ответ" jconstruct:

		   % cbsd jconstruct
		

Который задает те же вопросы, что и tui-версия.

Также, можно обойтись формированием конфигураций без вспомогательных интерактивных утилит, например для создания систем, автоматически создающих необходимые клетки.

Пример стандартной конфигурации для jcreate может выглядеть так:

		jname="jail1";
		path="/usr/jails/jails/jail1";
		host_hostname="jail1.my.domain";
		ip4_addr="10.0.0.24/24";
		mount_devfs="1";
		allow_mount="1";
		allow_devfs="0";
		allow_nullfs="0";
		mount_fstab="/usr/jails/jails-fstab/fstab.jail1";
		arch="amd64";
		mkhostsfile="1";
		devfs_ruleset="4";
		ver="10.0";
		basename="";
		slavenode="0";
		baserw="0";
		basename="";
		mount_src="0";
		mount_obj="";
		mount_kernel="0";
		mount_ports="1";
		astart="1";
		data="/usr/jails/jails-data/jail1-data";
		vnet="0";
		applytpl="1";
		mdsize="0";
		rcconf="/usr/jails/jails-rcconf/rc.conf_jail1";
		floatresolv="1";
		exec_start="/bin/sh /etc/rc";
		exec_stop="/bin/sh /etc/rc.shutdown";

		exec_poststart="0";
		exec_poststop="0";
		exec_prestart="0";
		exec_prestop="0";

		exec_master_poststart="0";
		exec_master_poststop="0";
		exec_master_prestart="0";
		exec_master_prestop="0";
		interface="auto";
		jailskeldir="${sharedir}/jail-skel"
		

Обратите внимание на параметры arch и ver. Значения в них могут быть "i386", "amd64" для архитектуры и "9.2", "10.0", "10.1" "11" и тд , в зависимости от той версии базы, которую вы предпочтете для клеток. Значение native в этих параметрах заставляет CBSD брать всегда ту версию и архитектуру, на которой запущена нода, что делает версию плавающей. Так, если вы используйте темплейт с arch="native", ver="native" и перейдете с FreeBSD 10.2 на 11.0, то будет использоваться база 11.0. Если вы хотите зафиксировать конкретную версию - указывайте версию вместо native.

Если вы хотите, чтобы при создании клетки также устанавливался какие-то пакеты из pkg репозитория, в этой конфигурации должен присутствовать параметр pkglist указывающий на файл со списком пакетов, например:

		pkglist="/tmp/newjail.txt";
		

Файл /tmp/newjail.txt может выглядеть так:

		mc
		lynx
		nginx-devel
		lsof
		

 

cbsd jcreate удаляет файл, указанный в pkglist после создания клетки

Внимание!

При создании новой клетки или получения ее из репозитория, возьмите за правило ВСЕГДА перебивать пароль пользователя root в клетке, даже если не планируете запускать в ней ssh/ftp/rsh и тому подобные сервисы.

Если клетка создается с applytpl=0, то по-умолчанию файлы /etc/{passwd,master.passwd,group} в клетке соответствуют оригинальным "чистым" файлам FreeBSD, те, пароль root пуст. При applytpl=1 а также при построении клеток для репозитория используется темплейт из $workdir/share/jail-skel, в котором хеш рута соответствует паролю CBSD в инсталляции CBSD по-умолчанию. Вы можете изменить стандартный пароль рута для создаваемых новых клеток, изменив хэш в skel-файле master.passwd через команду:

	% vipw -d ${workdir}/share/jail-skel/etc
	

либо, указывать альтернативный путь в jail-skel каталогу в .jconf (утилита jcreate) конфиге.

По-умолчанию, каталог указанный в jailskeldir будет использован как источник файлов, которые будут добавлены (или ими будут перезаписаны стандартные файлы) в клетку автоматически, при applytpl=1.

Соответственно, вы можете создавать любые шаблоны конфигураций и содержимое окружений, которые будут копироваться при создании новой клетки.

Профили для создания jail

Команды jcreate

			% cbsd jcreate
		

Профиль настроек jail

Описание

Если вы не работаете с гиганским количеством нод и окружений, когда могут быть полезны такие инструменты как Puppet, Ansible, SaltStack, Chef или собственный вариант по генерации .jconf файла для jcreate, но вам часто приходится создавать окружения и при этом вам не подходят ряд параметров предложенных по-умолчанию, мы рекомендуем вам пользоваться профилями чтобы переопределить значения по-умолчанию, либо создать свой отдельный профиль

Посмотрите на содержимое файла $workdir/etc/defaults/jail-freebsd-default.conf. Он представляет из себя те настройки, которые применяются в jconstruct-tui по-умолчанию

Допустим, вы хотите создавать контейнера всегда в режиме baserw=1 (вместо baserw=0 по-умолчанию), на интерфейсе lo0 (вместо auto, который выбирает интерфейс в зависимости от подсети jail) и предпочитать имя cell вместо jail и в домене example.com и при этом, чтобы контейнер запускался моментально после создания ( runasap="1" ) (не путайте с astart="1", которая запускает клетку с запуском сервера)

Для этого, создадим в каталоге (или скопируем из $workdir/etc/defaults) $workdir/etc/ файл под тем же именем, в котором мы можем переназначить настройки:

		% echo 'baserw="1"' > ~cbsd/etc/jail-freebsd-default.conf
		% echo 'interface="lo0"' >> ~cbsd/etc/jail-freebsd-default.conf
		% echo 'default_jailname="cell"' >> ~cbsd/etc/jail-freebsd-default.conf
		% echo 'default_domain="example.com"' >> ~cbsd/etc/jail-freebsd-default.conf
		% echo 'runasap="1"' >> ~cbsd/etc/jail-freebsd-default.conf
		

Получим файл $workdir/etc/jail-freebsd-default.conf с содержим:

		baserw="1"
		interface="lo0"
		default_jailname="cell"
		default_domain="example.com"
		runasap="1"
		

Это все! Теперь мы можем запускать cbsd jconstruct-tui, где вам нужно делать еще меньше настроек для создания окружения!


Возможно, вы захотите создать несколько собственных профилей. Для этого, также создавайте файлы в каталоге ~cbsd/etc/ используя префикс в имени файла jail-freebsd-YOUR_PROFILE.conf

При этом в качестве _обязательного_ параметра внутри каждого профиля, должно быть имя этого профиля в переменной jail_profile="default" и jail_active установленный в 1 (активный профиль). Например, создадим два профиля: baserw и lo0:


  • 		% echo 'jail_profile="baserw"' > ~cbsd/etc/jail-freebsd-baserw.conf
    		% echo 'jail_active="1"' >> ~cbsd/etc/jail-freebsd-baserw.conf
    		% echo 'baserw="1"' >> ~cbsd/etc/jail-freebsd-default.conf
    		

  • 		% echo 'jail_profile="lo"' > ~cbsd/etc/jail-freebsd-lo0.conf
    		% echo 'jail_active="1"' >> ~cbsd/etc/jail-freebsd-lo0.conf
    		% echo 'interface="lo0"' >> ~cbsd/etc/jail-freebsd-lo0.conf
    		

    Теперь вы увидите профили в выборе возможных вариантов меню 'profile' при запуске cbsd jconstruct-tui

    Возможно вы захотите, чтобы профиль lo0 был по-умолчанию, поскольку вы использоуете его чаще всего. Вы можете переопределить в $workdir/etc/jail-freebsd-default.conf профиль по-умолчанию через параметр default_profile:

    		% echo 'default_profile="lo"' > ~cbsd/etc/jail-freebsd-default.conf
    		

    При этом содержимое файла будет ~cbsd/etc/jail-freebsd-default.conf:

    		default_profile="lo"
    		

    В этом случае, запуская cbsd jconstruct-tui, вам ненужно выбирать даже профиль. Остается совсем немного действий чтобы запустить новое окружение

    Профиль содержимого jail

    Описание

    Допустим, вам необходимо штамповать однотипные клетки, в которых должен быть установлен и настроен некоторый список ПО, например, клетка с WEB сервером nginx, отдающим index.html. Вы можете создать клетку (например jail1), провести все необходимые настройки и сделать экспорт клетки. После чего, когда вам будет необходим новый инстанс, выполняете команду:

       % cbsd jimport jname=jail1 newjname=jail2
    		

    Создавая на основе имиджа jail1 копию в новую клетку под именем jail2. Также, для этих целей можно использовать команду jclone. Тем не менее, это не всегда бывает удобно (особенно с точки зрения поддержания ПО в актуальном состоянии в оригинальной клетке), поэтому воспользуемся возможностью накладывать профили и применять альтернативные skel-каталоги для применения нужных нам изменений на-лету при создании клетки.

    Пример:

    1) Создание jconf:

    Если вы хотите создавать неинтерактивные сценарии (без вашего участия), создадим шаблон, по которому будут создавать новые клетки CBSD скрипты. Для этого запустим cbsd jconstruct-tui и на вопрос "Do you want to create jail immediately?" ответим отрицательно. В этом случае будет выведена команда для jcreate и путь к jconf - это и есть конфигурация, по которой создается клетка. Либо ее можно написать вручную, например:

    % mkdir /root/share
    % cat > /root/share/nginx.jconf << EOF
    # DO NOT EDIT THIS FILE. PLEASE USE INSTEAD:
    # cbsd jconfig jname=jail1
    relative_path="1";
    jname="jail1";
    path="/usr/jails/jails/jail1";
    host_hostname="jail1.my.domain";
    ip4_addr="DHCP";
    mount_devfs="1";
    allow_mount="1";
    allow_devfs="1";
    allow_nullfs="1";
    mount_fstab="/usr/jails/jails-fstab/fstab.jail1";
    arch="native";
    mkhostsfile="1";
    devfs_ruleset="4";
    ver="native";
    basename="";
    baserw="0";
    mount_src="0";
    mount_obj="0";
    mount_kernel="0";
    mount_ports="1";
    astart="1";
    data="/usr/jails/jails-data/jail1-data";
    vnet="0";
    applytpl="1";
    mdsize="0";
    rcconf="/usr/jails/jails-rcconf/rc.conf_jail1";
    floatresolv="1";
    zfs_snapsrc="";
    
    exec_poststart="0";
    exec_poststop="";
    exec_prestart="0";
    exec_prestop="0";
    
    exec_master_poststart="0";
    exec_master_poststop="0";
    exec_master_prestart="0";
    exec_master_prestop="0";
    pkg_bootstrap="1";
    pkglist="/root/share/pkglist.txt";
    
    with_img_helpers="";
    runasap="0";
    interface="auto";
    jailskeldir="/root/share/nginx-jail"
    jail_profile="default";
    # root password
    user_pw_root='rootpw'
    exec_start="/bin/sh /etc/rc"
    exec_stop="/bin/sh /etc/rc.shutdown"
    emulator="jail"
    EOF
    		

    Где наиболее важно для нас:

    • jail1 - имя клетки
    • user_pw_root - параметр, устанавливающий соответствующий пароль пользователю root (вы можете также просто править master.passwd файл в skel каталоге для этого)
    • ip4_addr="DHCP" - заставляет CBSD брать первый свободный IP из диапазона nodepool
    • jailskeldir="/root/share/nginx-jail" - альтернативый путь к skel-каталогу, применяемому после создания клетки
    • pkglist="/root/share/pkglist.txt" - путь к файлу, определяющему набор ПО в клетку при ее создании
    • arch="native" - использовать/наследовать архитектуру хостер системы. Либо указываем: i386, amd64
    • ver="native" -использовать/наследовать версию хостер системы. Либо указываем: 10.3, 11.1, 12

    2) Создание pkglist.txt

    Просто перечислям origin или packagename того ПО, что хотим получить в клетке:

    % cat > /root/share/pkglist.txt << EOF
    www/nginx
    shells/bash
    EOF
    		

    3) skel-каталог

    Кастомизируем каталог дополнительных файлов, которые будут скопированы в jail. А именно - пропишем nginx в rc.conf внутри клетки и положим в /usr/local/www/nginx/index.html какой-нибудь текст на отдачу:

    % cp -a /usr/local/cbsd/share/jail-skel /root/share/nginx-jail
    % mkdir -p /root/share/nginx-jail/usr/local/www/nginx
    % cat > /root/share/nginx-jail/usr/local/www/nginx/index.html << EOF
    <html>
       <body>
          <pre>
          It's been a hard day's night
          And I've been working like a dog
          It's been a hard day's night
          I should be sleeping like a log
          </pre>
       </body>
    </html>
    EOF
    % sysrc -f /root/share/nginx-jail/etc/rc.conf nginx_enable="YES"
    		

    4) Создание, запуск

    Создаем клетку, запускаем и проверяем:

    % cbsd jcreate jconf=/root/share/nginx.jconf
    % cbsd jstart jail1
    % curl http://X.Y.N.M
          It's been a hard day's night
          And I've been working like a dog
          It's been a hard day's night
          I should be sleeping like a log
    		

    Профиль для jconstruct-tui

    Если вы хотите подобные клетки создавать вручную, выбирая когда это надо необходимые skel-каталоги или настройки по-умолчанию, создайте в каталоге $workdir/etc файл с именем jail-freebsd-XXXX.conf с минимальным содержимым:

    jail_profile="XXX"
    		

    где XXX - имя вашего профиля. Профиль vnet в CBSD создан как пример, вы посмотреть его в $workdir/etc/defaults/jail-freebsd-vnet.conf

    В свою очередь, он переписывает значения по-умолчанию из профиля defaults: jail-freebsd-default.conf

    Если же вы редко используете профиль по-умолчанию и хотите, чтобы CBSD по-умолчанию предлагала ваш профиль, измените значение default_profile выставив его в имя вашего профиля:

    echo 'default_profile="XXX"' > ~cbsd/etc/jail-freebsd-default.conf
    		
  • Обратите внимание, что файлы в $workdir/etc/defaults не редактируются - также, как в /etc/defaults. Если вы хотите переназначить значения по-умолчанию, копируйте из каталога $workdir/etc/defaults файл под тем же именем в каталог $workdir/etc и меняйте

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

    Команда 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 и регулируется в настройке каждой клетки.

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

    Запуск и останов клетки

    Команда jstart, jrestart, jorder

    			% cbsd jstart jname=jail1
    			% cbsd jstart jail1 jail2 ... jailX
    
    			% cbsd jstop jname=jail1
    			% cbsd jstop jail1 jail2 ... jailX
    
    			% cbsd jrestart jail1
    			% cbsd jorder
    		
    Описание:

    Запуск клеток происходит при запуске cbsd/сервера автоматически, если параметр astart (auto-start) соответствующего jail установлен в 1. Изменить этот параметр можно через cbsd jconfig или cbsd jset. При остановке сервера или сервиса cbsdd, автоматически останаваливаются все запущенные клетки. Запуск jail вручную производится командой:

    			% cbsd jstart jname=jail1
    		

    либо

    			% cbsd jstart jail1
    		

    либо

    			% cbsd jstart jail1 jail2 jail3 ..
    		

    (для запуска нескольких клеток одной командой)

    Если настройках CBSD ( изменить это поведение можно в cbsd initenv-tui ) параметр parallel=0, то в случае запуска нескольких клеток, запуск/останов будет проходить последовательно. Это не всегда удобно и даже может быть опасно, поскольку любая ошибка внутри запускаемой клетки в rc-скриптах, которая приводит к паузе, способна блокировать запуск/останов следующих клеток. В том случае, если parallel имеет ненулевое значение, каждая следующая клетка будет запускаться через N секунд после запуска предыдущей, где N — значение параметра parallel. По истечению этого таймаута, не зависимо от того, успела ли предыдущая клетка запустится полностью, будет стартовать следуюзая клетка.

    Для останова клеток используется команда jstop, с аналогичным синтаксисом и поведением:

    			% cbsd jstop jname=jail1
    		

    либо

    			% cbsd jstop jail1
    		

    либо

    			% cbsd jstop jail1 jail2 jail3 ..
    		

    (для останова нескольких клеток одной командой)

    Если аргумент у команды jstart/jstop/jrestart отсутствует, будет выведет соответствующий список всех остановленных или запущенных клеток для интерактивного выбора

    Когда jail запускается, он создает лок файл, признак того, что jail рабочий в виде файла ${jailsysdir}/${jname}/locked в котором записывается имя ноды. Этот признак используется в случае, когда данный jail презентован нескольким нодам, данные клетки находятся на DFS ( NFS, glusterfs и тд) и любая нода в состоянии его запустить. Данный лок гарантирует, что при наличие той же клетки на второй ноде, он запущен не будет.

    При большом количестве клеток (особенно баз данных, с такими сервисами как MySQL, redis, cassandra и тд), следует иметь ввиду, что низкое значение parallel (например, меньше 5 секунд) может породить очень большую дисковую I/O нагрузку, что в сумме может увеличить время запуска всех клеток, чем если бы они запускались последовательно или с более высоким таймаутом. Дополнительно, когда через shutdown команду гасится сервер с большим количеством клеток/сервисов, следует принять во внимание низкий таймаут что по-умолчанию на выполнение rc.shutdown последовательности. В связи с этим, процесс init может прервать выполнение rc-скриптов по этому таймауту, что приведет к некорректному останову клеток. В случае баз данных это может приводить к несохранению или повреждению данных. Чтобы этого избежать, /etc/rc.conf мастер-системы следует регулировать параметр rcshutdown_timeout до более приемлемого значения (по-умолчанию: 90 секунд) При отсутствии rcshutdown_timeout в системном /etc/rc.conf, cbsd initenv выставит этот параметр на свое усмотрение автоматически.

    Также, следует иметь ввиду, что при использовании zfs features ( регулируется через cbsd inienv-tui только на файловой системе ZFS ) неактивная клетка может быть размонтирована. Те, каталог $workdir/jails-data/jail1-data будет пуст. Если в таком случае требуются данные клетки без ее запуска, по команде zfs list можно посмотреть имя соостветствующей файловой системы и выполнить zfs mount fs.

    Написание скриптов, отрабатывающих при запуске и останове клеток

    Подробнее читайте в Конфигурации клетки

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

    В CBSD вы можете определить очередность запуска клеток. Подробнее читайте в Очередность запуска jail

    Очередность запуска окружений

    Команды: jorder, jorder-tui, border, border-tui

    % cbsd jls display=jname,b_order
    		

    Описание:

    Может возникнуть ситуации, когда запуск одного из jail/vm желателен до запуска остальных. Например таковыми могут быть клетки с критичными сервисами как базы данных SQL или LDAP сервера.

    В этом случае, вы можете отредактировать Boot Order (b_order в настройках окружений)

    По-умолчанию, все окружения создаются с индексом b_order равным 10 (задается в профиле, что вы можете изменить)

    Если вам необходимо, чтобы jail2 стартовал раньше jail1, его индекс b_order должен быть ниже чем у второй клетки.

    Вы можете сделать выборку по текущей настройке через команду jls:

    % cbsd jls display=jname,b_order
    JNAME    B_ORDER
    firefly  3
    jail1    10
    kde4     1
    kdeold   9
    spicy2   2
    test     2
    	

    Данный вывод изначает, что клетка с именем kde4 запустится самой первой. Самой последней будет запущена клетка jail1

    Также, вы можете просмотреть очередность запуска клеток через команду jorder

    % cbsd jorder
    	

    В какой последовательности вывелись клетки, в такой они и будут запускаться

    Для редактирования очередности используейте комаду jset или TUI-редактор jorder-tui

    Для редактирования bhyve очередности, используйте команды: border, border-tui

    Удаление клетки

    Команда jremove

    			% cbsd jremove jail1 jail2 ..
    		

    Описание:

    Удаление jail затрагивает все файлы, так или иначе связанные с клеткой:

    • a) fstab для данного jail
    • b) каталог или ZFS файловую систему с данными jail
    • c) статистику и описание клетки
    • d) снапшоты, если были

    В случае, если jremove запускается на работающую клетку, клетка будет остановлена автоматически.

     

    Пример:

    			% cbsd jremove jail1
    		

    Переименовывание клетки

    Команда jrename

    			% cbsd jrename
    		

    Описание:

    Выполняет переименовывание jail и соответствующих каталогов данных в новое имя. Может выполнятся только на погашенной клетке. В качестве обязательных параметров:

    • old — старое имя jail
    • new — новое имя jail

    В качестве необязательных параметров:

    • host_hostname — FQDN, новое полное имя клетки
    • ip4_addr — новый IP адрес клетки (если несколько IP, указываются через запятую без пробелов)

     

    Пример (переименовывание клетки jail1 в jail50 со сменой имени хоста клетки и ip адреса:

    			% cbsd jrename old=jail1 new=jail50 host_hostname=jail50.my.domain ip4_addr=192.168.0.5/24
    		

    Обновление клеток

    Команда jupgrade

    			% cbsd jupgrade
    			% cbsd jconfig
    		
    Описание:

    Процедура обновления jail всегда сопряжена с определенными рисками в виде нарушения работы сервиса, поэтому, возьмите за правило всегда создавать резервные копии состояния клеток. Если вы работаете на ZFS файловой системе, вы можете воспользоваться командой cbsd jsnapshot для заморозки состояния клетки до начала работ. Например:

    			% cbsd jsnapshot mode=create jname=jail1 snapname=before_update
    		

    и по окончанию работ, если все в порядке, удалить снимок через:

    			% cbsd jsnapshot mode=destroy jname=jail1 snapname=before_update
    		

    Если файловая система UFS, вы можете создать образ клетки через:

    			% cbsd jexport jname=jail1
    		

    И в случае успешной операции по обновлению, удалить образ jail1.img в каталоге $workdir/export. Под обновлением клетки CBSD будем предполагать только обновление базовых файлов FreeBSD. Процедура обновления 3rd-party ПО для клеток аналогична обновлению ПО в обычной системе. Обновить базу вы можете как между разными версиями системы ( например с версии FreeBSD 9.2 до 9.3, или FreeBSD 9.3 -> FreeBSD 10.1 ), так и обновить файлы в рамках одной и той же версии. Следует помнить, что клетки имеют 2 режима — baserw=1, когда базовая часть у каждой клетки — своя собственная копия расположенная в каталоге $workdir/jails-data/$jail, и baserw=0, когда одна и та же база в каталоге ${workdir}/basejail/base_\*_\*_ver монтируется всем клеткам.

    Обновление через базовую утилиту freebsd-update

    freebsd-update можно использовать без к привязки к CBSD. Следует учитывать, что утилита работает с официальным ресурсом FreeBSD и сконфигурировать ее на репозиторий CBSD нельзя, те, источник только один.

    Обновить базовые файлы для клеток через freebsd-update можно, указав через ключ -b путь к каталогу, используемому CBSD при монтировании клеток с baserw=0. Так, если ваш CBSD $workdir - /usr/jails, то для amd64 и версии 10.0 путь до базы будет /usr/jails/basejail/base_amd64_amd64_10.0. Этот каталог и следует обновить:

    % freebsd-update -b /usr/jails/basejail/base_amd64_amd64_10.0 fetch
    % freebsd-update -b /usr/jails/basejail/base_amd64_amd64_10.0 install
    		

    Если у вас нет baserw=1 клеток, то на этом - всё. Если baserw=1 клетки есть, то для их обновления возможны два варианта:

    • Как и в случае выше, для каждого jail вызвать freebsd-update и указать путь к data каталогу клетки ( $workdir/jails-data/$jname )
    • Или, выполнив обновление basejail как написано выше, вызвать:
      cbsd jupgrade jname=XXXX
      			
      для каждой клетки baserw=1 - эта команда переформирует базу ( $workdir/jails-data/$jname ) клетки из файлов в $workdir/basejail/*

    Обновление baserw=0 клеток между различными версиями баз средствами CBSD

    Вариант с переходом клетки в режиме baserw=0 на новую версию базы является самым простым и заключается в изменении версии в конфигураторе

    			% cbsd jconfig jname=XXX
    		

    Поскольку в этом случае лишь меняется каталог-источник, который линкуется при старте клетки. Пример обновления клетки с версии 9.2 на 10.0.

    Исходные данные: есть x86-64 система с базой от FreeBSD 9.2 и клеткой jail1 на этой базе, которую необходимо перевести на 10.0.

    При остановленной клетке заходим в конфигуратор по

    			% cbsd jconfig jname=jail1
    		

    и меняем параметр ver на 10.0, после чего выбираем "Commit". Либо, как на снимке — делаем изменение через cbsd jset

    При следующем запуске, клетка будет монтировать уже базу 10.0 (на снимке этой базы в системе не оказалось и CBSD предложила ее скачать). Разумеется, при подобном переходе на новую мажорную версию, после этой операции пересобрать ПО в клетке или обновить через pkg — крайне желательная операция, поскольку библиотеки системы изменились. Как минимум, для выявления этого факта можно воспользоваться утилитой libchk.

    Обновление baserw=1 клеток между различными версиями баз средствами CBSD

    Обновление baserw=1 клеток проходит несколько по иному сценарию, поскольку при этой операции CBSD будет перезаписывать системные файлы старой базы на новые в каталоге клетки по $workdir/jails-data/$jname. Исходные данные — клетка jail1 в режиме baserw (тесть, ее корневой путь PATH по jls указывает в jails-data, а не jail каталог) на версии 9.2. Необходимо обновить на версию 10.0.

    Убедимся через утилиту file, которая читает ELF таблицу, что файл /bin/sh клетки принадлежит версии 9x. И тем же образом, проверим версию файла после обновления:

    			% file -s /usr/jails/jails-data/jail1-data/bin/sh
    			/usr/jails/jails-data/jail1-data/bin/sh: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), dynamically linked (uses shared libs), for FreeBSD 9.2, stripped
    		

    При остановленной клетке выполняем смену версии через cbsd jconfig или cbsd jset, после чего выполняем процедуру обновления:

    			% cbsd jupgrade jname=jail1
    		

    Данная операция заставляет перезаписать все системные базовые файлы в клетке на файлы из вашего оригинального каталога $workdir/basejails/base_\*_\*_ver

    Обновление baserw=0,1 клеток в рамках одной версии, переход на stable=1

    Иногда бывают случаи, когда необходимо обновить файлы в рамках одной версии, например базу 10.0 на базу 10.0-p1. Для клеток, монтирующих базу через nullfs, достаточно просто перезакачать в каталог $workdir/basejail/base_\*_\*_ver более свежую версию. Для этого вы можете использовать команду:

    			% cbsd repo action=get sources=base mode=upgrade
    		

    — аргумент mode=upgrade разрешает CBSD перезаписать данный каталог новыми файлами, если у вас уже имеется версия базы под этой версией.

    Либо, вы можете собрать более свежую версию баз, воспользовавшись Сборка и обновление базы. Также, вы можете перейти с версии базы с RELEASE на STABLE (в этом случае, имя каталога базы будет не X.Y, а X. Тоесть, вместо base_\*_\*_9.2 будет использоваться base_\*_\*_9. Для этого вам необходимо в конфигураторе клетки ( cbsd jconfig ) изменить параметр stable=0 на stable=1 ( либо через cbsd initenv-tui выставить режим работы со STABLE ветками глобально ), и при команде cbsd repo не забыть stable=1 (если не выставлен глобально )

    			% cbsd repo action=get sources=base mode=upgrade stable=1
    		

    Аналогичные правила характеры также для клеток с baserw=1, необходимо лишь не забывать после обновления баз в CBSD запустить процедуру обновления файлов в конкретном jail через cbsd jupgrade. Кроме этого, при условии что у вас в системе есть база соответствующей версии (или вы мигрировали клетку на другой сервер где есть база новее), при запуске клетки baserw, CBSD способна автоматически проверить наличие более свежих файлов для этой версии и выдать соответствующее информационное сообщение "You have a more recent version of the base in …":

    Обновление конфигурационных файлов клеток, etcupdate/mergemaster

    Обновление бинарных файлов - это лишь пол беды) Вы также должны синхронизировать конфигурационые файлы. Смотрите здесь, чем CBSD может быть вам полезна в этом: etcupdate helper

    Работа с NAT

    Команды natcfg, naton, natoff

    			% cbsd natcfg
    			% cbsd naton
    			% cbsd natoff
    		

    Описание:

    Не всегда клеткам требуются внешние IP, либо, по причинам безопасности, ряд сервисов разворачивают на приватных IP, чтобы они были недоступны со стороны Internet. При этом, самим клетками доступ в Internet может быть необходим. В этом случае используется NAT, транслирующий приватные IP адреса клетки на внешний IP сервера. Функционал CBSD имеет шаблон конфигурации NAT правил для трансляции приватных сетей RFC1918. Для этого, первым делом необходимо через команду:

    			% cbsd natcfg
    		

    выбрать соответствующий фунционал, для которого будут сгенерирована конфигурация NAT: pf, ipfw или ipfilter, по именам соответствующих фреймворков

    Внимание: При конфигурировании, системных /boot/loader.conf ноды будет изменен для загрузки соответствующих модулей.

    Выбор фреймворка и IP в качестве NAT alias выполняется при первом запуске cbsd initenv, в последствии может быть переконфигурирован через cbsd initenv-tui. Для того, чтобы измененный natip вступил в силу, необходимо запустить cbsd natcfg и cbsd naton еще раз. В данный момент, средства CBSD по конфигурации nat ограничиваются только созданием правил для трансляции приватных сетей и если вам необходимо получить от NAT чего-то большее, вы можете отредактировать созданный файл правил вручную в каталоге $workdir/etc/ в файлах:

    • pfnat.conf, если используется PF
    • ipfw.conf, если используется IPFW
    • ipfilter.conf, если используется IPNAT из пакета IPFilter

    Примечание:

    Если nodeip (IP ноды) сам находится в пределах RFC1918 сетей, для этой подсети правило трансляции NAT создано не будет. Для отключения управлением nat средствами CBSD, воспользуйтесь запуском команды:

    			% cbsd natoff
    		

    Внимание: Будьте аккуратны, если активируете NAT через ipfw. Это правило подгружает модуль ipfw.ko, в настройках которого по-умолчанию запрещены все пакеты. Если вы проводите эту операцию удаленно, вы можете через /boot/loader.conf включить ipfw с правилом, по-умолчанию разрешающих все пакеты:

    ipfw_load="YES"
    net.inet.ip.fw.default_to_accept=1
    		

    Пример. Запускаем конфигуратор и активируем NAT через pf, в качестве aliasing-IP используется 192.168.1.2, ранее инициализированный в /etc/rc.conf:

    % cbsd natcfg
    Configure NAT for RFC1918 Network?
    [yes(1) or no(0)]
    yes
    Set IP address as the aliasing NAT address, e.g: 192.168.1.2
    
    Which NAT framework do you want to use: [pf]
    (type FW name, eg pf,ipfw,ipfilter or "exit" for break)
    
    % cbsd naton
    No ALTQ support in kernel
    ALTQ related functions disabled
    No ALTQ support in kernel
    ALTQ related functions disabled
    pfctl: pf already enabled
    		

    Список клеток

    Команда jls

    			% cbsd jls
    		
    Описание:

    Выводит список окружений на локальной ноде или всех добавленных нодах. Вы можете регулировать выводимые поля через аргумент display. Если display не указан, используется значение, заданное в файле $workdir/etc/defaults/jls.conf, которое вы можете изменить на свое усмотрение через $workdir/etc/jls.conf. Для скрытия заголовка, используйте аргумент header=0.

    Все возможные параметры для выборок описаны в файле $workdir/share/jail-arg

    Помимо базовых CBSD значений, вы можете добавлять собственные поля и значения для вывода при команде jls. Подробнее об этом: кастомные факты окружений

      JIDJail ID
      JNAMEимя окружения
      IP4_ADDRсписок привязанных к Jail IP адресов (IPv4,IPv6)
      HOST_HOSTNAMEFQDN окружения
      PATHкорень файловой системы окружения
      STATUSOn (запущена), Off (остановлена), Unregister (разрегистрирована из SQL базы)

    Для vnet-based окружений с виртуальным стеком, вам также может быть полезно поле REAL_IP4 для вывода фактических IP адресов внутри окружения

    Прим: окружения в статусе Unregister могут быть зарегистрированы через команду cbsd jregister. В случае, если к локальному серверу добавлены удаленные ноды, можно вывести все клетки в ферме через:

    			% cbsd jls alljails=1
    		

    или

    			% cbsd jls alljails=1 shownode=1
    		

    для вывода имени ноды, где размещается данная клетка.

    Другие примеры:

    			% cbsd jls display=jname,ip4_addr,vnet,real_ip4,astart
    			% cbsd jls header=0 display=jname,mycustom1,mycustom2,status
    		

    Запуск команд в jail

    Команда jexec

    			% cbsd jexec
    		

    Описание:

    Вы можете запустить из мастер-окружение команду на выполнение в контейнере через команду jexec

    Обязательный параметр - это имя контейнера, через jname=, все что идет после - является непосредственно командой и аргументами, которая будет запущена в контейнере

    Вы можете запустить на выполнение команду в одном контейнере или одновременно в нескольких. Для этого, используйте в jname= аргументе маску имен контейнеров, в которых будет выполнятся команда.

    Например, маска вида jname='test*jail' выполнит команду в контейнерах с таким именем, как test1jail, test2jail и тд. Если вы хотите запустить команду сразу во всех контейнерах данной ноды, используйте jname='*'

    Будьте осторожны, запуская долгие команды или действия, которые могут приводить к интерактивным диалогам. Вы можете получить вывод последних записей активных лог-файлов через посылку SIGINFO команды через нажатие Ctrl+'t' клавиш - эта функциональность позволит вам посмотреть и понять, на какой стадии находится выполнение команды в том или ином контейнере

    Результат отработки вы увидете на stdout, в то время, как вспомогательные сообщения - на stderr, соотв., если сообщения CBSD вам мешают, используйте перенаправление stderr в /dev/null

    Пример:

    			% cbsd jexec jname='jail*' pkg update -f
    			% cbsd jexec jname='*' pkg update -y
    			% cbsd jexec jname='*' pkg clean -ya
    		


    Multiple command execution:

    Логин в jail

    Команда jlogin

    			% cbsd jlogin
    		

    Описание:

    Выполняет вход в jail от пользователя root. В случае, если выполняется попытка входа в клетку, которой нет на локальной ноде, но она присутствует на одной из добавленных к машине нодах, команда jlogin задаст вопрос на попытку входа в удаленный jail через ssh.

    В случае, если в качестве аргумента имя клетки не указано, будет выведен список всех клеток в ферме (если добавлены удаленные ноды) в статусе Online для выбора

    Если производится удаленный вход в jail и в системе установлен tmux, вход в jail будет произведен с запуском tmux сессии, имя которой формируется от nodename того сервера, откуда производится вход.

    Если вы производите параллельно два входа с с одного источника в удаленный jail, вторая сессия будет подключена через tmux-attach. При выходе из удаленного jail, сессия tmux завершается (вы можете делать detach через Ctrl + b , d )

    Если tmux установлен в системе но вы НЕ хотите использовать его при jlogin, продублируйте ${workdir}/defaults/jlogin.conf параметр tmux_login в файле ${workdir}/etc/jlogin.conf, но со значением 0.

    Если вы не хотите каждый раз видеть дополнительный вопрос "try to login?" при входе в клетку на удаленной ноде, продублируйте ${workdir}/defaults/jlogin.conf параметр always_rlogin в файле ${workdir}/etc/jlogin.conf, со значением 1.

    Пример:

    			% cbsd jlogin kde4
    		

    Начиная с версии CBSD 11.1.2, вы можете кастомизировать команду, переопределив действие на вам более подходящее

    Достигается это через конфигурационный файл jlogin.conf и параметр login_cmd.

    Файл вы можете разместить как для индивидуального окружения в каталоге $workdir/jails-system/$jname/etc, так и глобально, перезаписав значение из $workdir/etc/defaults/jlogin.conf. Для этого, создайте файл с вашей конфигурацией в каталоге $workdir/etc/

    При кастомном вызове, вы можете использовать CBSD variables - переменные CBSD для того или иного окружения

    Например, если вы хотите, чтобы вместо стандартного поведения, при jlogin происходило соединение по ssh, файл $workdir/etc/defaults/jlogin.conf может выглядеть так:

    		login_cmd="/usr/bin/ssh your_user@${ipv4_first}"
    		

    Работа с параметрами jail

    Команды jget, jset

    			% cbsd jget
    		
    			% cbsd jset
    		

    Описание:

    Пример:

    Клонирование jail

    Команда jclone

    			% cbsd jclone
    		
    			% cbsd jrclone
    		

    Описание:

    Выполняет клонирование jail в новый. В качестве обязательных аргументов, указывается источник/оригинал клетки через old,новое имя через аргумент new и FQDN (hostname) через host_hostname. В качестве необязательного — новые ip адреса через ip4_addr (если IP несколько, адреса указываются через запятую без пробелов)

    Внимание: Если вы используете ZFS-based систему, CBSD будет использовать ZFS клонирование по-умолчанию!

    ZFS клонирование - это мгновенная операция независимо от объемов (спасибо Copy-on-write), но накладывает некоторые ограничения - вы будете записимы от наличия родительского снапшота.

    Если вы попробуете удалить родительское окружение,, CBSD автоматически выполнит команду zfs promote

    Вы можете контроллировать это поведение через аргумент clone_method=. Либо можете выставить его глобально через rclone.conf и bclone.conf, переопределив настройку с 'auto' на 'rsync':

    		% echo 'clone_method="rsync"' > ~cbsd/etc/rclone.conf
    		% echo 'clone_method="rsync"' > ~cbsd/etc/bclone.conf
    		

    Кастомный метод клонирования данных jail

    Вы можете создать собственный метод клонирования данных через выполняемый скрипт(ы) в каталоге $workdir/jail-system/$jname/clone-local.d.

    Например, создав к каталоге $workdir/jail-system/$jname/clone-local.d/ скрипт с именем myclone.sh и содержимым вида:

    			#!/bin/sh
    			echo "My custom clone for: $jname -> $newjname
    			echo "${data} -> ${newdata}"
    			/bin/cp -Ra ${data} ${newdata}
    		

    Вы заставите CBSD выполнять ваш скрипт в качестве метода клонирования данных

    Внимание: Этот скрипт должен завершаться с кодом 0 в случае успеха!

    Обратите внимание, что в скрипте доступны стандартные переменные CBSD variables, в дополнение к которым экспортируется переменные: $newjname, $newdata

    Зачем это нужно: если в качестве storage вы используете NAS или NFS и имеете на нее доступ, вы можете выполнить клонирование данных средствами NAS или непосредственно на сервере NFS, что значительно увеличит скорость клонирования и уменьшит ненужный трафик. См. Issue #373

    Пример: клонирование клетки jail2 в jail3 со сменой имени хоста host_hostname и ip адреса ip4_addr:

    			% cbsd jclone old=jail2 new=jail3 host_hostname=jail3.my.domain ip4_addr=10.0.0.22/24
    		

    Снапшоты (zfs-only)

    Команда jsnapshot

    			% cbsd jsnapshot
    		
    Описание:

    Выводит список, создает, удаляет и откатывает файловые снэпшоты для клетки, если нода запущена на файловой системе ZFS и zfsfeat в файле nc.inventory установлена в 1. Через параметр mode указывается, что именно необходимо выполнить. Возможные варианты:

    • list — вывести список снапшотов для указанной клетки
    • create — создать снапшот для указанной клетки
    • destroy — удалить снапшот для указанной клетки
    • destroyall — удалить все снапшоты для указанной клетки
    • clone — клонировать снашпот для указанной клетки
    • rollback — откатить снапшот для указанной клетки

    Дополнительные параметры:

    • jname — для какого jail выполняется действие
    • snapname — указать имя снапшота

    Следует иметь ввиду, что снапшоты имеют древовидную структуру. Тоесть, если вы создали последовательно снапшоты: 1,2,3,4 и откатились на снапшот 2, то снапшотов 3 и 4 не будет, поскольку по отношению ко времени создания снапшота 2 они были созданы в будущем. Кроме произвольного и уникального имени снапшота, при создании вы можете указать snapname=gettimeofday. В этом случае, система автоматически в качестве имени подставит timestamp от текущего времени. При выводе списка снапшотов, вы можете пользоваться модификаторами для уточнения к какому jail вы хотите увидеть снапшоты, а также кастомизировать выводимые поля через аргумент display=. Пример:

    создаем snapshot с именем gromozeka для клетки jail1:

    			% cbsd jsnapshot mode=create jname=jail1 snapname=gromozeka
    		

    создаем snapshot с именем zelepuka для клетки jail1:

    			% cbsd jsnapshot mode=create jname=jail1 snapname=zelepuka
    		

    Запустим jail1, выполним какие-либо модификации, остановим:

    			% cbsd jstart jail1
    			..
    			% cbsd jexec jname=jail1 cp /bin/date /root
    			% cbsd jexec jname=jail1 file -s /root/date
    			/root/date: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), dynamically linked (uses shared libs), for FreeBSD 9.0 (900506), stripped
    			% cbsd jstop jail1
    			..
    		

    Откатим jail1 на состояние, когда был создан снапшот zelepuka:

    			% cbsd jsnapshot mode=rollback snapname=zelepuka jname=jail1
    			% cbsd jstart jail1
    			...
    			% cbsd jexec jname=jail1 file -s /root/date
    			/root/date: ERROR: cannot open `/root/date' (No such file or directory)
    		

    Экспорт jail

    Команда jexport

    			% cbsd jexport
    		

    Описание:

    Внимание: выполнение команды допускает клетку в статусе On. Однако следует помнить (особенно если используются базы данных), что при импортировании такой клетки, с большой вероятностью можно получить проблемы в виде неконсистентных файлов, остаточных .pid файлов и тп, что может нарушить работу импортированной клетки.

    Экспортировать jail в файл (*.img). В качестве аргумента jname указывается имя клетки. img-файл сохраняется в каталоге $workdir/export. Оригинальная клетка после экспорта остается без изменений.

    Вы можете регулировать уровень компрессии через аргумент compress

    CBSD использует для компрессии утилиту xz(1), где вы можете почитать об уровнях компрессии.

    По-умолчанию используется compress=6. Если вы хотите выключить компрессию, используйте compress=0

    Пример (экспортировать клетку mysqljail в $workdir/export/mysqljail.img):

    			% cbsd jexport jname=mysqljail
    		

    Исключения для jexport

    Бывают ситуации, когда в экспортированный образ вы не хотите включать ту или иную информацию из контейнера. Например, если вы делаете экспорт работающего контейнера, имеющего смонтированное дерево портов в /usr/ports.

    В этом случае, вам может помочь параметр jexport_exclude, который можно указать глобально на уровне конфигурационного файла jexport.conf (скопируйте его из /usr/local/cbsd/etc/defaults в каталог ~cbsd/etc/) и откорректируйте значение jexport_exclude=

    Если требуется указать альтернативные исключения для конкретного jail, скопируйте этот файл в каталог ~cbsd/jails-system/$jname/etc/. В этом случае, исключения при команде jexport будут работать только для контейнера $jname

    Наконец, вы можете обходится без конфигурационного файла вовсе, перечислив все исключения через пробел в качестве параметра jexport_exclude="" при вызове утилиты jexport, например:

    			cbsd jexport jname=jail1 jexport_exclude="/var/run/* /usr/ports"
    		

    Данные исключения не будут копировать дерево портов, поскольку этот каталог мы всегда можем смонтировать с хоста. А также, исключит наличие мертвых .pid файлов, которые могут повлиять на корректность запуска контейнера после импортирования.

    Пути исключений указываются относительно корневого каталога контейнера. Так, если вы хотите мигрировать на другой сервер настройки контейнера jail1 используя jexport/jimport и при этом не хотите копировать какие-либо его данные, просто укажите / в качестве исключения:

    			cbsd jexport jname=jail1 jexport_exclude="/"
    		

    Импорт jail

    Команда jimport

    			% cbsd jimport
    		
    Описание:

    Импортировать из имиджа (*.img) клетку. В качестве аргумента jname указывается полный путь к файлу или имя имиджа (без расширения .img), который должен находится в соответствующем каталоге ($workdir/import). img-файл после импорта остается на месте. Дополнительно, вы можете импортировать клетку из образа в альтернативное имя (например, вы хотите развернуть клетку jail1 из образа jail1.img, однако в вашей системе уже имеется клетка с таким именем). В этом случае, используйте аргумент newjname

    Пример:

    Импортировать имидж из файла /tmp/mysqljail.img:

    			% cbsd jimport jname=/tmp/mysqljail.img
    		

    Пример:

    Импортировать образ jail2.img находящийся в $workdir/import под новым именем jail5:

    			% cbsd jimport jname=jail2 newjname=jail5 
    		

    Бекап и репликация jail

    Команды jbackup, j2slave

    			% cbsd jbackup
    		

    Описание:

    Пример:

    Описание jail

    Команда jdescr

    			% cbsd jdescr
    		
    Описание:

    Для каждой клетки можно ввести какое-то описание/аннотацию, что может быть использовано различными админками для построения динамической документации. cbsd jdescr без параметров выводит описание для всех клеток на ноде.

    Команда

    			% cbsd jdescr mode=update jname=jname
    		

    запустит редактор nvi в режиме редактирования описания. Через параметр editor можно указать альтернативный редактор, например vim, mcedit и тп. Описание хранится в ASCII-файле, сохраняемый в каталоге $workdir/jails-system/jname/descr, где jname — имя редактируемой клетки. Соответственно, файл можно просто скопировать. Поскольку каталог jails-system учавствует в jcoldmigrate, jclone, jimport/export и тп операциях, описание будет сохраняться.

    Пример (запустить редактор mcedit для редактирования описания клетки kde4 на русском языке в UTF8):

    			% setenv LANG ru_RU.UTF-8
    			% cbsd jdescr jname=kde4 editor=mcedit mode=update
    		

    Подобные описания рекомендуется взять за правило при заведении клеток, если их количество большое. Впоследствии, удобно агрегировать данную информацию в каких-то своих dashboard и построения карты jail-ов. К примеру, таким простым скриптиком: jmap2html.sh.html получается HTML страница вида dashboard sample, где по наведению на название клетки выводится описание, а ссылка на имя клетки ведет на список ПО клетки.

    Холодная миграция jail

    Команда jcoldmigrate

    			% cbsd jcoldmigrate
    		
    Описание:

    cbsd jcoldmigrate выполняет холодную (с отстановкой) миграцию клетки с одной ноды на другую. Параметр node указывает, на какую ноду следует мигрировать клетку. Предварительно, RSA/DSA ключ удаленной ноды должнен быть добавлен через команду cbsd node mode=add, а также, на удаленной ноде должен работать сервис rsyncd cbsdrsync.

    По-умолчанию, статус клетки на новой ноде наследуется — если клетка работала, она также будет автоматически запущена на новой ноде. Если клетка не работала — останется в статусе Off. Управлять, какой статус должен быть на удаленной клетке не зависимо от состояния на оригинале, можно через параметр start.

    Клетка на первоисточние, после успешного выполнения jcoldmigrate останавливается и переводится в статус Slave. В rc.conf файле клетки на новой ноде остается запись, с какой именно ноды этот jail был мигрирован.

    Примечание: миграция происходит в следующие этапы (в процессе выполния, они проходят автоматически и не видны)

    • перенос конфигурационных файлов на удаленную ноду, статус клетки — Slave (cbsd j2prepare)
    • запуск rsync, которая делает полную копию каталога с данными на удаленной ноду (cbsd j2slave)
    • останов клетки (cbsd j2slave)
    • повторный запус rsync, которая должна отработать быстрее первого раза за счет того, меньшее кол-во файлов успело модифицироваться
    • перевод клетки на локальной ноде в статус Slave (cbsd jswmode)
    • перевод клетки на удаленной ноде в статус Master (cbsd rexe + jswmode)
    • если клетка была запущена — запуск клетки на удаленной ноде (cbsd rexe + cbsd jstart)

    Пример (выполнить холодную миграцию на ноду netsnap):

    			% cbsd jcoldmigrate node=netsnap jname=amp123
    		

    на сервере netsnap ничего нет:

    с сервера cbuilder64 мигрируем клетку amp123 на netsnap:

    клетка amp123 на netsnap запущена автоматически:

    Управление лимитами jail

    Команды jrctl, jrctl-tui

    			% cbsd jrctl
    			% cbsd jrctl-tui
    		
    Описание:

    CBSD поддерживает различные механизмы FreeBSD для установки лимитов на ресурсы клетки, такие как: zfs quota, rctl(8) и cpuset

    CPU и Memory лимиты

    Наиболее востребованными в установке параметрами ограничения являются лимиты по потреблению CPU и оперативной памяти. Вы можете ограничивать потребление CPU через RACCT ( параметры cputime и pcpu ), либо использовать выделение фиксированного количества ядер (через cpuset) через параметр cpu=.

    В наших исследованиях и тестированиях cpu= является наиболее практичным и востребованным решением. Параметр cpu= указывает, какое количество ядер контейнер может утилизировать. Вы сразу можете создать контейнер, ограниченный, к примеру, одним ядром:

    		% cbsd jcreate jname=myjail cpu=1 runasap=1
    		

    Помимо ограничения ядер, вы можете захотеть ограничить потребление памяти через vmemoryuse=:

    		% cbsd jcreate jname=myjail cpu=1 vmemoryuse=1g runasap=1
    		

    Или, если вы предпочитаете создавать окружения через CBSDfile, это может выглядеть так:

    jail_test2()
    {
            ip4_addr="DHCP"
            host_hostname="test2.my.domain"
            pkg_bootstrap="0"
    
            # LIMIT/QUOTAs:
            fsquota="10g"           # set ZFS dataset quota
            cpu="1"                 # only one vCPU allowed!
            vmemoryuse="512m"       # only 512MB RAM allowed!
    }
    		

    Файловые квоты

    Плавающие файловые квоты возможны только для клеток, размещенных на ZFS-файловой системе. Квота регулируется через параметр fsquota=. Для систем на UFS подобное можно осуществить лишь md(4)-based vnode файл/имидж (параметр mdsize у клетки).

    Приоритезация через renice

    Для приоритезации используется подсистема renice(8). Вы можете указывать различные приоритеты у разных клеток, чтобы наиболее важные клетки получали максимум CPU-времени за счет клеток, которые процессорное время могут уступить. К примеру, вы можете захотеть выдать клеткам distcc минимальный приоритет, тогда как клетке с WEB сервером — средний, а клетке с базой данных — максимальный. За это поведение отвечает параметр nice в настройках jrctl клетки, его значение и поведение соответствует nice(1) — чем ниже коэффициент, тем клетка приоритетнее.

    Демонстрация работы nice:

    1) Создадим AMP клетку, поместив в docroot .php скрипт выполняющий некоторые математические действия, например bench.zip взятый с http://www.php-benchmark-script.com/ с увеличенными в 10 раз итерациями в циклах. Склонируем клетку, первой дав имя highprio1, второй — lowprio1. Через cbsd jrctl-tui укажем первой максимальный приоритет -20, второй — минимальный, 20. Кроме этого, повесим клетки на одно ядро через cpuset в cbsd jconfig (одноядерные системы сейчас найти сложно, а умный шедулер ОС не позволит провести чистый эксперемент без этих действий ;-).

    			% cbsd jls display=jid,jname,ip4_addr,cpuset
    				16   highprio1   10.0.0.121/24  4
    				17   lowprio1    10.0.0.122/24  4
    		

    — jid 16 имеет приоритетная клетка и jid 17 — неприоритетная, обе на четвертом ядре.

    сделаем опрос через top состояния загруженности php-fpm и выводом JID:

    			% export iter=1
    			% while [ 1 ]; do
    				printf "Iter: $iter" ;
    				iter=$((iter+1))
    				top -jab | grep php
    				sleep 1
    			done
    		

    Запускаем скрипт одновременно в обоих IP:

    	% fetch -T 300 -o /dev/stdout http://10.0.0.121 & fetch -T 300 -o /dev/stdout http://10.0.0.122 & 
    	[1] 65985
    	[2] 65986
    	
    	--------------------------------------
    	|        PHP BENCHMARK SCRIPT        |
    	--------------------------------------
    	Start : 2014-01-06 16:28:59
    	Server : @10.0.0.121
    	PHP version : 5.4.23
    	Platform : FreeBSD
    	--------------------------------------
    	test_math                 : 12.870 sec.
    	test_stringmanipulation   : 15.896 sec.
    	test_loops                : 8.968 sec.
    	test_ifelse               : 7.864 sec.
    	--------------------------------------
    	Total time:               : 45.598 sec.
    	
    	--------------------------------------
    	|        PHP BENCHMARK SCRIPT        |
    	--------------------------------------
    	Start : 2014-01-06 16:29:02
    	Server : @10.0.0.122
    	PHP version : 5.4.23
    	Platform : FreeBSD
    	--------------------------------------
    	test_math                 : 32.632 sec.
    	test_stringmanipulation   : 18.053 sec.
    	test_loops                : 6.323 sec.
    	test_ifelse               : 5.504 sec.
    	--------------------------------------
    	Total time:               : 62.512 sec.
    	
    	[2]    Done                          fetch -T 300 -o /dev/stdout http://10.0.0.122
    	[1]  + Done                          fetch -T 300 -o /dev/stdout http://10.0.0.121
    		

    во время чего наблюдаем следующую картину top:

    	Iter: 1
    	65101  16 www           1  35  -20 32548K 11456K CPU4    4   0:35  20.56% php-fpm: pool www (php-fpm)
    	65587  17 www           1  52   20 32548K 11456K RUN     4   0:32   0.00% php-fpm: pool www (php-fpm)
    	Iter: 2
    	65101  16 www           1  60  -20 32548K 11456K RUN     4   0:36  25.98% php-fpm: pool www (php-fpm)
    	65587  17 www           1  42   20 32548K 11456K CPU4    4   0:33   2.10% php-fpm: pool www (php-fpm)
    	Iter: 3
    	65101  16 www           1  60  -20 32548K 11456K CPU4    4   0:36  26.27% php-fpm: pool www (php-fpm)
    	65587  17 www           1  94   20 32548K 11456K RUN     4   0:33   8.59% php-fpm: pool www (php-fpm)
    	Iter: 4
    	65101  16 www           1  61  -20 32548K 11456K CPU4    4   0:37  31.69% php-fpm: pool www (php-fpm)
    	65587  17 www           1  95   20 32548K 11456K RUN     4   0:34   9.47% php-fpm: pool www (php-fpm)
    	Iter: 5
    	65101  16 www           1  62  -20 32548K 11456K CPU4    4   0:37  35.60% php-fpm: pool www (php-fpm)
    	65587  17 www           1  95   20 32548K 11456K RUN     4   0:34  11.18% php-fpm: pool www (php-fpm)
    	Iter: 6
    	65101  16 www           1  64  -20 32548K 11456K CPU4    4   0:38  38.96% php-fpm: pool www (php-fpm)
    	65587  17 www           1  96   20 32548K 11456K RUN     4   0:34  12.79% php-fpm: pool www (php-fpm)
    	..
    		

    Клетка с jid 16 получила бОльший приоритет и выполнилась в почти в 1.5 раза быстрее.

    RACCT/RCTL фреймворк

    Если ваше ядро имеет поддержку RACCT/RCTL, вы можете устанавливать лимиты, описанные в rctl(8) на клетки и смотреть текущую статистику по потребляемым ресурсам jail. Для установки и снятия лимитов используется команда cbsd jrctl, которая с аргументами

    			% cbsd jrctl mode=apply  ...
    		
    и
    			% cbsd jrctl mode=unset  ...
    		

    вызываются автоматически для установки или снятия лимитов при работе команд jstart и jstop соответственно. Через флаг

    			% cbsd jrctl mode=show
    		

    высвечивается текущая статистика по потребляемым ресурсам jail, что может быть использовано для генерации отчетов и графиков по загрузке jail, а также, используется демоном CBSD для генерации рекомендаций о необходимости добавлять новые ресурсы и предупреждений перегрузок.

    Через команду

    			% cbsd jrctl
    		

    без аргументов, вы можете увидеть установленные лимиты для всех клеток. Через аргумент display можно указать конкретные поля для выборки данных. Если display не указан, используется значение, заданное в файле $workdir/etc/defaults/jrctl.conf, которое вы можете изменить на свое усмотрение через $workdir/etc/jrctl.conf

    Вы можете редактировать лимиты через

    			% cbsd jrctl-tui jname=jname
    		

    Либо, если вы строите хостинг площадку и хотите создавать лимиты не-интерактивно, вы можете генерировать файл $workdir/$jname/jail.limits

    Через jrctl можно установить следующие лимиты jail:

    a) Все что позволяет делать подсистема rctl(8) FreeBSD, а именно:

    	cputime 	   CPU time, in seconds
    	datasize	   data size, in bytes
    	stacksize	   stack size, in bytes
    	coredumpsize	   core dump size, in bytes
    	memoryuse	   resident set size, in bytes
    	memorylocked	   locked memory, in bytes
    	maxproc 	   number of processes
    	openfiles	   file descriptor table size
    	vmemoryuse	   address space limit, in bytes
    	pseudoterminals    number of PTYs
    	swapuse 	   swap usage, in bytes
    	nthr		   number of threads
    	msgqqueued	   number of queued SysV messages
    	msgqsize	   SysV message queue size, in bytes
    	nmsgq		   number of SysV message queues
    	nsem		   number of SysV semaphores
    	nsemop		   number of SysV semaphores modified in a single semop(2) call
    	nshm		   number of SysV shared memory segments
    	shmsize 	   SysV shared memory size, in bytes
    	wallclock	   wallclock time, in seconds
    		

    expose: tcp/udp форвард портов из мастер хоста в jail

    Команда expose

    			% cbsd expose jname=test2 mode=add in=200 out=200
    			% cbsd expose jname=test2 mode=delete in=200 out=200
    			% cbsd expose jname=test2 mode=list
    			% cbsd expose jname=test2 mode=clear
    			% cbsd expose jname=test2 mode=flush
    		

    Команда cbsd expose позволяет создать правило форварда tcp/udp порта с внешнего адреса внутрь клетки.

    Получение ISO и USB Memstick загрузочных образов из клеток

    Команда jail2iso

    			% cbsd jail2iso
    		
    Описание:

    Скрипт jail2iso позволяет создать загрузочный образ для CD/DVD/Memstick или гипервизора bhyve из указанной клетки. Несмотря на то, что функционал jail2iso не используется в работы CBSD или клеток, этот скрипт может быть очень полезен для легкого и комфортного построения кастомизированных LiveCD, содержимое которых вы можете устанавливать, настраивать и проверять в клетке. Например, этот функционал удобен для:

    • Создание Rescue-систем с необходимыми инструментами на борту
    • Построение собственного дистрибутива FreeBSD
    • Создание образов для бездисковых серверов/станций (например загружаемые с PXE, MicroSD, Flash, CD/DVD, и тд) и монтирующие домашние каталоги или клетки/файлы с данными по NFS/FibreChannel/iSCSI/InfiniBand.
    • Переноса jail в образ bhyve для использования особенностей функционала bhyve (и потери особенностей функционала jail)

    Схема работы скрипта для iso/memstick

    • Создание файловой иерархии будущего образа, состоящей из подмонтированной базы и данных клетки
    • Создание MFS/UZIP образа, который будет оставаться в памяти. Используется в основном для ускорения работы в режиме LiveCD, позволяя "закешировать" часто вызывающиеся утилиты и библиотеки, например от / до /usr.
    • Монтирование поверх MFS иерархии данных с файловой системы носителя через nullfs/RO
    • Монтирование tmpfs поверх RO файловой системы для возможности производить модификации.

    Если вам необходимо ряд директорий при загрузке образа перезагрузить в RW через tmpfs, до вызова утилиты jail2iso необходимо прописать в файл $systemdir/jail/tmpfsdir все пути. Например для rescuebsd клетки это файл: /usr/jails/jails-system/rescuebsd/tmpfsdir содержащий:

    			/root
    			/var/run
    			/var/cache
    			/var/db
    			/var/spool
    			/var/log
    			/usr/home
    			/usr/local/etc
    		

    Данные записи будут обработаны /etc/rc.d/tmpfsdir, который сохранит на образ jail2iso. Все содержимое в этих файлах, которое находится на jail, будет перемещено на tmpfs файловую систему. Поскольку RW области монтируются через TMPFS, количество доступной для записи памяти будет зависеть от количества оперативной памяти, на котором запускается LiveCD. Вы можете предпочесть написать собственный /boot/loader.conf на создаваемом образе. Для этого, сохранив файл loader.conf в каталог $systemdir/$jname/. Все, что вы напишете в этом файле, добавиться к файлу loader.conf, генерируемого jail2iso, которая имеет следующие обязательные записи:

    geom_uzip_load="YES"
    tmpfs_load="YES"
    nullfs_load="YES"
    
    mfs_load="YES"
    mfs_type="mfs_root"
    mfs_name="/mfsroot"
    vfs.root.mountfrom="ufs:/dev/md0"
    
    net.inet.ip.fw.default_to_accept=1
    		

    Например, для клетки xrescuebsd, которая загружается в режиме KMS на ядре с newcons, имеется файл /usr/jails/jails-system/xrescuebsd/loader.conf со следующим содержимым:

    kern.ipc.shmmni=4096
    kern.ipc.shmseg=4096
    radeonkms_load="YES"
    i915kms_load="YES"
    linux_load="YES"
    		

    Вы можете указать, какой тип образа jail2iso должна создать, ISO образ с cd9960 для CD/DVD/Виртуальных машин или Memstick, образ, который вы сможете записать на USB Flash носитель.

    Схема работы скрипта для образа bhyve

    Поскольку образ bhyve изначально будет в режиме RW, для него не требуется создание RO образа c UZIP и сопровождение tmpfsdir, поэтому данная стадия при формировании образа отсутствует. Скрипт автоматически создаст fstab-запись для монтирования соответствующего устройства в bhyve машине и откорректирует /etc/ttys, как этого требует инструкция. При создании образа bhyve, пользуйтесь параметром

    % cbsd jail2iso ... freesize=
    		

    Поскольку без этого параметра, создается диск объемом, равным объему фактических данных, без запаса. Это сделает систему нерабочей, поэтому, через freesize= дополнительно указывается объем свободного места в образе после копирования туда основных данных.

    Дополнительные сведения

    cbsd jail2iso не контроллирует и не лимитирует объемы конечного результата — они ограничены лишь вашим носителем, для которого создается образ.

    Для создания ISO образа:

    % cbsd jail2iso media=iso ..
    		

    Для создания memstick:

    % cbsd jail2iso media=memstick ..
    		

    Для создания bhyve образа:

    % cbsd jail2iso media=bhyve freesize=XXg ..
    		

    Каталог, куда будет сохранен образ указывается через аргумент dstdir. По-умолчанию, на образ будет сохранено GENERIC ядро из каталога $workdir/basejail/. Его можно получить по команде:

    % cbsd repo action=get sources=kernel
    		

    для вашей версии FreeBSD, или собрать самостоятельно через cbsd buildkernel. Если ядро GENERIC не подходит, через аргумент name для jail2iso вы можете указать другое ядро, если оно у вас есть. Кроме этого, для уменьшения размера финального образа, jail2iso выполняет ряд действий:

    • удаление .a-архивных файлов в каталогах библиотек
    • удаление необязательных данных по файлу-списку.

    По-умолчанию, данный список расположен в $workdir/share/jail2iso-prunelist. Вы можете его откорректировать по собственному усмотрению или создать свой, указав путь к нему через аргумент prunelist

    Пример создания memstick из клетки jail1:

    % cbsd jail2iso media=memstick jname=jail1 dstdir=/tmp
    		

    Если файл /tmp/jail1.img создался, его можно записать на USB носитель через команду:

    % dd if=/tmp/mc.img of=/dev/da0 bs="10240" conv="sync"
    		

    , если /dev/da0 — это USB flash носитель.

    Пример создания и запуск bhyve образа из jail1 с сетью через интерфейс em0:

    % cbsd jail2iso media=bhyve jname=jail1 dstdir=/tmp freesize=1g
    % kldload vmm
    % kldload if_tap
    % sysctl -w net.link.tap.up_on_open=1
    % ifconfig tap0 create
    % ifconfig bridge0 create
    % ifconfig bridge0 addm em0 addm tap0
    % ifconfig bridge0 up
    % sh /usr/share/examples/bhyve/vmrun.sh -d /tmp/jail1-10.0_amd64.img vm1 
    		

    где /tmp/jail1-10.0_amd64.img — результат работы jail2iso.

    Поиск клеток в ферме

    Команды jwhereis, jailmapdb

    			% cbsd jwhereis
    			% cbsd jailmapdb
    		
    Описание:

    В случае использования нескольких нескольких FreeBSD/cbsd нод, можно сгенерировать карту размещения клеток по соответствующим серверам. Данный функционал использует утилиты jlogin при поиске удаленных клеток. Также, эту карту могут использовать различные утилиты, например для построения админок, документаторов по ферме, а также различные сервисы (например, Bacula клетка может по карте автоматически искать новые jail и создавать для них конфигурации для резервного копирования или при миграции клетки с одной ноды на другую, способа переконфигурировать целевой хост для бекапа клетки без участия системного администратора).

    Копирование файлов из/в клетки

    Команда jailscp

    			% jail1:remotefile1 localfile1 [ localfile2 jail2@:remotefile2 ]
    		

    Команда cbsd jailscp позволяет копировать файлы из/на файловые системы jail. Синтаксис аргументов аналогичен команде scp(1)

    Если вы копируете из/в клетку, которая не локальна, те, расположена на удаленной ноде, копирование возможно только при наличие id_rsa ключей к удаленной ноде. Кроме этого, при наличие rootkeyfile для ноды, соединение для пользователя root будет предпочитаться пользователю cbsd, что позволит вам записывать файлы в jail не только в каталогах, владелец которых cbsd

    Пример:

    			% cbsd jailscp
    		

    Пара слов о подсчете трафика jail

    Команда fwcounters

    Описание:

    В данный момент, самым простым способом считать трафик - использовать функционал ipfw count на JID необходимого окружения.

    Необходимые условия для выполнение этого:

    • загруженный модуль ipfw.ko;
    • установленный в CBSD (например через cbsd initenv-tui) параметр ipfw_enable в 1;
    • наличие count правил в ipfw до любых других правил файрволла.

    CBSD при запуске и остановке клетки автоматически задает и снимает правила для трафика jail, используя для этого диапазон правил указанных настройке CBSD (по-умолчанию, диапазон: fwcount_st="99" - fwcount_end="2000" )

    Другими словами, если вы хотите считать трафик и при этом иметь возможность фильтровать трафик, создавайте правила фильтрации выше 2000 и не занимая правила с 99 до 2000.

    Сбор трафика происходит 1 раз в час или при остановке клетки и сохраняется в SQLite3 базу, расположенную в системном каталоге jail: $workdir/jails-system/$jname/traffic/YYYY-MM.sqlite, где YYYY, MM - год и месяц.

    Пример. Смотрим статистику трафика для клетки kde4. Значение полей outgoing и incoming - в байтах:

    root@home:/ # sqlite3 /usr/jails/jails-system/kde4/traffic/2014-09.sqlite 
    SQLite version 3.8.6 2014-08-15 11:46:33
    Enter ".help" for usage hints.
    
    sqlite> .schema traffic
    CREATE TABLE traffic (  dt TIMESTAMP DATE DEFAULT (datetime('now','localtime')) UNIQUE PRIMARY KEY, incoming integer, outgoing integer  );
    
    sqlite> select * from traffic order by dt desc limit 15;
    2014-09-20 15:00:52|142704274|4958246
    2014-09-20 14:00:51|163907026|25242205
    2014-09-20 13:00:49|3894888|182821
    2014-09-20 05:49:53|58329247|41769720
    2014-09-20 05:00:23|24247445|3464945
    2014-09-20 04:00:56|67749758|39433640
    2014-09-20 02:28:36|11767628|438283
    2014-09-20 02:00:57|115675943|10809029
    2014-09-20 01:00:54|279397568|156221677
    2014-09-20 00:00:51|223665101|6232876
    2014-09-19 23:00:50|250122634|8619979
    2014-09-19 22:00:49|221508227|6458218
    2014-09-19 01:00:42|64715837|3443253
    2014-09-19 00:00:38|109266525|8541659
    2014-09-18 23:00:34|99594683|20380707
    sqlite>