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=/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 к списку источников, которые уже есть в конфиге