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. Подробнее об этом: кастомные факты окружений
JID | Jail ID |
JNAME | имя окружения |
IP4_ADDR | список привязанных к Jail IP адресов (IPv4,IPv6) |
HOST_HOSTNAME | FQDN окружения |
PATH | корень файловой системы окружения |
STATUS | On (запущена), 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>