Создание собственных модулей
Создание модулей позволяет избежать расходования оперативной памяти на установку ПО через dnf, а также обеспечивает удобный перенос установленного ПО между различными машинами.
Выбор конкретной утилиты для создания модулей зависит от задачи и используемой при загрузке технологии объединения файловых систем:
aufs– обладает расширенной функциональностью, но не включена в основную ветку ядра Linux.- overlayfs – используется по умолчанию, так как является частью стандартного ядра.
Squashfs-архивы создаются утилитой mksquashfs из пакета squahfs-tools, и модули вполне можно сделать, имея только mksquashfs, но для большего удобства подготовлено несколько утилит в составе barium-utils.
Утилита barium mkmod
Основное назначение утилиты barium mkmod – создание модуля из указанной папки с файлами. Для этого файлы располагаются в каталоге с путями относительно корня, после чего выполняется команда:
barium mkmod mymodule
В результате создается модуль mymodule.xzm, который можно использовать в Системе. Этот метод удобен для упаковки пользовательских скриптов и конфигурационных файлов.
Дополнительно barium mkmod поддерживает:
- объединение нескольких модулей в один;
- создание модуля сразу из нескольких каталогов.
Пример создания модуля
Предполагается наличие двух файлов — исполняемой программы и её конфигурационного файла. В Системе эти файлы должны размещаться по следующим путям:
/usr/bin/example_programm
/etc/example_programm.d/example_programm.conf
Для создания модуля в barium mkmod необходимо выполнить следующие шаги:
- Необходимо создать структуру для будущего модуля. Сначала создается папка с именем будущего модуля:
mkdir ./example_programm
- Внутри этой папки создать необходимые каталоги. Важно учитывать права доступа и владельца каталогов: для системных папок обычно достаточно создавать их от имени пользователя root:
mkdir -p ./example_programm/usr/bin
mkdir -p ./example_programm/etc/example_programm.d
- Выполнить копирование файлов в соответствующие папки. Допустим, они уже находятся в текущем каталоге:
cp ./example_programm ./example_programm/usr/bin/
cp ./example_programm.conf ./example_programm/etc/example_programm.d/
- Необходимо упаковать файлы в модуль:
barium mkmod ./example_programm
В результате будет создан модуль ./example_programm.xzm. При его подключении файлы автоматически окажутся в Системе в требуемых подкаталогах.
Модули монтируются только в режиме "только для чтения" (read-only, RO), поэтому их нельзя редактировать напрямую. Если необходимо внести изменения, модуль придётся пересобрать.
Если же требуется добавить новый файл в уже существующий модуль, можно воспользоваться режимом склейки (merge) утилиты barium mkmod:
mkdir -p ./example_programm2/etc/skel/.config/
cp example_programm.conf ./example_programm2/etc/skel/.config/
barium mkmod ./example_programm2 ./example_programm.xzm -o example_programm2.xzm
Таким образом, новый модуль example_programm2.xzm будет содержать все файлы из оригинального example_programm.xzm, а также добавленный файл example_programm.conf.
Для получения более детальной информации можно воспользоваться встроенной справкой с помощью команды:
barium mkmod --help
Утилита barium dnf2mod
Утилита barium dnf2mod является наиболее удобным способом сборки модулей при условии, что необходимое программное обеспечение доступно в репозитории или имеется в виде локального RPM-пакета с возможностью разрешения зависимостей через репозиторий.
Основной принцип работы заключается в установке запрашиваемых пакетов с их зависимостями в создаваемый модуль. После установки из модуля удаляются базы rpm, dnf и кеши, поэтому подключение модуля не изменяет базу RPM, и пакеты не регистрируются как установленные в Системе. Это позволяет избежать инкрементных зависимостей между модулями.
Пример создания модуля с barium dnf2mod с текстовым редактором nano:
barium dnf2mod nano
При подключении модуля nano.xzm редактор nano будет доступен в Системе.
Также возможно объединение нескольких пакетов в один модуль:
barium dnf2mod nano mc busybox
Такой подход позволяет минимизировать дублирование библиотек и снизить нагрузку на Систему при подключении модулей.
Если необходимо пересобрать модуль с обновлёнными пакетами, достаточно выполнить:
barium dnf2mod ./nano.xzm
Утилита пересоберёт модуль на основе параметров предыдущей версии, но с актуальными пакетами из репозитория.
Дополнительные возможности при использовании barium dnf2mod:
- Использование системных настроек и кешей dnf при сборке модуля с флагом -c.По умолчанию barium dnf2mod устанавливает пакеты в чистую среду без учета настроек dnf, которые есть в Системе. Однако, если указать флаг -c, утилита будет использовать уже существующие настройки и кеши dnf, что может ускорить процесс установки, если пакеты ранее уже загружались в кеш;
- Передача дополнительных параметров
dnfчерез ключ—dnf, который позволяет передавать утилитеdnfдополнительные аргументы. Например, команда:
barium dnf2mod --dnf --repofrompath=myrepo,http://example.com/repo nano
- указывает
dnf, что необходимо использовать репозиторий, расположенный по адресуhttp://example.com/repo, и устанавливать пакетnanoименно из него. Это может быть полезно, если нужный пакет отсутствует в стандартных репозиториях; - Возможность выборочного обновления пакетов без ожидания обновления всей Системы. Например, если модуль
nano.xzmуже существует, командаbarium dnf2mod nano.xzmсоздаст новую версию модуля с последними доступными пакетами из репозитория, без необходимости обновлять всю Систему. Это удобно для точечного обновления отдельных программ.
Модули, собранные с barium dnf2mod, зависят только от двух базовых системных модулей:
00-basesys.trm.xzm;10-extsys.xzm.
Это обеспечивает независимость модулей и возможность их удаления без нарушения работы Системы.
Утилита barium chroot2mod
Эта утилита позволяет упаковывать в модуль любые изменения, сделанные в chroot-окружении, включая установку программ через dnf install.
Пример создания модуля с использованием утилиты barium chroot2mod и текстового редактора nano:
barium chroot2mod -o nano.xzm --command "dnf install -y nano"
В отличие от barium dnf2mod, модули, собранные таким способом, сохраняют rpm-базу, что делает утилиту более универсальной.
Также можно использовать скрипты для автоматизированной установки ПО и удаления ненужных данных:
barium chroot2mod -o nano.xzm --script ./nano.sh
где nano.sh содержит:
dnf install -y nano
dnf clean all
rm -rf /var/lib/rpm
rm -rf /var/lib/dnf
Такой подход позволяет загружать и устанавливать ПО без зависимости от репозитория.
Кроме того, barium chroot2mod поддерживает пересборку модулей, в том числе системных:
barium chroot2mod /.memory/layer-base/0/base/cups.xzm
Этот метод широко используется для сборки всех модулей ОС, кроме базовых системных компонентов.
Утилита barium chroot2mod
Утилита barium chroot2mod предназначена для создания модулей на основе изменений, внесённых в корневую файловую систему (rootfs) в chroot-окружении. Эти изменения могут быть результатом выполнения команд, скриптов или ручных действий пользователя в терминале. Rootfs для chroot при этом формируется из базовых модулей Системы.
Простейший пример использования — установка текстового редактора nano в модуль:
barium chroot2mod -o nano.xzm --command "dnf install -y nano"
В отличие от barium dnf2mod, данная утилита не удаляет кеши, базы rpm и dnf, что делает её более универсальной. Это позволяет, например, пересобирать модули с сохранением информации о пакетах.
При работе с barium chroot2mod возможно использование скриптов для автоматизированной сборки. Вместо указания команды можно передать скрипт с инструкциями по установке и очистке Системы:
barium chroot2mod -o nano.xzm --script ./nano.sh
Пример содержимого файла nano.sh:
#!/bin/bash
dnf install -y nano
dnf clean all
rm -rf /var/lib/rpm
rm -rf /var/lib/dnf
Этот подход позволяет устанавливать ПО без зависимости от репозиториев, а также минимизировать размер итогового модуля за счёт удаления временных файлов.
Если для сборки модуля требуются файлы, находящиеся вне chroot-окружения, используется параметр --bind. Он позволяет примонтировать внешние каталоги внутрь chroot. Формат параметра:
--bind внешний_путь:внутренний_путь
В таком случае вместо --script указывается --command, которая будет исполняться внутри chroot-среды.
Пример сборки модуля с Yandex Browser:
- Создать папку, в которую поместить
yandex-browser.rpm, а также создать скриптyb.sh:
cd $(dirname $0) # переходим в каталог со скриптом
dnf install -y ./yandex-browser.rpm
dnf clean all
rm -rf /var/cache/dnf
- Сделать скрипт исполняемым:
chmod +x yb.sh
- Запустить процесс сборки:
barium chroot2mod -o yandex-browser.xzm --bind ./::/var/lib/YB --command /var/lib/YB/yb.sh
Пересборка модулей
Как и barium dnf2mod, утилита barium chroot2mod сохраняет параметры сборки внутри модуля. Однако пересобрать можно только модули, которые были созданы без локальных файлов (то есть без использования --bind).
Пересборка выполняется командой:
barium chroot2mod ./nano.xzm
Если требуется периодически пересобирать модуль, удобнее использовать параметр --project. Проектом называется каталог, содержащий все необходимые файлы для сборки, включая сценарий build.c2m. Этот файл представляет собой скрипт, содержащий инструкции по сборке и установке компонентов.
Пример вызова:
barium chroot2mod --project ./project_dir
Пример содержимого build.c2m для сборки модуля КонтинентАП:
#!/bin/bash
cd $(dirname $0) # делаем текущей папку с build.c2m и cts.rpm
dnf install ./cts* # устанавливаем локальный rpm-файл cts и его зависимости
systemctl enable cts # включаем сервис cts по умолчанию
Использование --project позволяет легко управлять сборками, хранить их в виде отдельных директорий и быстро обновлять модули при необходимости.
Утилита barium diff-changes
Утилита barium diff-changes предназначена для отслеживания изменений в системе и создания модулей, содержащих только эти изменения. В отличие от barium chroot2mod, данный метод менее предсказуем, так как фоновые процессы также могут вносить изменения в Систему, что не всегда удаётся проконтролировать. Однако утилита может быть полезна в случаях, когда программа не имеет пакетного установщика и доступна только в виде графического установщика.
Процесс работы с barium diff-changes состоит из трёх шагов:
- Перед началом установки или настройки программы создаётся контрольная точка, фиксирующая текущее состояние файловой системы:
barium diff-changes
- Выполнение необходимых действий. На этом этапе производится установка и настройка нужного ПО, например, в среде ОС РОСА "ХРОМ".
- После завершения установки выполняется анализ изменений и упаковка их в модуль:
barium diff-changes -d -m
-d — рассчитывает разницу между текущим состоянием Системы и контрольной точкой;
-m — создаёт модуль, содержащий новые и изменённые файлы.
Если в Системе создано несколько контрольных точек, необходимо явно указать, с какой из них работать, с помощью ключа -i. При создании контрольной точки ей можно задать имя, тогда итоговый модуль будет иметь соответствующее название.
Пример:
barium diff-changes -p -i yandex-browser
dnf install -y ./yandex-browser.rpm
dnf clean all
barium diff-changes -i yandex-browser -d -m new
где:
-p — создаёт именованную контрольную точку;
-i yandex-browser — указывает, что анализируется разница относительно этой контрольной точки;
-m new — создаёт модуль, содержащий только новые файлы (игнорируя изменённые).
Стоит отметить, что в данном примере правильнее использовать barium chroot2mod, так как он позволяет точнее контролировать процесс установки.
Решение возможных проблем
В некоторых случаях при некорректном завершении работы сборочных утилит могут оставаться артефакты монтирования. Это может привести к невозможности сборки новых модулей. В таких ситуациях следует выполнить очистку с помощью:
barium lib clear
Эта команда удалит оставшиеся точки монтирования и временные файлы, позволяя продолжить работу с утилитами без необходимости ручной очистки Системы.