UIRD - Unified Init Ram Disk system
Shell
Switch branches/tags
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.

README.md

UIRD - Unified Init Ram Disk system

Унифицированная система инициализации для модульных Linux систем.

Join the chat at https://gitter.im/uird/discussion

Базовое описание основных принципов

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

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

* Отсутствие привязки к конкретному дистрибутиву
* Отсутствии привяки к конкретным каталогам для поиска источников
* Возможность подключения практически любых источников, которые можно смонтировать в linux 
* Поддержка различных сетевых протоколов для загрузки по сети
* Адаптация UIRD под вашу ОС сводится к написанию одного конфигурационного файла

Параметры командной строки

Ввиду множественности параметров ядра введен префикс параметров 'uird' (Unified Init Ram Disk):

* uird.параметр=значение - присвоить новое значение, которое заменит значение по умолчанию;
* uird.параметр+=значение - добавить значение к списку дефолтных значений

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

Основные параметры

* uird.ro[+]=                - фильтр для модулей/директорий, которые монтируются в режиме RO
* uird.rw[+]=                - фильтр для модулей/директорий, которые монтируются в режиме RW
* uird.cp[+]=                - фильтр для модулей/директорий, содержимое которых копируется в корень
* uird.copy2ram[+]=          - фильтр для модулей/директорий, которые копируются в RAM
* uird.load[+]=              - фильтр для модулей/директорий, которые необходимо подключить на этапе загрузки
* uird.noload[+]=            - фильтр для модулей/директорий, которые необходимо пропустить во время загрузки
* uird.from[+]=              - источники, где лежат модули/директории для системы
* uird.home=                 - источник, где хранятся домашние директории пользователей 
* uird.changes=              - источник, где хранить персистентные изменения
* uird.mode=MODE             - режим работы сохраниениями (clean, clear, changes, machines)

Параметры для более сложных конфигураций

* uird.cache[+]=             - источники, в которые стоит синхронизировать модули/директории 
* uird.copy2cache[+]=        - фильтр для модулей/директорий, которые копируются в КЭШ
* uird.homes[+]=             - источники, где хранятся домашние директории пользователей (объединяются AUFS) 
* uird.mounts=               - источники , которые будут смонтированы в указанные точки монтирования
* uird.find_params[+]=       - параметры для утилиты find при поиске модулей (например: -maxdepth,2)
* uird.help                  - печатает подсказку по параметрам UIRD
* uird.break=STAGE           - остановка загрузки на стадии STAGE и включение режима отладки (debug) 
* uird.scan=                 - поиск установленных OC и компонентов для определения параметров uird
* uird.swap=                 - список SWAP разделов и/или файлов для подключения, разделитель в списке ";" или ","
* uird.syscp[+]=             - список файлов (каталогов) для копирования из UIRD в систему /путь/файл::/путь/каталог 
* uird.basecfg=              - расположение базового конфигурационного файла basecfg.ini
* uird.config=               - расположение конфигурационного файла системы MagOS.ini
* uird.sgnfiles[+]=          - перечисление файлов-маркеров для поиска источников указанных в uird.from= в соответсвии с их порядком перечисления
* uird.ramsize=              - размер RAM
* uird.ip=                   - IP:GW:MASK , если не указан, то используется DHCP
* uird.netfsopt[+]=          - дополнительные опции монтирования сетевых ФС: sshfs,nfs,curlftpfs,cifs
* uird.aria2ram=             - список источнико которые нужно скопировать из сети в RAM до начала поиска uird.from 
* uird.freemedia             - освободить (размонтировать) источники, используется совместно с uird.copy2ram 
* uird.force                 - продолжать загрузку не задавая вопросов если источник не найден
* uird.run[+]=               - запуск внешних исполняемых файлов
* uird.zram                  - использовать zram вместо tmpfs
* quickshell, qs - консоль на начальном этапе работы uird-init
* qse - консоль в конце работы uird-init
* debug - подробный вывод и приостановка uird-init на нескольких этапах работы

В качестве значений параметров могут быть использованы команды shell:

* uird.from="/MagOS;$( eval [ $(date +%u) -gt 5 ] && echo /MagOS-Data)" - подключать MagOS-Data только по выходным
* uird.changes="$(mkdir -p /MagOS-Data/changes && echo /MagOS-Data/changes)" 
* $(udhcpc)  - поднять сеть (eth0 dhcp)

Для более подробного описания параметров смотрите встроенную [подсказку] (https://github.com/neobht/uird/tree/master/initrd/usr/share/uird.help)

Типы источников

  • **/path/dir**                 - директория на любом доступном носителе
    
  • **/dev/[..]/path/dir**        - директория на заданном носителе
    
  • **LABEL@/path/dir**           - директория на носителе с меткой LABEL
    
  • **UUID@/path/dir**            - директория на носителе с uuid UUID
    
  • **file-dvd.iso, file.img**    - образ диска (ISO, образ блочного устройства)
    
  • **http://server/path/...**    - источник доступный по HTTP (используется httpfs) 
    
  • **ssh://server/path/...**     - источник доступный по SSH (используется sshfs)
    
  • **ftp://server/path/...**     - источник доступный по FTP (используется curlftpfs)
    
  • **nfs://server/path/...**     - источник доступный по NFS 
    
  • **cifs://server/path/...**    - источник доступный по CIFS 
    

Порядок инициализации системы

Упрощенная схема, не учитывающая параметры uirtd.cache, uird.mounts, uird.homes и проч. Более подробную информацию ищите во встроенной справке по конкретным параметрам.

  1. Осуществляется поиск конфигурационного файла по пути, указанному в параметре uird.basecfg= (дефолтное значение задается при сборке uird)

  2. Устанавливаются параметры из конфигурационного файла, которые еще не установлены в параметрах ядра

  3. Происходит монтирование источников base-уровня в порядке, указанном в параметре uird.from=

  4. Происходит монтирование источников home-уровня, согласно параметру uird.home=

  5. Происходит подключение в самый верхний уровень AUFS источника персистентных изменений, указанного в параметрами uird.changes=, uird.mode=

  6. Осуществляется синхронизация base уровня в RAM с учетом параметра uird.copy2ram=

  7. Осуществляется поиск модулей/директорий в RAM и base-уровне и подключение их на [верхний-1] уровень AUFS или копирование в корень (с учетом фильтров, указанных в параметрах uird.load=, uird.noload=,uird.ro=,uird.rw=,uird.cp=) со следующим приоритетом:

                        uird.load --> uird.noload
                        uird.cp --> uird.rw --> uird.ro
    
  8. Выполняются скрипты rc.preinit

Структура системной директории

  /memory/
  ├── bundles                   - точка монтирования модулей
  │   ├── 00-kernel.xzm
  │   ├── 01-firmware.xzm
  │   ├── 10-core.xzm
  │   ├── 80-eepm-1.5.2.xzm
  │   └── ...                   - и т.д.
  ├── changes                   - точка монтирования для хранения изменений 
  │   ├── etc
  │   ├── home
  │   ├── memory
  │   ├── run
  │   ├── var
  │   └── ...                   - и т.д.
  ├── data                      - точка монтирования источников
  │   ├── cache                     - кеш уровня
  │   ├── homes                     - homes уровня
  │   ├── mounts                    - mounts уровня
  │   ├── machines                  - машинно-зависимых изменений
  │   └── from                      - базового уровня
  ├── copy2ram                  - точка монтирования для синхронизации модулей/директорий в ОЗУ
  ├── layer-base                - точка монтирования базового уровня
  │   ├── 0                         - ресурс первого источника
  │   ├── 1                         - ресурс второго источника (в порядке перечисления в uird.from=)
  │   └── ...                       - и т.д.
  ├── layer-cache               - точка монтирования кеш уровня
  │   ├── 0                         - ресурс первого источника
  │   ├── 1                         - ресурс второго источника (в порядке перечисления в uird.cache=)
  │   └── ...                       - и т.д.
  ├── layer-homes               - точка монтирования homes уровня
  │   ├── 0                         - ресурс первого источника
  │   ├── 1                         - ресурс второго источника (в порядке перечисления в uird.homes=)
  │   └── ...                       - и т.д.
  ├── layer-mounts               - точка монтирования mounts уровня
  │   ├── 0                         - ресурс первого источника
  │   ├── 1                         - ресурс второго источника (в порядке перечисления в uird.mounts=)
  │   └── ...                       - и т.д.
  ├── cmdline                   - системный файл для хранения дополнительных параметров командной строки
  └── MagOS.ini.gz              - системный файл для хранения конфигурационного файла

Пример конфигурационного файла MagOS (используется при сборке UIRD для MagOS-linux)

  uird.config=MagOS.ini
  uird.ramsize=70%
  uird.ro=*.xzm;*.rom;*.rom.enc;*.pfs
  uird.rw=*.rwm;*.rwm.enc
  uird.cp=*.xzm.cp,*/rootcopy
  uird.load=/base/,/modules/,rootcopy
  uird.noload=/MagOS-Data/changes,/MagOS-Data/homes
  uird.from=/MagOS;/MagOS-Data
  uird.find_params=-maxdepth_3
  uird.mode=clean 
  uird.changes=/MagOS-Data/changes
  uird.syscp=/livekitlib::/usr/lib/magos/scripts;/uird.scan::/usr/lib/magos/scripts;/liblinuxlive::/mnt/live/liblinuxlive

Расширения в поддерживаемые в MagOS Linux с этим конфигом:

*.ROM - RO слой
*.RWM - RW слой
*.XZM - RO слой с squashfs 
*.XZM.CP - распаковывается в корень системы
*.RWM.ENC - RW слой криптованый
*.ROM.ENC - RO слой криптованый

Реализация

В основе реализации лежит набор скриптов инициализации dracut (модули base, kernel-modules ) и скрипты uird (livekitlib+uird-init).

cmdline-hook: parse-root-uird.sh (заглушка)
mount-hook: mount-uird.sh (выполняет скрипт uird-init)
  • livekitlib - содержит библиотеку функций системы инициализации.
  • uird-init - последовательно выполняет набор функций из livekitlib и осуществляет каскадно-блочное монтирование модулей системы в единый корень AUFS в директорию указанную в переменной dracut $NEWROOT.