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 представляет из себя дополнительный уровень абстракции над 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-fstabfstab файл для клеток. Синтаксис обычный для 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 следовали после указанного диапазона.

Чуть более подробно о подсчете трафика jail

Expose: проброс портов из мастер хоста в jail

В данный момент, для проброса tcp/udp портов используются правила fwd у фильтра ipfw. CBSD назначает для счетчиков номера правил из диапазона 2001 — 2999 (можно изменить в cbsd.conf). Поэтому будьте внимательны и следите за тем, чтобы ваши правила IPFW следовали после указанного диапазона.

Чуть более подробно о expose

О 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 который использует CBSD от недоверенных лиц и использовать для nodeip отдельный management интерфейс, либо использовать шифрованные каналы связи между нодами (например IPSec)

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