[IT-инфраструктура, Сетевые технологии, DevOps, Софт] Работа с пакетами в изолированной среде. Использование zfs datasets и jail’ов

Автор Сообщение
news_bot ®

Стаж: 6 лет 3 месяца
Сообщений: 27286

Создавать темы news_bot ® написал(а)
29-Апр-2021 18:31

В предыдущей статье мы рассказали, как работает система дистрибуции плагинов в новой версии ИКС. Сегодня речь пойдет о том, как разворачивать отдельно взятый плагин в системе.
Предпочтительнее всего, чтобы каждый плагин запускался в изолированной среде, подготовленной специально с учетом требований конкретного плагина. Причем, в среде, которая позволит взаимодействовать системе с плагином и плагинами между собой. Далее, для понимания, что это применимо к стандартной работе с пакетами, мы будем использовать термин “пакет”
Что выбрать?
Что используют для этого в большинстве случаев? Конечно, Docker!
pkg install docker
pkg: No packages available to install matching 'docker' have been found in the repositories

У Docker’а нет официальной поддержки FreeBSD, и такого пакета в репозитории конечно же нет. В предыдущей версии ИКС мы использовали неофициальный самописный порт docker’a, но его поддержка достаточно трудоемка, а кроме того всплывает немало подводных камней при его использовании.

Но у FreeBSD есть собственная, изначальная поддержка изолированных сред. Она называется jail и для наших целей подходит не хуже, чем docker. Стоит заметить, что она появилась намного раньше, чем контейнеры в Linux. Посмотрим как настраивается типичный контейнер (клетка в терминологии bsd).
Подготовка датасета и установка пакета
Прежде всего нужно создать датасет, на котором будет настроена клетка пакета. В нашей системе используется файловая система ZFS, которая позволяет создавать любое количество наследуемых датасетов.
По умолчанию в системе есть датасет с базовым миром (world) FreeBSD, от которого создаем снапшот (снимок):
zfs snapshot zp000111/freebsd@snap
zp000111 — это имя нашего корневого пула файловой системы. Мы можем посмотреть его через команду zfs mount. zp000111/freebsd — имя датасета, в котором хранится мир. Имя снимка указывается через символ @. Этот снимок мы создаем один раз и в дальнейшем все датасеты для пакетов будут наследоваться от него.
От этого снимка мы создаем клон, в котором будет жить наш пакет:
zfs clone zp000111/freebsd@snap zp000111/packets/<packet_name>
Предварительно сделаем монтирование датасета к текущей системе:
mount -t zfs zp000111/packets/<packet_name> /mnt/packets/<packet_name>
И теперь мы можем выполнить в него установку нужного пакета:
pkg -r /mnt/packets/<packet_name> install -y <packet_name>
Ключ -r обеспечивает установку внутрь указанной директории.
Если есть необходимость, можем установить другие нужные пакеты, например mc для удобной работы внутри пакета.
Выполняем размонтирование. Это не обязательно, но полезно, чтобы в дальнейшем пройти весь путь для запуска клетки:
umount /mnt/packets/<packet_name>
Подготовка клетки
Для начала необходимо определиться с хранением данных пакета в рабочей системе. Пусть это будет директория /usr/local/share/packets
Добавляем в нее директорию <packet_name>
mkdir /usr/local/share/packets/<packet_name>
Теперь создаем файл с точкой монтирования <packet_name>.fstab. В нем находится информация для клетки о том, какая директория в смонтированном датасете синхронизируется:
/usr/local/share/packets/<packet_name> /mnt/packets/<packet_name>/usr/local/share/data nullfs rw 0 0
Так мы сообщаем, что к директории в нашей рабочей системе будет подключена директория /usr/local/share/data в нашем примонтированном пакете. Это клетка (файловая система nullfs), разрешено как чтение, так и запись для обмена данными с внешней системой (rw), сохранение информации о файловой системе и проверка ее целостности не требуется (0 и 0).
Сохраняем файл в удобном месте, например в /usr/local/etc/packets/<packet_name>/<packet_name>.fstab
Теперь нам необходимо настроить конфигурационный файл для клетки нашего пакета.

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

SPL
host.hostname = "<packet_name>";
path = " /mnt/packets/<packet_name>";
interface = «em0»;
ip4.addr = 192.168.0.1;
allow.raw_sockets = 1;
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown;";
exec.clean;
enforce_statfs = 0;
mount.devfs;
mount.fstab = /usr/local/etc/packets/<packet_name>/<packet_name>.fstab;

В качестве интерфейса указываем одну из сетевых карт в системе. Присваиваем ему ip-адрес, который будет доступен снаружи. Также, для работы сетевых функций, таких как ping или traceroute разрешаем опцию allow.raw_sockets.
Раздел команд exec указывает какие команды выполнять для запуска и отключения системы внутри клетки. Поскольку это стандартный мир FreeBSD, то указываем базовые пути для включения и выключения системы.
Последними тремя опциями мы разрешаем монтирование внешних систем, подключаем физические устройства и монтируем во внешнюю папку нашу папку с данными внутри клетки согласно созданному файлу fstab.
Сохраняем наш файл в удобном месте, например в той же директории /usr/local/etc/packets/<packet_name>/<packet_name>.jail.conf
Монтирование пакета и запуск клетки
У нас все готово, чтобы запустить пакет в клетке. Начнем с того, что примонтируем датасет пакета:
mount -t zfs zp000111/packets/<packet_name> /mnt/packets/<packet_name>
Теперь можем запускать клетку:
jail -f /usr/local/etc/packets/<packet_name>/<packet_name>.jail.conf -c <packet_name>
Опцией -r мы указываем путь до конфигурационного файла, а -c что необходимо создать новую клетку с указанным именем.
Наша клетка запустилась, можем проверить это:
jls -j <packet_name>
Будет выведена строка с именем клетки и ее id в системе jail’ов.
Теперь, если нам необходимо войти в рабочую систему пакета, выполним команду:
jexec <jail_id> /bin/tcsh
Для остановки клетки и отмонтирования пакета выполняем обратные команды:
jail -f /usr/local/etc/packets/<packet_name>/<packet_name>.jail.conf -r <packet_name>
umount /mnt/packets/<packet_name>

Притом все данные, которые были сохранены пакетом в папке /usr/local/share/data своей файловой системы, будут доступны по пути /usr/local/share/packets/<packet_name> во внешней системе.
Итого
Таким образом, мы создали изолированную среду для нашего пакета.
Клетка снаружи будет пинговаться по указанному адресу, и, соответственно, все сетевые сервисы, поднятые в ней будут по нему также доступны. А поскольку пользовательские данные хранятся во внешней папке рабочей системы, то их легко хранить и резервировать.
Похожая система будет работать и в новых версиях ИКС, что сделает его использование еще более легким и приятным.
На этом на сегодня все, спасибо за внимание!
===========
Источник:
habr.com
===========

Похожие новости: Теги для поиска: #_itinfrastruktura (IT-инфраструктура), #_setevye_tehnologii (Сетевые технологии), #_devops, #_soft (Софт), #_internet_kontrol_server (интернет контроль сервер), #_iks (икс), #_freebsd, #_jail, #_zfs, #_zfs_datasets, #_blog_kompanii_internet_kontrol_server (
Блог компании Интернет Контроль Сервер
)
, #_itinfrastruktura (
IT-инфраструктура
)
, #_setevye_tehnologii (
Сетевые технологии
)
, #_devops, #_soft (
Софт
)
Профиль  ЛС 
Показать сообщения:     

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы

Текущее время: 22-Май 00:12
Часовой пояс: UTC + 5