Barium:UIRD

Материал из Rosalab Wiki
Перейти к: навигация, поиск

UIRD - Unified Init Ram Disk system

Код, описание, доки: https://github.com/neobht/uird

Форум: https://forum.magos-linux.ru/c/uird/5


Это разновидность initrd, его задача собрать из слоёв aufs/overlayfs корневую файловую систему и передать загрузку /sbin/init (systemd) с этой корневой файловой системой. В основе реализации UIRD лежит набор скриптов инициализации dracut (модули base, kernel-modules), сценарий инициализации uird-init и библиотека функций к нему livekitlib (доработанный аналог liblinuxlive проекта Slax).

Основные отличия от реализаций initrd для модульных систем схожих проектов.

  • Отсутствие привязки к конкретному дистрибутиву
  • Отсутствие привязки к конкретным каталогам для поиска источников
  • Возможность подключения практически любых источников, которые можно смонтировать в linux
  • Поддержка различных сетевых протоколов для загрузки по сети


UIRD - сердце Бария.

Именно UIRD обеспечивает основные отличия Бария от других дистрибутивов Росы собранных на аналогичной платформе.

Глоссарий:

 Источник - все что можно смонтировать в линукс, в том числе по сети, в каталоге, куда монтируется источник, будет осуществляться поиск модулей (слоев)
 Слой - все что можно смонтировать в линукс, img, iso,также слоем может быть папка, но чаще всего это модуль.
 Модуль - squashfs архив, отличается от обычных архивов тем, что может быть смонтирован RO как блочное устройство.
 Бандл - bundle - промежуточная точка монтирования модуля. Модуль не может быть сразу смонтирован в aufs или overlayfs, эти файловые системы собираются из каталогов. Модули монтируются в папки в /.memory/bundles/имя_модуля, а слоеная фс собирается из этих бандлов. 
 sysroot, rootfs - в случае UIRD это корневая фс линукс собранная в UIRD из слоев объединенных aufs или overlayfs. Именно с этой ФС продолжится загрузка на этапе после UIRD.Создание rootfs - основная задача UIRD.
 Чистый режим - режим загрузки, при котором изменения сделанные в системе не сохраняются после перезагрузки (как livecd)

Последовательность загрузки с описанием основных параметров

Общее количество параметров UIRD достаточно велико, но большая часть из них относится к дополнительному функционалу. Например конфигурационный файл для загрузки ОС Барий, точнее один из конфигов, выглядит так:

 uird.config=ROSA.ini
 uird.rootfs=zram::SIZE=85%
 uird.ro=*.xzm,*/patches
 uird.rw=
 uird.cp=*.cp
 uird.load=/base/,/modules/
 uird.noload=/saves,/homes
 uird.from=/ROSA-SYSTEM::MNT_OPTS=ro+noexec,/ROSA-DATA
 uird.find_params=-maxdepth_3
 uird.mode=clean
 uird.changes=/ROSA-DATA/saves/toxzm.cfg
 uird.syscp=/livekitlib::/usr/lib/rosa-rw/scripts
 uird.shutdown
 uird.preinit
 uird.union=overlay

И даже здесь не все параметры необходимы. Треть можно убрать и система все равно загрузится.

Основной сценарий работы UIRD - /uird-init, в нем последовательно выполняются функции из файла /livekitlib, чтобы в итоге получить rootfs и передать загрузку целевой системе. Если оставить только основные моменты процесс выглядит так:

  • предварительные действия dracut
  • запуск uird-init
  • разбор конфига и параметров cmdline (конфиг либо дефолтный, либо устанавливается параметром uird.base.cfg=Rosa-ovl, выбор только из встроенных при сборке конфигов)
  • поиск и подключение источников определенных в uird.from=/ROSA-SYSTEM::MNT_OPTS=ro+noexec,/ROSA-DATA

