Содержание

Локальная сборка ISO

Введение

Данная статья описывает процесс сборки ISO-образов ROSA Fresh/Хром с помощью публично доступных скриптов, которыми собираются официальные релизные установочные образы.

Скрипты сборки ISO-образов находятся здесь: https://abf.io/soft/rosa-build-iso

Также имеются скрипты сборки rootfs, но эта статья описывает только лишь сборку ISO.

Статья описывает работу со скриптами rosa-build-iso, собирающими образы на основе платформ rosa2021.1 и rosa2023.1, а скрипты сборки ISO на основе старых платформ (rosa2014.1, rosa2016.1) описаны в последнем разделе этой статьи.

Подготовка рабочего окружения

Рассмотрим подготовку рабочего места оператора сборки ISO-образа.

Для сборки необходимо следующее окружение:

Возможны следующие варианты среды сборки:

В процессе сборки монтируются loop-устройства, поэтому запускать сборку лучше либо на железе, либо в виртуальной машине, однако можно и в контейнере, если пробросить в него /dev/loop*, что бывает проблематично.

Пример запуска systemd-nspawn для сборки в контейнере на базе rootfs Росы:

sudo systemd-nspawn -D /путь/к/распакованной/rootfs --capability=CAP_MKNOD --property='DeviceAllow=/dev/loop0 rwm' -b

А внутри контейнера сделать:

mknod /dev/loop0 b 7 0

При использовании ВМ или запуске на железе манипуляции с mknod проделывать не нужно.

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

Необходимо скачать скрипты сборки:

git clone https://abf.io/soft/rosa-build-iso.git

Если программа git не установлена, то установите ее:

sudo dnf install git-core

Если при сборке параметрами указываются номера контейнеров на ABF (ADD_REPOS="номер номер..."), то должна быть установлена переменная окружения API_TOKEN=API-ключ_ABF, ключ можно взять из персональных настроек ABF: https://abf.io/settings/private

Запуск скрипта производится от root, параметры описаны ниже, пример запуска:

cd rosa-build-iso
sudo DE=plasma5 BUILD_ID=001 API_TOKEN=xxx DISTROSYNC=0 ./build-iso-abf.sh

Обратите внимание, что, если вы находитесь в не-root консоли и установите относящиеся к скрипту сборки переменные окружения через export VAR=value, то они не попадут в скрипт. При запуске приведенном выше способом — указании всех параметров после слова "sudo" — попадут.

Этапы сборки ISO

Установка ОС производится программой установки Anaconda путем rsync содержимого squashfs и удаления лишнего (например, самой Anaconda).

Формирование конфига сборки образа

Программа livecd-creator из пакета livecd-tools на вход получает файл в формате kickstart, в котором заданы все настройки сборки образа, пакеты и выполняемые до и после сборки скрипты.

Скрипт build-iso-abf.sh подставляет значения @переменных@ в файл template.ks. Изменения в файлы в текущем рабочем каталоге не вносятся, создается копия всех файлов, что позволяет удобно работать с git.

Из каталога packages/ берется файл pkgs-$DE.ks со списком пакетов.

Из каталога repos/ берется файл repos-$ARCH.ks со списком используемых для сборки образа репозиториев (источников).

Из файла DEs/$DE/head.ks берутся такие настройки сборки образа, как размер squashfs, часовой пояс, язык и раскладка клавиатуры по умолчанию и др.

Из файла DEs/$DE/post.ks берутся скрипты, которые запускаются внутри chroot после установки пакетов.

Параметры скрипта сборки

Все параметры скрипта сборки передаются переменными окружения. Если какой-либо параметр не задан, то используется его значение по умолчанию. Рекомендуется ознакомиться с кодом build-iso-abf.sh, все параметры с пояснениями перечислены в начале скрипта. Ниже будет рассмотрено большинство параметров, однако актуальность этой документации не гарантируется, рекомендуется смотреть в код.

ABF

