2020-10 upd: we reached the first fundraising goal and rented a server in Hetzner for development! Thank you for donating !
Что необходимо знать о CBSD
Общая информация
CBSD представляет из себя дополнительный уровень абстракции над Jail framework, bhyve hypervisor, XEN project hypervisor и частью функционала ОС FreeBSD.
Некоторый список этого функционала, задействованного в CBSD:
- vnet (VIMAGE)
- zfs
- racct/rctl
- ipfw/pf/ipfilter
- carp
- hastd
- vale
- vxlan
Не смотря на то, что CBSD преследует цель быть максимально user-friendly приложением (например использование bsdconfig-like диалогов), фреймворк развивается как встраиваемая система управления окружениями, которую вы можете использовать на самом низком уровне для построения собственной Cloud инфраструктуры.
Другими словами, вы можете работать непосредственно с ней как конечный пользователь интерактивно, так и использовать ее в качестве backend-ядра, взаимодействуя с ней через собственное, более высокого уровня приложение.
CBSD подразумевает использование нескольких серверов (кластер), но может одинаково хорошо работать и в standalone варианте на вашем лэптопе.
Многие подсистемы не имеют непосредственного отношения к jail или гипервизору виртуальных машин, однако, позволяют CBSD (являющейся связующим звеном между этими компонентами) предоставить администратору системы более расширенную и комплексную систему для решения задач.
Если вы работаетет с jail, глава FreeBSD Jails обязательна для изучения, чтобы понимать, что представляет из себя jail в классическом виде.
Если вы работаете с bhyve или XEN, обязательно попробуйте сначала ознакомиться с официальной документацией: Chapter 21. Virtualization: FreeBSD as a Host with bhyve и XEN project hypervisor.
Во-вторых, полезно знать о иерархии файловой системы CBSD. Условимся в документации использовать следующие именования и значения:
- Нода — физический сервер/единица ресурсов.
- Клетка — Jail, изолированное окружение со своим набором ПО/сервисом. В них могут быть как серверные компоненты (DNS, Apache/nginx, postfix) так и графические окружения. Клетки делятся на два типа — сервисные и целостные.
- Облако — Ферма/кластер, связанные между собой нодами, одноранговая полноправная сеть (каждая нода может делать задачи другой посредством CBSD)
- База — в контексте CBSD — копия базовой системы FreeBSD.
- CBSD — некая сущность, имеющая контроль над нодой(ами) и определенными подсистемами FreeBSD, способная предоставлять упрощенные и единые действия (API) над нодами, клетками и предоставляющая ACL и разграничение прав для клиентов CBSD
- $workdir — рабочий каталог CBSD на нодах, инициализируется через cbsd initenv при первом запуске. Обычно /usr/jails.
- $jname — Какое-то имя клетки, учавствующей в примере.
Вся рабочие данные CBSD находится в каталоге $workdir (например /usr/jails), он же является домашним каталогом для пользователя CBSD и вы всегда можете быстро перейти в него по команде:
% cd ~cbsd
Самые важные данные находятся в каталоге $workdir/jails-data/$jname-data, поскольку это непосредственно корень файловой системы клетки с именем $jname, если клетка создана с флагом baserw=1, либо содержит те данные клетки, которые накладываются на стандартный $workdir/basejail/$basename в каталоге ${workdir}/jails
Учитывая, что базу вы всегда можете получить через сборку исходных кодов или скачав с репозитория, то для миграции jail на любой другой проект по управлению клетками самое главное — это иметь консистентные данные в этом каталоге.
Примечение: если использовать тип клетки md, то в каталог $workdir/jails-data/$jname будет содержать имидж клетки.
Примечание2: если вы используете ZFS и обнаружили, что данные каталоги пусты (при остановленной клетке), проверьте вывод команды:
% zfs list
cbsd может размонтировать данные когда клетка неактивна. Для доступа к данным выполните:
% zfs mount соответствующая_$jname_файловая_система
Второе по значимости в иерархии каталогов CBSD могут выступать конфигурационные файлы для создания клетки, которые располагаются в каталоге $workdir/var/db/. Все параметры клетки сохраняются в SQLite3 файле, на который указывает симлинк ${workdir}/var/db/local.sqlite в таблице jails. Схема таблицы описана в файле ${workdir}/share/local-jails.schema Например, для того чтобы посмотреть все клетки на ноде и их ip адреса:
% sqlite3 /usr/jails/var/db/local.sqlite "select jname,ip4_addr from jails"
Когда клетка запускается, CBSD генерирует jail.conf(5) файл из данных SQLite3 командой
Каталог $workdir/jails-system/ служит в качестве дополнительного места хранения служебной информации к клеткам, например в нем могут быть конфигураторы сервисов, файл с описанием клетки, статистика по трафику и потребляемым ресурсам, GELI-образы клетки и тд.
Служебная информация для нужд самой CBSD находится в каталоге $workdir/db. Например, информация о списке добавленных нод, инвентаризация как локальной ноды так и удаленных и тд.
Важными в плане безопасности, является каталоги ${workdir}/.rssh и ${workdir}/.ssh, в котором находятся приватные RSA ключи от пользователя CBSD с удаленных нодах и с локальной соответственно. Следите за тем, чтобы данные этих каталогов были недоступены для других пользователей системы. Кроме того, вам может быть интересна информация о GELI криптовании. По-умолчанию, читать ключ может только системный пользователь CBSD.
И наконец в-третьих, обязательно ознакомьтесь с модификациями, которые производит CBSD в вашей конфигурации: Модификации, которые выполняют скрипты CBSD в FreeBSD
Модули
Функциональность CBSD может быть расширена за счет активации дополнительных модулей, которые может написать любой желающий.
Каждый модуль - это каталог, расположенный по пути /usr/local/cbsd/modules. Для его активации, необходимо добавить имя модуля в конфигурационный файл ~workdir/modules.conf и проинициализировать запуском: cbsd initenv
Хороший пример использования модулей - ClonOS project, который с помощью модулей добавляет VNC терминал в jail, нотификации и поддержку по web-socket, хелпелы для деплоя сервисов в контейнерах и так далее
.Конфигурации и настройки
CBSD является высококонфигурируемой и настраивоемой под себя системой, что делает ее черезвычайно гибким и универсальным решением при использовании в широком спектре задач.
Посмотрите на содержимое каталога ~workdir/etc/defaults/. В нем находятся как глобальные настройки (например цветовая схема, настройка логгирования), так и конфигурационные файлы конкретных команд (например blogin, bstart, jclone и тд)
Вы можете переназначать эти настройки в FreeBSD-way, записав изменения в одноименном файле, но расположив уровнем выше, в каталоге ~workdir/etc/
Аналогично, как вы поступаете с конфигурацией FreeBSD в /etc/defaults/
Мульти-операции с использованием jname по маске
Большинство CBSD команд поддерживают форму записи jname= в виде маски.
Например, если вы хотите выполнить однотипную операцию на группе jail с именами jail1, jail2, jail3, вы можете использовать jname='jail*'
Еще примеры:
cbsd jset jname='*' ver=native cbsd jset jname='*' ver=native astart=0 devfs_ruleset=4 [..] cbsd jexec jname='jail*' file -s /bin/sh cbsd pkg jname='myja*l*' mode=install ca_root_nss nss cbsd jstop jname='*' cbsd jstart jname='lala*'
Иерархия CBSD каталога
${workdir}/.rssh/ | Каталог для хранения приватных ключей удаленных нод. Файлы добавляются и удаляются через команду cbsd node |
${workdir}/.ssh/ | Здесь хранится приватный и публичный ключ непосредственно данной ноды. Формируется на этапе инициализации при команде cbsd initenv. Именно отсюда будут забирать публичный ключ удаленные хосты по команде cbsd node mode=add. Имя, заданное на этапе initenv в вопросе nodename должен совпадать с написанием имени в аргументе node= при команде cbsd node mode=add. Имя файла ключа является md5 суммой от этого имени. Кроме этого, эта пара ключей используется по-умолчанию при работе с облачными образами виртуальных машин, например, в операциях 'cbsd bexec, cbsd bscp, cbsd blogin' |
${workdir}/basejail | Здесь хранятся готовые к использованию базы и ядра FreeBSD (результат cbsd buildworld/buildkernel, cbsd installworld/installkernel или cbsd repo action=get sources=base/kernel) |
${workdir}/etc | Конфигурационные файлы, необходимые для работы cbsd |
${workdir}/export | Каталог по-умолчанию, в который будет сохраняться экспортированная в файл клетка (при команде cbsd jexport jname=$jname, в этом каталоге появится файл $jname.img) |
${workdir}/import | Каталог по-умолчанию, из которого будет импортирован jail (при cbsd jimport jname=$jname, будет развернута клета $jname) |
${workdir}/jails | В данном каталоге находятся точка монтирования корня для jail-ов, использующих baserw=0. |
${workdir}/jails-data | В этом каталоге лежат данные клетки или виртуальные диски виртуальной машины. Именно этим местам необходим бекап для сохранности данных клетки. Также, если клетка использует baserw=1, эти каталоги являются корнем клетки при ее старте. Обратите внимание! При использовании ZVOL, фактически диски расположены в ZVOL и из каталога jails-data идут лишь символические ссылки - учитывайте это при планировании резервного копирования/DR !. Этот каталог (или VOLUME, на которые указывают симполические ссылки) подлежит резервному копированию, если вы хотите восставить данные своих виртуальных окружений в случае сбоев. |
${workdir}/jails-fstab | fstab файл для клеток. Синтаксис обычный для FreeBSD за тем лишь исключением, что путь к точке монтирования пишется относительно корня jail (запись /usr/ports /usr/ports nullfs rw 0 0 в файле fstab.$jname означает, что из мастер-ноды каталог /usr/ports будет примонтирован при запуске в ${workdir}/jails/$jname/usr/ports) |
${workdir}/jails-system | Этот каталог может содержать какие-то вспомогательные скрипты, относящиеся к клетке (например скрипты-wizard-ы для настройки, вспомогательная база данных окружения, конфигураторы и пр) а также, сохраняется трафик клетки, если используется ipfw и ее описание. Данный каталог учавствует при jimport/jexport операциях и мигрировании клеток. Этот каталог подлежит резервному копированию, если вы хотите восставить работу CBSD при сбоях. |
${workdir}/vm | Каталог специфичный для ZFS-based инсталляций при использовании виртуальных машин. Выполняет те же функции, что каталог jails-data, при этом каталог в jails-data становится символической ссылкой на каталоги vm/ |
${workdir}/var | Каталог который содержит различную системную информацию cbsd. Например, в ${workdir}/var/db находится инвентаризация локальных и удаленных нод если они были добавлены |
${workdir}/var/db | Здесь размещается основная и самая главная SQLite3 база CBSD, на нее указывает симполическая ссылка local.sqlite. Этот каталог подлежит резервному копированию, если вы хотите восставить работу CBSD при сбоях. |
/usr/local/cbsd | Копия оригинальных файлов CBSD устанавливаемая портом. Также, содержит рабочие скрипты в каталоге sudoexec |
Например, для ручного переноса контейнера из структуры CBSD вам потребуется файл, на который указывает символическая ссылка ~cbsd/var/db/local.sqlite. Ее содержимое (таблица jails, bhyve, xen ..) отвечает за список зарегистрированных окружений, например:
sqlite3 ~cbsd/var/db/local.sqlite "SELECT * from jails"; sqlite3 ~cbsd/var/db/local.sqlite ".schema jails"; sqlite3 ~cbsd/var/db/local.sqlite ".tables"; sqlite3 ~cbsd/var/db/local.sqlite ".dump";
Также, вам необходим rootfs контейнера в каталоге ~cbsd/jails-data/JAILNAME-data
Что касается виртуальных машин, вам необходимо дополнительно проверить, являются ли диски виртуальных машин ZVOL-based ( zfs list | egrep "dsk[0-9]+.vhd" ), а также, обязательно скопировать ~cbsd/jails-system/ENVNAME/ , где находятся настройки виртуальной машины в файле local.sqlite:
sqlite3 ~cbsd/jails-system/VMNAME/local.sqlite "SELECT * from settings"; sqlite3 ~cbsd/jails-system/VMNAME/local.sqlite ".tables"; sqlite3 ~cbsd/jails-system/VMNAME/local.sqlite ".dump";
Подсчет трафика jail
В данный момент, для подсчета трафика jail используются правила count у фильтра ipfw. CBSD назначает для счетчиков номера правил из диапазона 99 — 2000 (можно изменить в cbsd.conf). Поэтому будьте внимательны и следите за тем, чтобы ваши правила IPFW следовали после указанного диапазона.
Expose: проброс портов из мастер хоста в jail
В данный момент, для проброса tcp/udp портов используются правила fwd у фильтра ipfw. CBSD назначает для счетчиков номера правил из диапазона 2001 — 2999 (можно изменить в cbsd.conf). Поэтому будьте внимательны и следите за тем, чтобы ваши правила IPFW следовали после указанного диапазона.
О rsync-based копировании данных между нодами
Если вы активируете cbsdrsyncd, имейте ввиду, что это обычный rsyncd(1) демон, который смотрит в конкретный $jail-data каталог и защищен только средствами rsync и паролем, который генерирует CBSD через:
head -c 30 /dev/random | uuencode -m - | tail -n 2 | head -n1
В данный момент используется передача через daemon, а не rsync over ssh по той причине избегания открывания доступа для пользователя root. Соответственно, в качестве дополнительной защиты, рекомендуется закрывать порт 1873/tcp который использует
ANSII Color
По-умолчанию, CBSD выводит текст в цвете (используя управляющие последовательности ANSII). Если по каким-то причинам цвет неприятен, либо вы используете вывод от утилит CBSD в своих скриптах, которым последовательность ANSII мешает, вы можете запретить цвет через переменную окружения NOCOLOR=1. Например, команда
% env NOCOLOR=1 cbsd jls
запретит использование цвета при выводе заголовка.
Если что-то пошло не так
В случае, если при выполнении утилит CBSD возникают ошибки и Debug отработки CBSD команд ясности не дал, рекомендуется оформить проблему в баг-трекере проекта: cbsd issues или сообщить об ошибке по email: CBSD at bsdstore.ru
Делайте резервные копии каталогов ${workdir}/var/db, ${workdir}/var/db, ${workdir}/jails-fstab, ${workdir}/jails-system и, конечно же, данные клеток в каталоге ${workdir}/jails-data