конкретно эта строка будет обработана так:

 - поиск в корне доступных носителей /ROSA-SYSTEM
 - если найдено, носитель монтируется в /.memory/data/from/0  с параметрами ro,noexec
 - папка /ROSA-SYSTEM биндится в /.memory/layer-base/0 - это и есть первый источник
 - поиск в /.memory/data/from/*/ и в корне доступных носителей - /ROSA-DATA
 - когда найдена, если нужно монтировать создается /.memory/data/from/1, если папка в /.memory/data/from/0, то используется оттуда
 - папка /ROSA-SYSTEM биндится в /.memory/layer-base/1 - это второй источник
  • поиск модулей и создание бандлов, за это отвечают параметры:
 uird.load=/base/,/modules/
 uird.noload=/saves,/homes

и

 uird.ro=*.xzm,*/patches
 uird.rw=
 uird.cp=*.cp
 

параметрам передаются списки фильтров, по которым отсеиваются не подходящие файлы и каталоги. Конкретно эти фильтры можно описать так:

 Найти файлы и папки в полном имени которых встречается "/base/" или "/modules"
 При этом в именах не должно встречаться '/saves' или '/homes' (чтобы случайно не подключить модули лежащие например в домашней папке)
 Также имя должно удовлетворять любому из фильтров описанных в uird.ro=*.xzm,*/patches, uird.rw="", uird.cp=*.cp.

для всего найденного создаются бандлы.

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

uird.mode, uird.changes. Это может быть папка в одном из источников, раздел, папка на разделе, файл образ форматированный ext/2/3/4, btrfs с расширением .img в том числе по сети. Для включения сохранений таким способом параметры должны быть приведены к такому виду:

 uird.mode=changes
 uird.changes=/куда/писать

В нашем конфиге:

 uird.mode=clean
 uird.changes=/ROSA-DATA/saves/toxzm.cfg

clean здесь означает "Чистый режим", то есть верхним слоем aufs будет папка в tmpfs и изменения при перезагрузке сохраняться не будут, значение же параметра uird.changes будет использовано только когда мы изменим значение uird.mode на toxzm через cmdline ядра.

  • сборка слоеной фс - /sysroot, из бандлов подходящих под фильтр uird.ro=*.xzm,*/patches (в нашем случае это модули и каталоги c именем patches) и каталога для записи изменений в верхнем слое.
  • копирование в /sysroot бандлов подходящих под фильтр uird.cp=*.cp ( по умолчанию в Барии таких нет)
  • поиск в источниках и обработка системного конфигурационного файла описанного параметром uird.config=ROSA.ini
  • завершение uird-init корневой ФС становится /sysroot, загрузка передается /sbin/init целевой системы.


Описание дополнительных параметров

Из конфигурационного файла Rosa-ovl:

 uird.rootfs=zram::SIZE=85% - настройки для создания каталога /.memory, это важно потому, что здесь же располагается /.memory/changes, где будут накапливаться изменения в чистом режиме. Конкретно эта запись означает: Использовать для /.memory блочное устройство со сжатием в ОЗУ - zram, размер 85% от размера ОЗУ.
 uird.find_params=-maxdepth_3 - дополнительные параметры для find при поиске модулей. Здесь глубина поиска ограничена тремя вложенными каталогами.
 uird.syscp=/livekitlib::/usr/lib/rosa-rw/scripts - копирование файлов из uird в систему, здесь забираем библиотеку функций для uird-init, может использоваться в скриптах.
 uird.shutdown - включение создания /run/initramfs - необходимо для uird.mode=toxzm, в остальных случаях позволяет корректно размонтировать то что не сможет systemd при выключении системы
 uird.preinit - включение обработки системного ini. Если uird.config= задан, а uird.preinit нет, конфиг будет найден, но не обработан (в MagOS так, обрабатывается скриптами MagOS)  
 uird.union=overlay - использовать overlayfs ( по умолчанию aufs)

