Как стать автором
Обновить
0
Интернет Контроль Сервер
Универсальный инструмент системного администратора

Работа с пакетами в изолированной среде. Использование zfs datasets и jail’ов

Время на прочтение4 мин
Количество просмотров2.4K
В предыдущей статье мы рассказали, как работает система дистрибуции плагинов в новой версии ИКС. Сегодня речь пойдет о том, как разворачивать отдельно взятый плагин в системе.
Предпочтительнее всего, чтобы каждый плагин запускался в изолированной среде, подготовленной специально с учетом требований конкретного плагина. Причем, в среде, которая позволит взаимодействовать системе с плагином и плагинами между собой. Далее, для понимания, что это применимо к стандартной работе с пакетами, мы будем использовать термин “пакет”.

Что выбрать?


Что используют для этого в большинстве случаев? Конечно, 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

Теперь нам необходимо настроить конфигурационный файл для клетки нашего пакета.

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

Итого


Таким образом, мы создали изолированную среду для нашего пакета.

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

Похожая система будет работать и в новых версиях ИКС, что сделает его использование еще более легким и приятным.

На этом на сегодня все, спасибо за внимание!
Теги:
Хабы:
Всего голосов 5: ↑5 и ↓0+5
Комментарии2

Публикации

Информация

Сайт
xserver.a-real.ru
Дата регистрации
Дата основания
Численность
11–30 человек
Местоположение
Россия