Jump to content

Образ rootfs: различия между версиями

Нет описания правки
Отмена версии 741, сделанной Mikhailnov (обсуждение)
Метка: отмена
 
Строка 1: Строка 1:
= Локальная сборка ISO =
==Что такое rootfs==


== Введение ==
rootfs, то есть root file system, корневая файловая система — это архив с минималистичной системой, грубо говоря, это как если бы вы открыли файловый менеджер в корне своего Linux и запаковали всё найденное в архив, только здесь предустановлено минимально необходимое количество пакетов.


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


Скрипты сборки ISO-образов находятся здесь: https://abf.io/soft/rosa-build-iso
* [https://wiki.archlinux.org/index.php/Chroot_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) chroot]
* запуск в контейнере (systemd-nspawn, lxc, docker)
* установка системы вручную


Также имеются [https://abf.io/soft/rootfs-rosa скрипты сборки rootfs], но эта статья описывает только лишь сборку ISO.
==Где скачать rootfs Росы==


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


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


Рассмотрим подготовку рабочего места оператора сборки ISO-образа.
[https://abf.io/platforms/rosa13/products/408 rootfs-std x86_64]


Для сборки необходимо следующее окружение:
[https://abf.io/platforms/rosa13/products/409 rootfs-std i686]
* ОС на базе платформы rosa2021.1 или rosa13 (например, ROSA Fresh 12, ROSA Хром 12)
* root-права
* достаточные для монтирования loop-устройств capability (актуально для контейнеров)


Возможны следующие варианты среды сборки:
[https://abf.io/platforms/rosa13/products/414 rootfs-std aarch64]
* запущенная непосредственно на желез ОС Роса
* запущенная в виртуальной машине ОС Роса
* контейнер с ОС Роса


В процессе сборки монтируются loop-устройства, поэтому запускать сборку лучше либо на железе, либо в виртуальной машине, однако можно и в контейнере, если пробросить в него /dev/loop*. Как правильно настроить для этого контейнер systemd-nspawn, описано в отдельном разделе: [[#Сборка в контейнере systemd-nspawn|«Сборка в контейнере systemd-nspawn»]].
[https://abf.io/platforms/rosa13/products/421 rootfs-min x86_64]


Скрипт сборки не ломает среду, в которой запущен, поэтому его безопасно запускать, при необходимости многократно, на рабочей системе, не делая виртуальное окружение для каждого его запуска.
[https://abf.io/platforms/rosa13/products/425 rootfs-min aarch64]


Необходимо скачать скрипты сборки:
'''rosa2021.1'''
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
[https://abf.io/platforms/rosa2021.1/products/284 rootfs-std x86_64]
Запуск скрипта производится от root, параметры описаны ниже, пример запуска:
cd rosa-build-iso
sudo DE=plasma5 BUILD_ID=001 API_TOKEN=xxx DISTROSYNC=0 ./rosa-build-iso.sh


Обратите внимание, что, если вы находитесь в не-root консоли и установите относящиеся к скрипту сборки переменные окружения через export VAR=value, то они не попадут в скрипт. При запуске приведенном выше способом — указании всех параметров после слова "sudo" — попадут.
[https://abf.io/platforms/rosa2021.1/products/294 rootfs-std i686]


== Этапы сборки ISO ==
[https://abf.io/platforms/rosa2021.1/products/295 rootfs-std aarch64]


* начало работы скрипта сборки
[https://abf.io/platforms/rosa2021.1/products/327 rootfs-min x86_64]
* установка программы [https://abf.io/import/livecd-tools livecd-tools] и других необходимых для работы пакетов
* подготовка конфигурационных файлов для livecd-tools (см. раздел "Формирование конфига сборки образа")
* запуск программы livecd-creator из пакета livecd-tools, которая в свою очередь выполняет следующие действия:
** запуск, обработка конфигурации
** создание RPM-пакета rosa-iso-info с мета-информацией об образе
** выполнение %pre-скриптов, при их наличии (по умолчанию их нет)
** создание образа файловой системы ext4
** создание chroot (rootfs) путем запуска пакетного менеджера dnf (используется Python API dnf, а не CLI-утилита dnf напрямую); пакетному менедежеру указывается список всех пакетов, которые должны попасть в образ; он ставит их всех за **одну** транзакцию (поэтому важно, чтобы в пакетах были правильно прописаны Requires, Requires(pre), Requires(post), OrderWithRequires, OrderWithRequires(pre), OrderWithRequires(post) и т.д. и не было зацикленных зависимостей)
** выполнение %post-скриптов в созданном chroot, при их наличии
** выполнение %post --nochroot скриптов вне созданного chroot, при их наличии
** установка пакета rosa-iso-info
** запаковка образа ext4 в squashfs (в будущем, возможно, будет сразу в squashfs)
** создание конфигурационного файла загрузчика Grub2
** копирование загрузчиков (shim, grub2)
** запаковка ISO-образа
* перемещение собранного ISO-образа в заданный каталог
* завершение работы скрипты сборки


Установка ОС производится программой установки [[Anaconda]] путем rsync содержимого squashfs и удаления лишнего (например, самой Anaconda).
[https://abf.io/platforms/rosa2021.1/products/337 rootfs-min aarch64]


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


Скрипт rosa-build-iso.sh подставляет значения @переменных@ в файл [https://abf.io/soft/rosa-build-iso/blob/master/template.ks template.ks]. Изменения в файлы в текущем рабочем каталоге не вносятся, создается копия всех файлов, что позволяет удобно работать с git.
[https://abf.io/platforms/rosa2016.1/products/224 std и min, i586 и x86_64]


Из каталога packages/ берется файл pkgs-$DE.ks со списком пакетов.
{| class="wikitable" style="text-align: left; color: blue;"
|'''Примечание'''
Образы rootfs-min — это более минималистичный образ, чем std.
|}


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


Из файла DEs/$DE/head.ks берутся такие настройки сборки образа, как размер squashfs, часовой пояс, язык и раскладка клавиатуры по умолчанию и др.
* Зайти в список сборок
* Нажать на номер нужной сборки, обычно это последняя сборка
* Скачать нужный файл
* Распаковать его как архив


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


== Параметры скрипта сборки ==
Нужно взять [https://github.com/mikhailnov/docker-rosa скрипты] сборки и запустить ./mkimage-dnf.sh.


Все параметры скрипта сборки передаются переменными окружения. Если какой-либо параметр не задан, то используется его значение по умолчанию. Рекомендуется ознакомиться с кодом [https://abf.io/soft/rosa-build-iso/blob/master/build-iso-abf.sh build-iso-abf.sh], все параметры  с пояснениями перечислены в начале скрипта. Ниже будет рассмотрено большинство параметров, однако актуальность этой документации не гарантируется, рекомендуется смотреть в код.
Патчи и пулл-реквесты для улучшения скриптов сборки принимаются на Github.


=== ABF ===
==Docker-образ==
* ABF=1 — скрипт запускается в одноразовом виртуальном окружении
* ABF=0 — наоборот.
Если 1, то mirror.rosalab.ru заменяется на abf-downloads.rosalinux.ru в /etc/yum.repos.d/*


=== RESULTS_DIR ===
Готовые Docker/Podman образы не публикуются, однако вы можете:
Путь к каталогу, куда положить результирующий ISO-образ. По умолчанию (если не задано иное) это /home/vagrant/results (такой путь по историческим причинам).
 
=== BUILD_ID ===
ID сборки. Может содержать в себе любые латинские буквы и цифры. ABF сам выставляет значением BUILD_ID внутренний номер сборки. При создании своих сборок вы можете придумать свою систему идентификаторов. Обратите внимание, что BUILD_ID попадает в название образа, которое может быть не длиннее 32 символов. Ищите "FS_LABEL" в коде скрипта сборки. Также BUILD_ID попадает в мета-пакет rosa-iso-info.
 
=== PLATFORM ===
Платформа, на базе которой собирать образ: rosa2021.1, rosa13
 
=== DE ===
Графическое окружение. Значение может быть в любом регистре (маленькими или большими буквами). Возможные варианты см. в каталоге "DEs" в rosa-build-iso. DE=server — вариант без графической оболочки.
 
=== ARCH ===
Целевая архитектура. Значение по умолчанию: x86_64. Возможные значения:
* x86_64
* i686
* aarch64
* e2kv4
* riscv64
На архитектуре x86_64 возможна сборка образов под x86_64 и i686. В остальных случаях для сборки под иную, чем хостовые железо и ОС, архитектуры, можно использовать qemu и binfmt путем установки пакета qemu-*-static, который автоматически настроит binfmt. При использовании qemu возможны проблемы с монтированием loop-устройств.
 
=== FILTER_PACKAGES ===
Исключить перечисленные через пробел пакеты из образа, если они прописаны в списке пакетов или попадают по зависимостям. Примеры:
* FILTER_PACKAGES=foo — исключить пакет foo
* FILTER_PACKAGES="foo boo" — исключить пакеты foo и boo
 
=== ADD_PACKAGES ===
Добавить дополнительные, перечисленные через пробел пакеты. Примеры:
* ADD_PACKAGES=foo — добавить пакет foo
* ADD_PACKAGES="foo boo" — добавить пакеты foo и boo
 
=== ADD_REPOS ===
Добавить дополнительные репозитории в качестве источников для попадающих в образ пакетов (обратите внимание, что внутри ОС репозитории прописаны в пакете [https://abf.io/import/rosa-repos rosa-repos] и не связаны с использованными для сборки образа репозиториями).
 
Добавляемые репозитории перечисляются через пробел.
 
Возможные варианты:
* ADD_REPOS=555444 — добавить контейнер из сборочного листа http://abf.io/build_lists/555444. Путь к контейнеру будет получен по API (должна быть установлена переменная API_TOKEN). Также будут автоматически добавлены контейнеры из сборочных листов, которые были подключены как дополнительные сборки в заданном сборочном листе, что позволяет указать лишь номер последнего контейнера в длинной цепочке.
* ADD_REPOS="-555444" — аналогично, но не добавляя контейнеры зависимостей сборочного листа.
* ADD_REPOS="555444 555445" — добавить контейнеры из сборочных листов 555444 и 555445 с разрешением зависимостей.
* ADD_REPOS="555444 -555445" — добавить контейнеры из сборочного листа 555444 с разрешением зависимостей и из 555445 без него.
* ADD_REPOS="+555,401,402,403" — добавить контейнеры из сборочных листов 555401, 555402, 555403 с разрешением их зависимостей.
* ADD_REPOS="+-555,401,402,403" — добавить контейнеры из сборочных листов 555401, 555402, 555403 без разрешения их зависимостей.
* ADD_REPOS="%username" — добавить репозиторий <code>https://abf-downloads.rosalinux.ru/%username_personal/repository/$PLATFORM/$ARCH/main/release/</code>
* ADD_REPOS="http://vasya.ru/repo" — добавить репозиторий по URL.
* ADD_REPOS="/mnt/repo/x" — добавить локальный репозиторий по указанному пути.
 
=== ADD_REPOS_INTO_ISO ===
* ADD_REPOS_INTO_ISO=1 — добавить перечисленные в ADD_REPOS дополнительные репозитории в /etc/yum.repos.d/* результирующего образа
* ADD_REPOS_INTO_ISO=0 (по умолчанию) — не добавлять
 
=== ENABLE_CONTRIB_REPOS ===
* ENABLE_CONTRIB_REPOS=1 (по умолчанию) — подключить репозиторий contrib в качестве источника для сборки образа
* ENABLE_CONTRIB_REPOS=0 — не подключать.
 
=== ENABLE_TESTING_REPOS ===
* ENABLE_TESTING_REPOS=1 — подключить testing-подрепозитории в качестве источников для сборки образа
* ENABLE_TESTING_REPOS=0 (по умолчанию) — не подключать.
 
=== DISABLE_STANDARD_REPOS ===
* DISABLE_STANDARD_REPOS=1 — убрать все стандартные источники для сборки образа и тем самым использовать только заданные через ADD_REPOS (актуально при сборке с использованием локального зеркала репозитория)
* DISABLE_STANDARD_REPOS=0 (по умолчанию) — не делать этого.
 
=== BRANDING ===
Какой брендинг (файл /etc/os-release и пр.) использовать. Значение по умолчанию: fresh. Допустимо значение "chrome" или иное при наличии соответствующего пакета в подключенных источниках.
 
=== DISTROSYNC ===
Выполнять ли dnf distro-sync в хостовой ОС перед началом сборки.
* DISTROSYNC=1 (по умолчанию) — выполнять
* DISTROSYNC=0 — не выполнять.
Рекомендуется установить DISTROSYNC=0 при запуске на рабочем компьютере.
 
=== CLEANUP ===
* CLEANUP=1 (по умолчанию) — удалить временные каталоги по окончанию работы
* CLEANUP=0 — не удалять (для отладки).
 
=== CUSTOMIZATION_FEATURES ===
Перечисленные через пробел customization/features/* для подключения. Примеры:
* CUSTOMIZATION_FEATURES="samba-ad"
* CUSTOMIZATION_FEATURES="samba-ad ssh-server"
 
=== LIVECD_CREATOR_EXTRA_ARGS ===
Дополнительные параметры livecd-creator. Например, можно указать путь к кешу, чтобы при повторных сборках образа не скачивать пакеты заново:
LIVECD_CREATOR_EXTRA_ARGS="--cache=/var/tmp/livecd-creator-cache"
 
=== LIVECD_CREATOR_COMPRESSION ===
Сжатие squashfs (см. раздел "Этапы сборки ISO"). По умолчанию используется zstd, что позволяет достичь оптимальный баланс между размером образа, скоростью запуска и установки ОС в LiveCD и скоростью сборки образа. Можно установить LIVECD_CREATOR_COMPRESSION=xz для уменьшения размера образа.
 
=== STRACE ===
* STRACE=1 — запустить livecd-creator и все скриптлеты устанавливаемых пакетов под strace
* STRACE=0 (по умолчанию) — не использовать strace.
 
=== SLEEP ===
Количество секунд задержки сразу после запуска скрипта. По умолчанию 0.
 
=== TMPFS ===
* TMPFS=1 — создавать tmpfs и запускать сборку в ней
* TMPFS=0 (по умолчанию) — не делать tmpfs.
 
=== FORCE_C_LOCALE ===
* FORCE_C_LOCALE=1 (по умолчанию) — выставить C-локаль, чтобы скриптлеты пакетов выполнялись с нею в процессе работы
* FORCE_C_LOCALE=0 — не делать этого.
 
=== DNF_IN_OPTS ===
Дополнительные параметры запуска dnf при установке утилит для сборки образа в хостовую ОС. Позволяет, например, указать дополнительный репозиторий с обновлением livecd-tools. Пример:
DNF_IN_OPTS="--nogpgcheck --repofrompath abf-user,https://abf-downloads.rosa.ru/abf-user_personal/repository/rosa2021.1/x86_64/main/release/"
 
=== TMPFS_SIZE ===
Размер tmpfs. По умолчанию 30 ГБ. Актуально только при TMPFS=1.
 
== Мета-пакет rosa-iso-info ==
При сборке образа создается RPM-пакет rosa-iso-info, в который попадает информация о данной сборке. Этот пакет устанавливается в образ и сохраняется после установки системы из него. Сборка производится по спеку [https://abf.io/soft/rosa-build-iso/blob/master/rosa-iso-info.spec rosa-iso-info.spec].
 
В этом пакете в виде и [https://nixtux.ru/1124 Provides], и файла /var/lib/rosa-iso-info сохраняется следующая информация:
* платформа в виде целого числа (как макрос %{mdvver}), например: 202110
* BUILD_ID
* UNIX-время сборки (кол-во секунд с 01.01.1970)
* DE
 
Примеры запроса информации из этого пакета:


* взять последнюю сборку rootfs по ссылкам выше
* создать Dockerfile в одном каталоге с архивом с rootfs
<pre>
<pre>
$ rpm -qi rosa-iso-info
FROM scratch
Name        : rosa-iso-info
ADD rootfs.tar.xz /
Version    : 202110
CMD ["/bin/bash"]
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    : https://bugzilla.rosa.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
</pre>
</pre>


Пример использования в [https://rpm-software-management.github.io/rpm/manual/boolean_dependencies.html boolean-зависимостях] пакетов:
* в Dockerfile поменять имя файла с rootfs
Requires: (foo if rosa-iso-info(buildid) >= 555)
* собрать Docker-образ и использовать его


Данный пакет отсутствует в репозитории, а значит не будет обновляться, что позволяет сохранять и получать информацию именно о том образе, с которого была поставлена система.
==Пример использования rootfs==
 
== Customization features ==
=== О c/f ===
В каталоге customizations/features можно создавать набор инструкций с дополнительными изменениями в образе. Для краткости будем называть их c/f.
 
Структура каталога customizations/features/xxx (все перечисленные файлы необязательны):
* packages.ks — какие пакеты добавить или убрать (пакеты, которые убрать относительно $DE, пишутся с минусом перед названием) (если этого файла нет, то не страшно, изменения в пакеты не будут внесены, аналогично для остальных файлов)
* post.ks — какие скрипты выполнить после установки пакетов в chroot (и после DEs/$DE/post.ks, см. template.ks)
* post-nochroot.ks — какие скрипты выполнить после установки пакетов вне сhroot
* head.ks — переназначить DEs/$DE/head.ks (см. раздел "Формирование конфига сборки образа")
* deps — какие другие c/f автоматически подключить при использовании этой c/f
* другие файлы — можно положить любые другие файлы и обращаться к ним из post.ks, post-nochroot.ks; путь к ним будет таким: features/xxx/файл.
 
Ниже описаны имеющиеся c/f, однако актуальность документации не гарантируется, смотрите код.
 
=== ad-client-sssd ===
Автоматически ввести LiveCD в домен AD с использованием sssd. Пример сценария использования:
* собрать ISO с c/f samba-ad
* собрать ISO с c/f ad-client-sssd
* запустить оба LiveCD
* без установки системы в первом автоматически поднимется контроллер домена
* второй можно ввести в домен
 
=== auto-kickstart ===
Встраивание kickstart-файла (kickstart.ks) в ISO и автоматическая установка ОС по нему.
 
Про кикстарты подробнее см. в статье [[Anaconda]].
 
Можно взять за основу /root/anaconda-ks.cfg установленной системы, немного поправить его, положить вместо customizations/features/auto-kickstart/kickstart.ks и собрать образ, который будет полностью автоматически устанавливать ОС в нужной конфигурации.
 
=== empty-root-password ===
Сделать пароль root в LiveCD пустым.
 
=== freeipa ===
Автоматически запускающийся в LiveCD контроллер домена FreeIPA.
 
=== iso-builder ===
Включить в образ необходимые для запуска этих скриптов пакеты.
 
=== mini-vm ===
Собрать минималистичный образ для виртуальных машин, без графического установщика Anaconda (только с консольной Anaconda), linux-firmware и лишних локалей.
 
=== 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: публичный и приватный ключи
* Публичный встраивается в /root/.ssh/authorized_keys LiveCD
* Создаются хостовые ключи ssh /etc/ssh/ssh_host_*, чтобы при каждом запуске LiveCD они не менялись и тем самым не менялся отпечаток на ssh-клиенте
* добавляется пакет openssh-server
* включается автозапуск службы sshd
* созданные ключи сохраняются в каталог для результатов сборки рядом с ISO-образом
** sshkey.pub — публичный ключ
** sshkey — приватный ключ
 
Пример использования приватного ключа:
ssh -i sshkey root@ip
 
=== tablet ===
Оптимизация и хаки для лучшей работы на планшетах (тачскринах).
 
== Пересборка ISO со встраиванием кикстарта для автоматической установки ==
 
Задача: сделать установочный образ ОС, встроив в него кикстарт (kickstart, сценарий автоматизированной установки). Тогда будет загрузить компьютер или виртуальную машину с этого образа, а установки системы будет произведена полностью автоматически.
 
Пусть <code>ROSA-Chrome.iso</code> — имя файла с образом ОС. В качестве рабочей папки будем использовать <code>/var/tmp/iso</code>.
 
Сначала установим необходимые программы:
sudo dnf install bsdtar xorriso
 
Создадим рабочую папку:
mkdir /var/tmp/iso
 
Распакуем ISO-образ в нее:
sudo bsdtar -xf ROSA-Chrome.iso -C /var/tmp/iso
Вместо распаковки можно примонтировать *.iso и скопировать файлы.
 
Открываем на редактирование конфигурационный файл загрузчика:
 
для образов rosa13 и новее:
sudo nano /var/tmp/iso/EFI/BOOT/menuentry.cfg
 
для образов rosa2021.1 (12):
sudo nano /var/tmp/iso/EFI/BOOT/grub.cfg
 
Найдите первую строку, начинающуюся на "menuentry", например:


Разберем на примере ежедневной сборки №44893. Контейнер назовем "rosa1".
<pre>
<pre>
menuentry "$startInstall (live mode)" --class rosa --class gnu-linux --class gnu --class os {
su -
    linux /vmlinuz0 root=live:LABEL=ROSA_13_LXQT_x86_64_56342 ro rd.live.image quiet  rhgb rhgb splash=silent logo.nologo    inst.lang=$lang_utf locale.LANG=$lang_utf locale.LANGUAGE=$lang_utf
cd /var/lib/machines
wget --content-disposition https://file-store.rosalinux.ru/api/v1/file_stores/bfbdc6531f18db1eeacdf1c0a6cf7cecda9a7222
mkdir rosa1
cd rosa1
tar -xvf ../rootfs-std-rosa2021.1_x86_64_2022-11-06.tar.xz
cd /var/lib/machines
systemd-nspawn -D rosa1 -b
</pre>
</pre>


После "<code>locale.LANGUAGE=$lang_utf</code>" (в конец cmdline ядра) добавьте:
После последней команды загрузится консоль контейнера, вводите логин root, пароль не запросит. Если убрать -b и сделать просто systemd-nspawn -D rosa1, то вы попадете в консоль без полноценного запуска виртуальной системы.
systemd.unit=anaconda.target inst.ks=cdrom:/kickstart.ks
 
В корень распакованного iso положите файл <code>kickstart.ks</code> (<code>/var/tmp/iso/kickstart.ks</code>) с необходимым содержимым, например:
 
<pre>
cmdline
liveimg --url=file:///dev/mapper/live-base


# Автоматически принять лицензионное соглашение
Чтобы выключить контейнер введите
eula --agreed


lang ru_RU.UTF-8
poweroff


keyboard --xlayouts=us,ru --switch=grp:alt_shift_toggle
{| class="wikitable" style="text-align: left; color: blue;"
|'''Примечание'''
В команде wget выше
wget --content-disposition <ссылка>
--content-disposition - благодаря этому параметру файл получит исходное имя, а не будет в виде хеша sha1, <ссылка> - это скопированная ссылка на скачивание архива.


services --enabled="chronyd"
При желании дать файлу любое другое имя нужно заменить --content-disposition на -O <имя файла для сохранения>.
|}


# Автоматическая разметка диска
Чтобы из контейнера запускать графические приложения необходимо установить пакет snr
autopart
clearpart --all --initlabel


timezone Europe/Moscow --utc
sudo dnf in snr


rootpw root
Потом выполните от имени обычного пользователя
user --groups=wheel,users --name=admin --password=admin


reboot --eject
snr rosa1
</pre>


Подробнее про кикстарты в статье [[Anaconda]].
Создайте обычного пользователя в контейнере (многие приложения нельзя запускать от рута)


Пересоберите ISO:
  useradd user
  cd /var/tmp/iso
sudo ./mkiso


== Сборка в контейнере systemd-nspawn ==
Установите необходимое приложение


Собирать ISO можно и в контейнере systemd-nspawn — это удобнее, чем заводить виртуальную машину. Ниже приведен пример настройки контейнера <code>iso-builder-rosa13</code> с ROSA 13 (платформа rosa13); rootfs для него можно взять [Образ_rootfs отсюда] и распаковать в <code>/var/lib/machines/iso-builder-rosa13</code>.
dnf in app


Контейнер запускается экземпляром шаблонного юнита <code>systemd-nspawn@.service</code> (в нашем случае — <code>systemd-nspawn@iso-builder-rosa13.service</code>). Для проброса loop-устройств и монтирования каталога с результатами сборки создайте для него drop-in командой:
И запускайте его от имени user
sudo systemctl edit systemd-nspawn@iso-builder-rosa13.service


Она откроет на редактирование файл <code>/etc/systemd/system/systemd-nspawn@iso-builder-rosa13.service.d/override.conf</code>, куда нужно вписать:
sudo -u user app


<pre>
Чтобы выйти из контейнера введите
[Service]
ExecStart=
ExecStart=systemd-nspawn \
-D /var/lib/machines/iso-builder-rosa13 \
--boot \
--bind=/home/user/iso-results:/home/vagrant/results \
--property=DeviceAllow="block-blkext rwm" \
--property=DeviceAllow="block-loop rwm" \
--property=DeviceAllow="/dev/loop-control rwm" \
--capability=CAP_MKNOD


# если случайно сделали poweroff в контейнере
exit
Restart=always
</pre>


Путь <code>/home/user/iso-results</code> на хосте (куда будут попадать собранные образы) замените на свой; <code>/home/vagrant/results</code> внутри контейнера — это значение RESULTS_DIR по умолчанию (см. выше).
{| class="wikitable" style="text-align: left; color: blue;"
|'''Примечание'''
Если контейнер создавать вне /var/lib/machines, то вместо rosa1 нужно указывать путь к контейнеру.


Запустите контейнер:
Чтобы пробросить какую-то директорию или файл в контейнер используйте параметр --bind=/что/пробросить:/куда/пробросить, если вторую часть начиная с : опустить, то пути в контейнере и хостовой системе совпадут.
sudo systemctl start systemd-nspawn@iso-builder-rosa13
|}


Внутри контейнера создайте файл <code>/etc/rc.local</code> (он запускается сервисом rc-local.service, проверить который можно командой <code>systemctl status rc-local.service</code>), создающий отсутствующие в контейнере loop-устройства:
'''Пример использования на BTRFS для быстрого клонирования контейнеров'''


/var/lib/machines должно быть внутри раздела BTRFS.
<pre>
<pre>
#!/usr/bin/bash
su -
# https://gist.github.com/ag88/05245121cce37cb8f029424a20752e35#loop_devpatch
cd /var/lib/machines
if ! test -e /dev/loop-control; then
wget --content-disposition https://file-store.rosalinux.ru/api/v1/file_stores/bfbdc6531f18db1eeacdf1c0a6cf7cecda9a7222
  mknod /dev/loop-control c 10 237
btrfs subvol create rosa1
fi
cd rosa1
 
tar -xvf ../rootfs-std-rosa2021.1_x86_64_2022-11-06.tar.xz
for i in 0 1 2 3 4 5 6 7 8 9 10 11 12; do
cd /var/lib/machines
if ! test -e /dev/loop${i}; then
btrfs subvol snapshot rosa1 rosa2
  mknod /dev/loop${i} b 7 ${i}
btrfs subvol snapshot rosa1 rosa3
fi
done
</pre>
</pre>
В итоге у нас есть 3 одинаковых контейнера: /var/lib/machines/rosa1, /var/lib/machines/rosa2, /var/lib/machines/rosa3. Поскольку они одинаковые, место на диске занимается 1 раз, а не 3. После запуска каждого из контейнеров рекомендую менять hostname, чтобы было удобно их различать.


И сделайте его исполняемым:
'''Запуск 32-битного контейнера на 64-битном хосте'''
chmod +x /etc/rc.local
 
Вход в контейнер:
sudo machinectl shell iso-builder-rosa13
 
Дальнейшие действия внутри контейнера не отличаются от обычной сборки: скачайте скрипты rosa-build-iso и запустите их, как описано выше (в разделе «Подготовка рабочего окружения»).
 
== Сборка ISO на базе устаревших платформ (rosa2016.1, rosa2014.1) ==
 
Если вам хочется собрать собственный ISO-образ Росы, а доступа для сборки образов на ABF нет, можно собрать образ на локальной машине.
 
Если нужна сборка корневой системы, а не ISO-образа, то см. статью "[[Образ rootfs]]".
 
Особых требований к системе, на которой запускается сборка, нет, единственное, что мешает ее запускать на дистрибутивах GNU/Linux, отличных от ROSA — это прямой вызов urpmi для создания базового chroot.
 
Для сборки используются специальные проекты, хранящиеся в Git-репозиториях на ABF и включающие в себя все необходимые для сборки скрипты и вспомогательные файлы. На текущий момент поддерживаются следующие проекты:
* KDE4: [https://abf.io/soft/build_kde4_desktop_ee soft/build_kde4_desktop_ee]
* KDE5: [https://abf.io/soft/build_plasma5_desktop_ee soft/build_plasma5_desktop_ee]
* XFCE: [https://abf.io/soft/build_xfce_desktop soft/build_xfce_desktop]
* MATE: [https://abf.io/soft/build_mate_desktop soft/build_mate_desktop]
* GNOME: [https://abf.io/soft/build_gnome_desktop soft/build_gnome_desktop]
* LXQt: [https://abf.io/soft/build_lxqt_desktop soft/build_lxqt_desktop]
 
В каждом репозитории могут быть несколько веток. Основная ветка имеет имя актуальной платформы (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, внутри которого будет запущена сборка с помощью [https://abf.io/import/livecd-tools livecd-tools], который сделает еще один чрут внутри существующего чрута. В общем, нужно достаточное количество свободного места. Результирующий образ будет в папке results/, если не задано иное (см. ниже).
 
Скрипт MATRIX запускается с set -e, из-за чего он завершит свою работу при ошибке на любой промежуточной операции, что упрощает отладку, но может создать некоторые проблемы при сборке в нестандартном окружении. Стандартным условно считаем то, что на ABF.


Смысл переменных окружения (параметров сборки):
Без доп. параметров всё запустится, но, например, uname и lscpu будут выдавать x86_64, в результате чего утилиты типа rpm будут думать, что они работают на 64-битной Ос, а не 32-битной.
* RESULTS_DIR: директория, куда сохранять результирующие образы и логи; по умолчанию создается папка results в текущей директории;
* TYPES: список типов образов, которые будут собираться (возможные варианты: 32, 32u, 64, 64u — соответственно, 32- и 64-битные образы с поддержкой UEFI или без оной); на данный момент можно собирать только один тип за раз, пример: TYPES=64u
* DE: суффикс у файла со списком пакетов, обычно, соответствующий графическому окружению (например, для DE=kde4 будут использоваться файлы commonkde4.lst, i586kde4.lst, x86_64kde4.lst), также $DE войдет в имя файла результирующего образа;
* RELEASE: номер релиза Росы;
* BUILD_ID: номер собираемого образа, может задаваться произвольно;
* MIRROR: зеркало, с которого брать пакеты, пример: MIRROR=https://mirror.rosa.ru/rosa или MIRROR=http://mirror.yandex.ru/rosa или MIRROR=http://abf-downloads.rosalinux.ru; если не задано, то ставится MIRROR=http://abf-downloads.rosalinux.ru;
* REPO: путь к репозиторию, откуда будут скачиваться пакеты, пример: https://abf-downloads.rosa.ru/rosa2016.1/repository/x86_64/, если переменная REPO не задана, то она формируется так: REPO="${MIRROR}/${ROSA_PLATFORM}/repository/${ARCH}/"


Скрипт MATRIX делает следующее:
Для решения проблемы в параметры запуска systemd-nspawn добавьте: --personality=x86, пример:
* устанавливает все обновления на хост;
* средствами urpmi делает chroot с целевой платформой, образ которой собирается;
* заменяет шаблонные вещи типа #ARCH# в файле .ks.template (в .ks.template много чего делается, и на данный момент делается это без set -e, то есть сборка образа не прекращается при ошибке промежуточной команды в .ks.template, что затрудняет отладку);
* в созданном chroot запускает [https://abf.io/import/livecd-tools/tree/rosa2016.1 livecd-tools], который собирает образ по .ks.template;
* в результирующий образ добавляется mirror.rosalab.ru в качестве единственного репозитория (то есть сначала собирается образ с тем репозиторием, который вы задали, а потом добавляется другой, без гарантии, что содержимое этих репозиториев одинаковое);
* копирует результирующий образ в $RESULTS_DIR (results/).


Если нужно внести какие-то свои изменения, то потребуется править файлы:
systemd-nspawn -D rosa-i586-1 --personality=x86
* commonplasma5.lst, i586plasma5.lst, x86_64kplasma5.lst: списки устанавливаемых в образ пакетов (общий список и, при необходимости, архитектуро-зависимые; вместо «plasma5» нужно подставить значение переменной DE);
* i586repo.lst, x86_64repo.lst: дополнительные репозитории или контейнеры (например, если надо собрать образ с тестовой версией пакета, отсутствующей в основном репозитории) (эти контейнеры используются при сборке образа, но НЕ добавляются в качестве репозиториев в результирующий образ!);
* каталог extraconfig: может использоваться для прямого подкладывания или замены файлов в файловой системе образа (кажется, функционал его копирования поломан);
* .ks.template: шаблон Kickstart-файла, используемого для сборки; включает в себя в числе прочего post-скрипты, выполняющие финальную настройку и доводку системы, установленной в образе.


[[Категория:Сервер]]
[[Категория:Сервер]]

Текущая версия от 15:16, 10 сентября 2026

Что такое rootfs

rootfs, то есть root file system, корневая файловая система — это архив с минималистичной системой, грубо говоря, это как если бы вы открыли файловый менеджер в корне своего Linux и запаковали всё найденное в архив, только здесь предустановлено минимально необходимое количество пакетов.

Для чего нужен rootfs

  • chroot
  • запуск в контейнере (systemd-nspawn, lxc, docker)
  • установка системы вручную

Где скачать rootfs Росы

Раз в день автоматически выполняются сборки rootfs архитектуры x86_64 на платформах rosa2021.1 и rosa13.

rosa13

rootfs-std x86_64

rootfs-std i686

rootfs-std aarch64

rootfs-min x86_64

rootfs-min aarch64

rosa2021.1

rootfs-std x86_64

rootfs-std i686

rootfs-std aarch64

rootfs-min x86_64

rootfs-min aarch64

rosa2014 и rosa2016

std и min, i586 и x86_64

Примечание

Образы rootfs-min — это более минималистичный образ, чем std.

Порядок скачивания последней сборки rootfs

  • Зайти в список сборок
  • Нажать на номер нужной сборки, обычно это последняя сборка
  • Скачать нужный файл
  • Распаковать его как архив

Как собрать rootfs самому

Нужно взять скрипты сборки и запустить ./mkimage-dnf.sh.

Патчи и пулл-реквесты для улучшения скриптов сборки принимаются на Github.

Docker-образ

Готовые Docker/Podman образы не публикуются, однако вы можете:

  • взять последнюю сборку rootfs по ссылкам выше
  • создать Dockerfile в одном каталоге с архивом с rootfs
FROM scratch
ADD rootfs.tar.xz /
CMD ["/bin/bash"]
  • в Dockerfile поменять имя файла с rootfs
  • собрать Docker-образ и использовать его

Пример использования rootfs

Разберем на примере ежедневной сборки №44893. Контейнер назовем "rosa1".

su -
cd /var/lib/machines
wget --content-disposition https://file-store.rosalinux.ru/api/v1/file_stores/bfbdc6531f18db1eeacdf1c0a6cf7cecda9a7222
mkdir rosa1
cd rosa1
tar -xvf ../rootfs-std-rosa2021.1_x86_64_2022-11-06.tar.xz
cd /var/lib/machines
systemd-nspawn -D rosa1 -b

После последней команды загрузится консоль контейнера, вводите логин root, пароль не запросит. Если убрать -b и сделать просто systemd-nspawn -D rosa1, то вы попадете в консоль без полноценного запуска виртуальной системы.

Чтобы выключить контейнер введите

poweroff
Примечание

В команде wget выше wget --content-disposition <ссылка> --content-disposition - благодаря этому параметру файл получит исходное имя, а не будет в виде хеша sha1, <ссылка> - это скопированная ссылка на скачивание архива.

При желании дать файлу любое другое имя нужно заменить --content-disposition на -O <имя файла для сохранения>.

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

sudo dnf in snr

Потом выполните от имени обычного пользователя

snr rosa1

Создайте обычного пользователя в контейнере (многие приложения нельзя запускать от рута)

useradd user

Установите необходимое приложение

dnf in app

И запускайте его от имени user

sudo -u user app

Чтобы выйти из контейнера введите

exit
Примечание

Если контейнер создавать вне /var/lib/machines, то вместо rosa1 нужно указывать путь к контейнеру.

Чтобы пробросить какую-то директорию или файл в контейнер используйте параметр --bind=/что/пробросить:/куда/пробросить, если вторую часть начиная с : опустить, то пути в контейнере и хостовой системе совпадут.

Пример использования на BTRFS для быстрого клонирования контейнеров

/var/lib/machines должно быть внутри раздела BTRFS.

su -
cd /var/lib/machines
wget --content-disposition https://file-store.rosalinux.ru/api/v1/file_stores/bfbdc6531f18db1eeacdf1c0a6cf7cecda9a7222
btrfs subvol create rosa1
cd rosa1
tar -xvf ../rootfs-std-rosa2021.1_x86_64_2022-11-06.tar.xz
cd /var/lib/machines
btrfs subvol snapshot rosa1 rosa2
btrfs subvol snapshot rosa1 rosa3

В итоге у нас есть 3 одинаковых контейнера: /var/lib/machines/rosa1, /var/lib/machines/rosa2, /var/lib/machines/rosa3. Поскольку они одинаковые, место на диске занимается 1 раз, а не 3. После запуска каждого из контейнеров рекомендую менять hostname, чтобы было удобно их различать.

Запуск 32-битного контейнера на 64-битном хосте

Без доп. параметров всё запустится, но, например, uname и lscpu будут выдавать x86_64, в результате чего утилиты типа rpm будут думать, что они работают на 64-битной Ос, а не 32-битной.

Для решения проблемы в параметры запуска systemd-nspawn добавьте: --personality=x86, пример:

systemd-nspawn -D rosa-i586-1 --personality=x86