Просто полезные параметры

 uird.home=/что/подключать - монтирование папки или образа в /home целевой системы
 uird.mounts=что::MNT=куда  - монтирование чего угодно куда угодно, может заменить uird.home=, только больше писать. Смонтированное здесь участвует в поиске источников.
 uird.swap=auto - найти и подключить своп раздел, кроме auto есть другие варианты, например можно подключить pagefile.sys от windows
 uird.copy2ram - скопировать модули в RAM и подключить оттуда, может быть полезным с очень медленным или нестабильным источником модулей. Например сетевым.
 uird.freemedia - используется совместно с uird.copy2ram, размонтирует все локальные диски после копирования модулей в ОЗУ. То есть можно загрузить с флешки и вытащить флешку.
 qs, qse - консоль в начале и в конце uird-init (полезно для диагностики, но можно использовать для операций с файлами, в UIRD есть mc, а все диски автоматически монтируются в /mnt/*)

Важные моменты

Указание источника для его поиска, одинаково работает для uird.from, uird.mounts, uird.home, uird.changes

  uird.from=/FOLDER_NAME - поиск папки /FOLDER_NAME в корне всех разделов, всех доступных дисков и уже подключенных источников.
  uird.from=/FOLDER_NAME/file.img - поиск образа file.img в папке /FOLDER_NAME в корне всех разделов, если файл не найден, но найдена папка /FOLDER_NAME, UIRD предложит создать образ, нужно выбрать FS и размер.
  uird.from=/dev/sda1/FOLDER_NAME - папка FOLDER_NAME в корне диска /dev/sda1
  uird.from=LABEL@/FOLDER_NAME - папка FOLDER_NAME в корне раздела с меткой LABEL, вместо метки можно вписать uuid или даже часть uuid, лишь бы часть была достаточно уникальная
  uird.from=nfs://server/FOLDER_NAME - папка в корне nfs ресурса, аналогично и с другими доступными сетевыми протоколами

Списки параметров и подпараметры

Списки разделаются запятыми, подпараметры отделяются двойным двоеточием. Например:

   uird.from=/ROSA-SYSTEM::MNT_OPTS=ro+noexec,/ROSA-DATA

uird.from получил список из двух параметров, у первого есть подпараметр MNT_OPTS=ro+noexec

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

  MNT=/mnt/myfolder - дополнительная точка монтирования
  MNT_OPTS= параметры монтирования, разделенные плюсом
  FORCE=yes - не прерывать загрузку, если источник не найден
  FSCK=yes - проверить FS источника на ошибки перед использованием
  INIT=yes - инициализация источника. Используется совместно с MNT=, после монтирования источника в дополнительную точку монтирования, осуществляется поиск аналогичных каталогов в бандлах и их содержимое копируется в эту точку монтирования. К примеру, если у вас uird.mounts=/myhomes::MNT=/home::INIT=yes, то после монтирования содержимое папок /home со всех бандлов будет скопировано в /home целевой системы, в противном случае папка будет пуста.
  TIMEOUT=3 количество попыток подключения источника

Параметры в конфигурационных файлах uird и в cmdline ядра

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

  uird.from=/ROSA-DATA - заменит значение из конфига
  uird.from+=/ROSA-DATA - добавит /ROSA-DATA к списку источников, которые уже есть в конфиге


Сборка uird

Для сборки UIRD в Росе или под Барием можно использовать пакет из репозитория:

   dnf install mkuird 
   mkuird Имя_конфига

Имя_конфига здесь имя конфигурационного файла uird из:

   /usr/share/uird/configs/uird_configs

Конфигов для бария там нет нужно будет доставать из готового UIRD или из сборочных скриптов бария на abf.io.

Сборка uird из исходников

   git clone --recursive https://github.com/neobht/uird.git
   cd  uird
   ./make_busybox.sh
   ./make_dracut.sh

Зависимости необходимые для сборки UIRD приблизительно соответствуют зависимостям пакета dracut, можно установить его чтобы не устанавливать пакеты по одному. Отсутствие бинарных файлов предоставляющих дополнительный функционал не помешает сборке uird, смотрите лог сборки. Это например aria2, qemu-img и проч.

   ./mkuird Имя_конфига

Если в результате UIRD не будет собран, смотрите лог дракута ./dracut-uird.log

Полезные ключи mkuird:

Исключения:

   -e список,исключений,через,запятую

Тут могут быть модули ядра, модули дракута, исполняемые команды ; или группы модулей, исполняемых файлов и модулей дракута. Смотрите mkuird.cfg. Например:

   ./mkuird MagOS -e plymouth,qemu-img,KM_virt

Ядро:

-k версия_ядра (так как называется папка с модулями ядра в /lib/modules)

UIRD будет собран под указанное ядро, вместо текущего.