Роса — это самостоятельный дистрибутив GNU/Linux, не основанный ни на одном другом дистрибутиве. Является продолжением развития дистрибутива Mandriva.
Модель обновление — полуроллинг: такие базовые компоненты, как glibc, gcc и др. не обновляются мажорно в рамках платформы (rosa2021.1, rosa2023.1), а пользовательские приложения (chromium, Firefox, Thunderbird, LibreOffice и др.) обновляются. Консерватизм условно средний.
Пакетный менеджер — dnf (до платформы rosa2016.1 включительно использовался унаследованный из Mandriva пакетный менеджер dnf, затем был осуществлен переход на rpm4 — смена пакетного менеджера без смены пакетной базы, своя собственная пакетная база продолжила развитие, дистрибутива ROSA не был и не стал колоном Fedora.
Низкоуровневый пакетный менеджер — rpm — той же ветки, что и в большинстве других дистрибутивов (Fedora, RHEL, openSUSE и др.). К стандартным макросам RPM добавляются макросы из rpm-rosa-setup — всегда установленного при сборке пакета — и других установленных пакетов с макросами.
После сборки пакеты попадают в репозиторий на abf-downloads.rosalinux.ru:
- для платформы rosa2021.1: https://abf-downloads.rosalinux.ru/rosa2021.1/repository/
- для платформы rosa2023.1: https://abf-downloads.rosalinux.ru/rosa2023.1/repository/
Затем, раз в несколько часов и если не установлено особой отметки не делать этого, происходит синхронизация на основное зеркало:
- для платформы rosa2021.1: https://mirror.rosalinux.ru/rosa/rosa2021.1/repository/
- для платформы rosa2023.1 зеркала пока нет, т.к. платформа находится в активной разработке и не выпущена.
Другие зеркала, например, http://mirror.yandex.ru/rosa синхронизируются с mirror.rosalinux.ru.
Репозиторий Росы делится на следующие компоненты:
- main — репозиторий самых важных пакетов, все пакеты в нем проходят тестирование при обновлении;
- contrib — обновления пакетов в нем не проходят тестирование;
- non-free — некоторые несвободные пакеты и блобы без исходников (драйверы nvidia в качестве исключения находятся в main вместо non-free для сборки бинарных модулей при сборке ядер), обновления проходят тестирование.
Раньше еще была комонента restricted, но начиная с платформы rosa2021.1 ее нет, она была соединена с main.
Для сборки пакетов используется среда обеспечения полного жизненного цикла дистрибутива ABF. Сайты abf.io и abf.rosalinux.ru являются одним и тем же.
Что делается на ABF:
- git-репозитории с исходными кодами пакетов (они размещены здесь: https://abf.io/import/);
- хранилище https://file-store.rosalinux.ru для хранением тарболлов и прочих исходников (чтобы не хранить большие файлы в git, они закачиваются на file-store, а в файл
.abf.yml
прописывается хеш-суммы файлов, которые при сборке пакета нужно взять с file-store); - сборка пакетов;
- публикация результатов сборки (в репозитории на abf-downloads.rosalinux.ru);
- сборка ISO-образов, тарболлов rootfs и др. (официальные установочные образы собираются на ABF: https://abf.io/product_build_lists);
- служба https://repoclosure.rosalinux.ru — наглядная визуализация вывода команда
dnf repoclosure
с результами проверки репозиториев на замкнутость зависимостей.
Сборка пакета на ABF происходит примерно следующим образом:
- сборочному агенты (билдеры) от управляющего сервера поступает задание взять такой-то git, из такого-то хеша коммита или ветки, и собрать пакет для такой-то платформы (rosa2021.1, rosa2023.1);
- сборочный агент получает задание и:
- выкачивает git (abf.io/import/xxx)
- выкачивает все прописанные в
.abf.yml
файлы с file-store и кладет их в такое место, где rpmbuild ищет всеSource*
из спека, то есть в тот же каталог, что и содержимое скачанного git - запускает утилиту mock, которая:
- создает чистый чрут, т.е. минимальное окружение;
- устанавливает в него сборочные зависимости;
- собирает SRPM и RPM с помощью rpmbuild (это часть rpm);
- сборочный агент загружает результаты сборки — пакеты SRPM и RPM — на file-store;
- управляющему серверу отдается мета-информация, включая хеши загруженных на file-store пакетов.
Затем система публикации пакетов может положить их в репозиторий, удалив из него пакеты, собранные в предыдущей сборке этого же проекта.
Работать с ABF можно как через веб-интерфейс, так и по API, в т.ч. через консольный клиент.
Рассмотрим, как быстро сделать контейнер с Росой, чтобы собирать пакеты в отдельном изолированном окружении. В качестве хостовой ОС может быть любой Linux с ядром >= 4.14, в т.ч. сама Роса.
Скачиваем последнюю сборку rootfs для x86_64:
- rosa2021.1: https://abf.io/platforms/rosa2021.1/products/284
- rosa2023.1: https://abf.io/platforms/rosa2023.1/products/408
Для других архитектур см. здесь: https://abf.io/platforms/rosa2021.1/products и https://abf.io/platforms/rosa2023.1/products
Для скачивания нажимаем на номер сборки и затем скачиваем архив из ссылок на результаты сборки.
Допустим, скачан файл rootfs-std-rosa2021.1_x86_64_2023-04-06.tar.xz
.
Необходима утилита systemd-nspawn
. В некоторых дистрибутивах, например, rosa2021.1, она входит в пакет systemd, в некоторых (Debian, Ubuntu, ALT) есть отдельный пакет systemd-container
, который нужно установить на хост.
Теперь нужно распаковать архив и войти в чрут:
sudo -i
cd /var/lib/machines
mkdir rosa2021.1
cd rosa2021.1
tar -xf rootfs-std-rosa2021.1_x86_64_2023-04-06.tar.xz
Получится файловая система Росы в /var/lib/machines/rosa2021.1/
. Заходим в шелл:
sudo systemd-nspawn -D /var/lib/machines/rosa2021.1
.
Можно использовать snr (есть в репозиториях Росы и Альта) для сокращения команды входа до snr rosa2021.1
и чтобы сразу работала возможность запускать графические программы изнутри контейнера, что удобно для проверки результатов сборки.
Описанные ниже команды можно выполнять в этом шелле.
Здесь и далее через sudo пишутся команды, которые обязательно выполнить с root-правами, не обязательно именно через sudo.
Во время сборки пакета ABF не делает чего-либо, что нельзя было бы сделать у себя на компьютере без него. Рассмотрим сборку пакета локально через rpmbuild. mock — слой абстракции над rpmbuild — пока что не будем рассматривать.
Вам потребуется либо установленная на железо ОС ROSA, либо виртуальная машина с ней, либо chroot/контейнер.
Установим необходимые пакеты:
sudo dnf install basesystem-build abf git-core /usr/bin/mbd /usr/bin/spectool createrepo_c
- basesystem-build — мета-пакет, по зависимостям притягивающее пакеты, которые на ABF есть в чруте при сборке каждого пакета (rpm-build, gcc и т.д.);
- abf — сокращение (провайд) abf-console-client — консольного клиента ABF;
- /usr/bin/mbd (rpm-mk-build-deps) — простой скрипт, который собирает пакет-заглушку, превращая BuildRequires в RPM-спеке в Requires (зависимости) этого пакета-заглушки; установка такого пакета подтягивает сборочные зависимости, а его удаление автоматически удаляет их как сироты (в dnf хорошо работает механизм удаления сирот (autoremove));
- spectool — утилита для, например, скачивания исходников;
- createrepo_c — утилита для создания метаданных репозитория.
Для начала пересоберем какой-нибудь пакет с минимальной правкой — поднятием релиза.
Заходим на https://abf.io/import/OpenBoard и копируем ссылку на клонирование git:
Выполняем: git clone -b rosa2021.1 https://abf.io/import/OpenBoard.git
Ветки в git совпадают с названием платформы. В веб-интерфейсе переключение веток справа вверху:
Ветка master не используется.
Переходим в каталог со скачанным git: cd OpenBoard
Редактируем спек, поднимаем Release. В git diff
видим правку.
Делаем пакет-заглушку для подтягивания сборочных зависимостей: mbd *.spec
, ставим его: sudo dnf in *.rpm
. Можете попробовать сделать sudo dnf rm OpenBoard-build-deps
, чтобы посмотреть, как все подтянутые им сборочные зависимости удалятся вместе с ним.
Запускаем сборку: abf rpmbuild
. Это примерно то же самое, что сначала выполнить abf fetch
для скачивания прописанных в .abf.yml
исходников с file-store, а затем rpmbuild --define "_sourcedir $PWD" -bb *.spec
для сборки пакета. При первом запуске abf-клиент попросит задать параметры, можно просто везде нажать Enter, а затем поправить их в ~/.abfcfg
или просто удалить этот файл, чтобы он снова задал вопросы.
Теперь красиво установим собранный пакет, более красиво, чем sudo dnf install пакет.rpm
. Обычно такая красота излишня, но покажу для примера. После abf rpmbuild
результаты сборки лежат прямо в текущем каталоге. Создадим в ней метаданные репозитория, запустив: createrepo_c .
Теперь запустим обновление системы с подключением этого репозитория:
sudo dnf --nogpgcheck --repofrompath x,$PWD upgrade
Вместо upgrade
можно написать, например, install OpenBoard
.
Поздравляю с первым собранным пакетом! Теперь соберем его через mock:
abf rpmbuild -bs
mock *.src.rpm
Если запускаете mock не от root, то можно добавить пользователя в группу mock
(sudo usermod -a -G mock username
), чтобы не спрашивало пароль.
Через git clean -fd
можно удалить весь скопившийся мусор (в т.ч. результаты сборки).
Как работает ABF, описано выше, перечитайте.
Зарегистрируйтесь на ABF по ссылке-приглашению. Нажмите на имя пользователя справа вверху, зайдите в настройки (Settings) и выберите в них русский язык, сохраните.
Откройте раздел SSH-ключей на ABF, добавьте свой публичный ключ. Если у вас нет ключевой пары, то создайте её командой ssh-keygen
, а на ABF вставьте публичный ключ, т.е. вывод команды cat ~/.ssh/id_rsa.pub
.
Теперь форкните проект из репозитория Росы (т.е. из abf.io/import). Для этого зайдите на страницу проекта (https://abf.io/import/OpenBoard) и воспользуйтесь синей кнопкой "Клонировать".
Вы попадете в свой форк по адресу abf.io/ваше_имя_пользователя/OpenBoard
. Откройте настройки проекта и укажите ветку git по умолчанию, например, rosa2023.1
. Пулл-реквесты следует отправлять в наиболее новую платформу Росы (на момент апреля 2023 г. в разработке находится платформа rosa2023.1, а rosa2021.1 перешла на консервативную политику обновлений).
Вверху выберите показывание ссылки для клонирования git по SSH. Скопируйте ссылку и выполните клонирование:
git clone [email protected]:ваше_имя_пользователя/OpenBoard.git -b rosa2023.1
Перейдите в каталог: cd OpenBoard
Теперь можно вносить правки и собирать пакет локально, как описано выше.
Внесите правки. Через git diff
посмотрите их. Закоммитьте их через git commit -a
. Отправьте их на сервер через git push
. В веб-интерфейсе увидите свой коммит.
Для обновления версии пакета:
- поменяйте Version в спеке;
- сбросьте Release до 1;
- проверьте раскрываемость спека через
rpmspec -P *.spec
; в некоторых проектах, например, https://abf.io/import/libreoffice, нужно сделать так:rpmspec --define "_sourcedir $PWD" -P *.spec
; - скачайте тарболл новой версии, выполнив
spectool -g *.spec
, что подставит макросы, в т.ч.%{version}
, в ссылку (ссылки) на Source в спеке и скачает их по получившимся после подставновки ссылкам; - загрузите исходники на file-store:
abf put -n
; в большинстве случаев старая версия автоматически удалится из.abf.yml
, но иногда автоматика не срабатывает, тогда удалите лишние строки вручную и проверьте правильность правок черезgit diff
; - проверьте корректность распаковки исходников, выполнив
abf rpmbuild -bp
илиrpmbuild --define "_sourcedir $PWD" -bp *.spec
; - закоммитьте (git commit) правки и отправьте их на сервер (git push).
Обратите внимание, что в Source в спеке обычно прописывается полная ссылка на файл так, чтобы при изменении версии было достаточно поменять Version, а ссылка за счет макроса стала бы вести на исходник новой версии, что позволяет просто скачать файл по ссылке и залить его на file-store. При сборке пакета rpmbuild отбрасывает все части до последнего слеша (/
) включительно и ищет файл с получившимся именем в %_sourcedir
(пример пробразования: http://nixtux.ru/proga/proga-x.tar.gz
-> proga-x.tar.gz
). abf fetch
/ abf rpmbuild
/ билдер ABF выкачивают прописанное в .abf.yml
в %_sourcedir
, там самым обеспечивая наличие прописанных в Source файлов без доступа в интернет.
Теперь нажмите кнопку запуска сборки в веб-интерфейсе. В открывшейся форме запуск сборки отметьте галками main и contrib rosa2023.1 и/или rosa2021.1, архитектуры aarch64 и x86_64, запустите сборку. В билд-листе наблюдайте живой лог сборки и ее результаты. Для первой сборки уберите подключение репозитория ваше_имя_пользователя_personal
нажатием на крестик.
Кнопка создания контейнера (также при запуске есть галка для автоматического создания контейнера) создает контейнер — репозиторий из результатов сборки. Его можно использовать, например, так: sudo dnf --nogpgcheck --repofrompath o,http://ссылка-на-контейнер up OpenBoard
. Также пакеты можно просто скачивать с file-store. При скачивании консольными инструментами обратите внимание на wget --content-disposition
, чтобы имя файла автоматически выставлялось правильно. У wget в репозиториях Росы ключ --content-disposition
включен по умолчанию, т.е. прописывать его не обязательно.
Нажмите кнопку публикации сборки. Найдите пакет в репозитории по адресу http://abf-downloads.rosalinux.ru/ваше_имя_пользователя_personal/
.
Если сборки прошли успешно, а пакет работает, можно сделать пулл-реквест в rosa2023.1, а в rosa2021.1 сотрудники Росы сами смержат, соберут и отправят на тестирование, если пакет в main, а если в contrib, то просто сразу опубликуют его.