Если 1, то mirror.rosalab.ru заменяется на abf-downloads.rosalinux.ru в /etc/yum.repos.d/*

RESULTS_DIR

Путь к каталогу, куда положить результирующий ISO-образ. По умолчанию (если не задано иное) это /home/vagrant/results (такой путь по историческим причинам).

BUILD_ID

ID сборки. Может содержать в себе любые латинские буквы и цифры. ABF сам выставляет значением BUILD_ID внутренний номер сборки. При создании своих сборок вы можете придумать свою систему идентификаторов. Обратите внимание, что BUILD_ID попадает в название образа, которое может быть не длиннее 32 символов. Ищите "FS_LABEL" в коде скрипта сборки. Также BUILD_ID попадает в мета-пакет rosa-iso-info.

PLATFORM

Платформа, на базе которой собирать образ: rosa2021.1, rosa2023.1

DE

Графическое окружение. Значение может быть в любом регистре (маленькими или большими буквами). Возможные варианты см. в каталоге "DEs" в rosa-build-iso. DE=server — вариант без графической оболочки.

ARCH

Целевая архитектура. Значение по умолчанию: x86_64. Возможные значения:

На архитектуре x86_64 возможна сборка образов под x86_64 и i686. В остальных случаях для сборки под иную, чем хостовые железо и ОС, архитектуры, можно использовать qemu и binfmt путем установки пакета qemu-*-static, который автоматически настроит binfmt. При использовании qemu возможны проблемы с монтированием loop-устройств.

FILTER_PACKAGES

Исключить перечисленные через пробел пакеты из образа, если они прописаны в списке пакетов или попадают по зависимостям. Примеры:

ADD_PACKAGES

Добавить дополнительные, перечисленные через пробел пакеты. Примеры:

ADD_REPOS

Добавить дополнительные репозитории в качестве источников для попадающих в образ пакетов (обратите внимание, что внутри ОС репозитории прописаны в пакете rosa-repos и не связаны с использованными для сборки образа репозиториями).

Добавляемые репозитории перечисляются через пробел.

Возможные варианты:

ADD_REPOS_INTO_ISO

ENABLE_CONTRIB_REPOS

ENABLE_TESTING_REPOS

DISABLE_STANDARD_REPOS

BRANDING

Какой брендинг (файл /etc/os-release и пр.) использовать. Значение по умолчанию: fresh. Допустимо значение "chrome" или иное при наличии соответствующего пакета в подключенных источниках.

DISTROSYNC

Выполнять ли dnf distro-sync в хостовой ОС перед началом сборки.

Рекомендуется установить DISTROSYNC=0 при запуске на рабочем компьютере.

CLEANUP

CUSTOMIZATION_FEATURES

Перечисленные через пробел customization/features/* для подключения. Примеры:

LIVECD_CREATOR_EXTRA_ARGS

Дополнительные параметры livecd-creator. Например, можно указать путь к кешу, чтобы при повторных сборках образа не скачивать пакеты заново:

LIVECD_CREATOR_EXTRA_ARGS="--cache=/var/tmp/livecd-creator-cache"

Из каталога кеша можно удалять только относящиеся к конкретному репозиторию файлы, чтобы при следующем запуске они были скачаны заново вместе с новыми метаданными репозитория, а файлы из остальных репозиториев не скачивались заново. Также можно удалить конкретные rpm из кеша, тогда они будут скачаны заново, актуальной версии.

Сборка образа с таблицей разделов gpt2 ("uefi"):

LIVECD_CREATOR_EXTRA_ARGS="--isotype=gpt2"

Сборка образа с таблицей разделов mbr2 (по умолчанию):

LIVECD_CREATOR_EXTRA_ARGS="--isotype=mbr2"

LIVECD_CREATOR_COMPRESSION

Сжатие squashfs (см. раздел "Этапы сборки ISO"). По умолчанию используется zstd, что позволяет достичь оптимальный баланс между размером образа, скоростью запуска и установки ОС в LiveCD и скоростью сборки образа. Можно установить LIVECD_CREATOR_COMPRESSION=xz для уменьшения размера образа.

STRACE

SLEEP

Количество секунд задержки сразу после запуска скрипта. По умолчанию 0.

TMPFS

FORCE_C_LOCALE

DNF_IN_OPTS

Дополнительные параметры запуска dnf при установке утилит для сборки образа в хостовую ОС. Позволяет, например, указать дополнительный репозиторий с обновлением livecd-tools. Пример:

DNF_IN_OPTS="--nogpgcheck --repofrompath abf-user,http://abf-downloads.rosalinux.ru/abf-user_personal/repository/rosa2021.1/x86_64/main/release/"

TMPFS_SIZE

Размер tmpfs. По умолчанию 30 ГБ. Актуально только при TMPFS=1.

FORCE_RECOMMENDS

Мета-пакет rosa-iso-info

При сборке образа создается RPM-пакет rosa-iso-info, в который попадает информация о данной сборке. Этот пакет устанавливается в образ и сохраняется после установки системы из него. Сборка производится по спеку rosa-iso-info.spec.

В этом пакете в виде и Provides, и файла /var/lib/rosa-iso-info сохраняется следующая информация:

Примеры запроса информации из этого пакета:

$ rpm -qi rosa-iso-info
Name        : rosa-iso-info
Version     : 202110
Release     : 43195
DistTag     : rosa2021.1
Architecture: noarch
Install Date: Вс 17 апр 2022 17:57:58
Group       : System/Base
Size        : 61
License     : Public Domain
Signature   : (none)
Source RPM  : rosa-iso-info-202110-43195.src.rpm
Build Date  : Вс 17 апр 2022 15:08:34
Build Host  : 0f8117f279f7
Vendor      : ROSA
Bug URL     : http://bugzilla.rosalinux.ru
Summary     : Information about which ISO image this OS was installed from
Description :
Information about which ISO image this OS was installed from
$ rpm -ql rosa-iso-info
/var/lib/rosa-iso-info
$ cat /var/lib/rosa-iso-info
BUILD_ID=43195
BUILD_TIME=1650197314
DE=xfce
PLATFORM=202110
$ . /var/lib/rosa-iso-info && echo $DE
xfce
$ rpm -q rosa-iso-info --provides
rosa-iso-info = 202110-43195
rosa-iso-info(buildid) = 43195
rosa-iso-info(buildtime) = 1650197314
rosa-iso-info(de) = xfce
rosa-iso-info(platform) = 202110

Пример использования в boolean-зависимостях пакетов:

Requires: (foo if rosa-iso-info(buildid) >= 555)

Данный пакет отсутствует в репозитории, а значит не будет обновляться, что позволяет сохранять и получать информацию именно о том образе, с которого была поставлена система.

Customization features

О c/f

В каталоге customizations/features можно создавать набор инструкций с дополнительными изменениями в образе. Для краткости будем называть их c/f.

Структура каталога customizations/features/xxx (все перечисленные файлы необязательны):

Ниже описаны имеющиеся c/f, однако актуальность документации не гарантируется, смотрите код.

ad-client-sssd

Автоматически ввести LiveCD в домен AD с использованием sssd. Пример сценария использования:

auto-kickstart

Автоматически установить систему по kistart-файлу (см. статью Anaconda).

empty-root-password

Сделать пароль root в LiveCD пустым.

freeipa

Автоматически запускающийся в LiveCD контроллер домена FreeIPA.

iso-builder

Включить в образ необходимые для запуска этих скриптов пакеты.

mini-vm

Собрать образ без инсталлятора Anaconda, linux-firmware и лишних локалей.

mini-locales

Собрать образ без task-locales, т.е. без установки множества пакетов locales-* (лишние удаляются Анакондой после установки ОС), но с locales-en и locales-ru.

samba-ad

Автоматически запускающийся в LiveCD контроллер домена Samba AD. Использует встроенный в Samba DNS-сервер.

samba-ad-bind

Автоматически запускающийся в LiveCD контроллер домена Samba AD. Использует DNS-сервер bind.

sddm

Сборка образа с SDDM вместо GDM.

small-grub-timeout

Уменьшить таймауты в пунктах меню Grub в LiveCD с 10 сек до 1 сек, чтобы LiveCD запускался быстрее.

ssh-server

Пример использования приватного ключа:

ssh -i sshkey root@ip

tablet

Оптимизация и хаки для лучшей работы на планшетах (тачскринах).

Сборка ISO на базе устаревших платформ (rosa2016.1, rosa2014.1)

Если вам хочется собрать собственный ISO-образ Росы, а доступа для сборки образов на ABF нет, можно собрать образ на локальной машине.

Если нужна сборка корневой системы, а не ISO-образа, то см. статью "Образ rootfs".

Особых требований к системе, на которой запускается сборка, нет, единственное, что мешает ее запускать на дистрибутивах GNU/Linux, отличных от ROSA — это прямой вызов urpmi для создания базового chroot.

Для сборки используются специальные проекты, хранящиеся в Git-репозиториях на ABF и включающие в себя все необходимые для сборки скрипты и вспомогательные файлы. На текущий момент поддерживаются следующие проекты:

В каждом репозитории могут быть несколько веток. Основная ветка имеет имя актуальной платформы (rosa2016.1); могут присутствовать и различные дополнительные ветки для тестов и экспериментов. Для начала нужно в любую папку склонировать репозиторий из нужной ветки, пример:

git clone https://foo:bar@abf.io/soft/build_plasma5_desktop_ee.git

Переведем терминал в директорию со скачанными скриптами:

cd build_plasma5_desktop_ee

Переключитесь на ветку нужной платформы:

git checkout rosa2016.1

Теперь можно запускать сборку, пример сборки с минимальным набором параметров, задаваемых переменными окружения:

sudo env TYPES="64u" DE=plasma5 RELEASE=R11 BUILD_ID=20001 ./MATRIX

Обратите внимание, что при запуске скрипта MATRIX терминал должен быть именно в той директории, в которой лежит скрипт MATRIX. В корне этой директории будет создана директория "ROSA.DESKTOP.$RELEASE", которая будет использоваться для раскатывания базового chroot, внутри которого будет запущена сборка с помощью livecd-tools, который сделает еще один чрут внутри существующего чрута. В общем, нужно достаточное количество свободного места. Результирующий образ будет в папке results/, если не задано иное (см. ниже).

Скрипт MATRIX запускается с set -e, из-за чего он завершит свою работу при ошибке на любой промежуточной операции, что упрощает отладку, но может создать некоторые проблемы при сборке в нестандартном окружении. Стандартным условно считаем то, что на ABF.

Смысл переменных окружения (параметров сборки):

Скрипт MATRIX делает следующее:

Если нужно внести какие-то свои изменения, то потребуется править файлы: