Концепт режима сохранения в модуль

Давно думал над изменениями в наших режимах сохранения в модуль и вот такая получилась идея.

  • не трогаем то что есть, а делаем отдельный режим например uird.mode=toxzm
  • функция обрабатывается уже после подключения модулей, это позволит не только распаковывать модуль, но и монтировать.
  • ввиду того, что не реально передать параметрами все варианты подключения, сборки модуля фильтров и т.д в uird.changes= указываем не имя модуля, а имя конфига, в котором все это описано.
  • в uird.changes может быть указано, как имя конфига так и имя папки, в таком случае имя для конфига генерится, также как сейчас имя модуля для machines. То есть работает с привязкой к машине.
  • если конфига еще нет, он создается с простейшим шаблоном.
  • конфиг содержит секции для каждого модуля (можно сохранять в несколько модулей с разными фильтрами), по умолчанию секция одна.
  • конфиг содержит следующие поля для каждой секции:
    • имя модуля с путем относительно конфига по дефолту ./имя-как-у-конфига.xzm
    • как подключать (mount, copy)
    • пересобирать или нет (как dynamic,static)
    • конкатенация с предыдущей версией (да,нет), если пусто то зависит от mount,copy
    • фильтры для файлов и папок в модуле, типа savelist или uird.load/noload

Пересборку при выключении наверное лучше сделать с uird.shutdown, чтоб не только в магос работало.
Предлагаю обсудить ибо работы много, и делать это если оно никому не надо - глупо.

Кусочек из обсуждения с Антоном в телеграм:

Anton Goroshkin, [05.01.20 13:30]
Как то сложно. А чего сейчас не хватает?

Александр Бетхер, [05.01.20 13:30]
Монтирования

Anton Goroshkin, [05.01.20 13:30]
Вроде ведь все необходимое уже есть

Александр Бетхер, [05.01.20 13:30]
В несколько модулей сохранения нет. Ингваро такое у себя делает.

Anton Goroshkin, [05.01.20 13:30]
Монтирование надо делать модулями все же

Александр Бетхер, [05.01.20 13:32]
Мне казалось наоборот проще. Все что надо в одном конфиге. Без /savelist и /savetomodule

Александр Бетхер, [05.01.20 13:32]
без папок static и dynamic

Александр Бетхер, [05.01.20 13:32]
И один режим против двух

Anton Goroshkin, [05.01.20 13:33]
в ченджес это не нужно. Тут надо модулями гибко делать. Просто фильтрами load рулить

Anton Goroshkin, [05.01.20 13:33]
То есть делать в modules/static

Anton Goroshkin, [05.01.20 13:33]
и туда changes писать

Александр Бетхер, [05.01.20 13:34]
Потом надо этот модуль еще склеивать с ченджез

Anton Goroshkin, [05.01.20 13:34]
Склейка - это мне кажется уже костыль

Александр Бетхер, [05.01.20 13:34]
Если монтировать и при этом сохранять то как не клеить то?

  1. Основной режим сохранения у меня один - это пользовтельский
    Для сохранения модуля с пользовтельскими изменениями приспособил папку /machines/
    Вроде мешать UIRD не должно
    Но если войти в систему как root или установить хоть один пакет то это будет режим обновления системы. Конечно правильнее обновлять систему допустим через rpmdrake2xzm т к ничего лишнего не пишется. Но и создается каждый раз отдельный модуль
    Обновлять систему через режим обновления системы проще. Т к все пишется в один модуль и ничего более делать не надо. Хотя обновление системы для стабильной версии дистра достаточно редки
    На оба режима сохранения свои фильтры
    Настраивается режимы сохранения в MagOS.ini

  2. Писалка модуля с изменениями - 81-savetomodule
    Этот скрипт опять же от МагОС. Еще на старом форуме было обсуждение
    Но /.savetomodule задается допустим -

/Linux//Mageia/machines/46-save-home.xzm

Пробовал режим

uird.mode=changes uird.changes=/MagOS-Data/changes.xzm

И /.savetomodule после загрузки системы получался -

/memory/data/mounts/0/Linux/Mageia/modules/46-changes.xzm

Если задать этот режим в uird + писалка от МагОС(80-savetomodule)
То модуль у меня вроде сформировался
Но пробовал кода */.savetomodule задается системой

/memory/data/mounts/0/Linux//Mageia/modules/46-changes.xzm

То штатная писалка от МагОС(80-savetomodule) модуля не создает и система ругается на путь
Ну пока остался на 81-savetomodule
Работает от UIRD. Все пишет …

С конфигом для модуля можно и более сложные алгоритмы делать. Например максимальный размер модуля задавать после которого создается новая секция, а предыдущая секция переключается с копирования модуля на монтирование и отключается его пересборка.
Ингваро, а по теме что скажете?

Это же вроде сохранение пользовательских изменений.
В принципе такой же как и uird.mode=machines, кот запоминает изменения системы для конкретной машины. Режим вроде нужный и при периодическом тестировании оборудования может как раз пригодиться. Но у меня такой надобности сейчас нет а наоборот.
На другом компе мне надо просто продолжить прерванную работу.
Допустим один скрипт проверял и отлаживал на трех компах
Так может просто дописать machines для записи модуля с изменениями. Допустим

uird.mode=machines uird.changes=changes.xzm

По дефолту можно писать в папку /machines/
А папки static и dynamic пусть нынешний вариант uird.mode=machines пользует

  1. Еще раз хочу отметить писалку 81-savetomodule , который вроде как он остался к сожалению не у дел
    У меня работает и за все время ни одного сбоя. Я только добавил удаление зависших теней.
    Опять же на старом форуме было обсуждение.
    Путь тут задается раздельно. Допустим на моем нетбуке

/.devsearch содержит
devpart=/dev/mmcblk0p4

/.savelist
сюда копируется один из двух фильтров

/.savetomodule содержит
/Linux/Mageia/machines/46-save-home.xzm

Причем devpart вычисляется у меня при загрузке системы. А при выключении инфа о devpart просто считывается и формируется /.devsearch для писалки

Управление через MagOS.ini

DISTR=Mageia
BASEDIR=/Linux/$DISTR/base
SAVE_BASE=42-save-base.xzm
FIRSTBOOT=40-firstboot.xzm
RPMBASE=49-rpmbase.xzm
HOMEDIR=/Linux/$DISTR/machines
SAVE_HOME=46-save-home.xzm
MACHINES_FL=/Linux/$DISTR/machines/dynamic

MACHINES_FL - это я переписываю путь для uird.mode=machines
Не воспринимает 81-savetomodule путь допустим /memory/data/mounts/0
Так же не удалось, в свое время, мне считать конфиг /etc/sysconfig/MagOS при выключении системы. Хоть как задавал. Не считывается и все тут.
Поэтому то и перенес конфиг в папку /memory/etc
Тут она для 81-savetomodule всегда под рукой

Копирование или монтирование модуля может так задавать ?

Монтирование

uird.mode=machines uird.changes=changes.xzm

Копирование в память

uird.mode=machines uird.changes+=changes.xzm

По сути это ведь просто дублирование функционала. Нового функционала не вносится.

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

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

В общих чертах готово. Бранч в гит uird - newmode.
Работает это так. Первый старт, то есть когда модуля еще нет:
uird.mode=toxzm - включаем режим
uird.shudown - включаем сохранения в /run/initramfs
дальше варианты:

uird.changes=/existing_folder/new.cfg
создаст конфиг в “existing_folder” с именем “new.cfg”, при сохранении модуль будет иметь имя new.xzm (то есть по имени конфига). Если далее конфиг не трогать будет работать как сейчас сохранение в модуль.

uird.changes=/existing_folder
создаст конфиг в “existing_folder” с именем привязанным к железу (mac или vga как сейчас у machines), при сохранении модуль будет иметь имя “имя_конфига”.xzm. Если конфиг не трогать будет работать как сейчас machines в dynamic.

Когда конфиг уже существует достаточно его имени, найдет сам.

Теперь по конфигу. По дефолту такой:
XZM0=mac-dc0ea1fbbb19.xzm (имя модуля по имени конфига)
MODE0=copy (режим подключения, второй вариант mount)
REBUILD0=yes (пересобирать или нет, аналог static/dynamic, варианты yes/no)
ADDFILTER0=’’ (список через пробел чего надо включить, пустой список означает включить все)
DROPFILTER0=’’ (список через пробел чего нужно исключить из выбранного ADDFILTER)
SQFSOPT0=’’ (параметры для mksquashfs - сжатие, размер блока и т.д.)

Ноль в конце имен параметров это идентификатор первого модуля, можно сохранять в несколько модулей с разными настройками, тогда у второго будет идентификатор 1 у третьего 2 и т.д. Например один модуль может иметь имя привязанное с mac и туда сохраняете только /etc, а второй модуль используется для всех машин один и туда сохраняете все остальное.


Тут собранный с бранча newmod uird под последнюю сборку MagOS.

Изменения не особо большие, кстати. Плюс одна строка в uird-init, плюс одна функция в либе и переделанный скрипт для shutdown. Раньше он работал с machines (что было проблемно использовать в магос из-за обработки machines в скриптах) теперь работает с toxzm.

Что то не могу я найти newmode - https://github.com/neobht/

Наверно можно использовать MagOS.ini ?
Или по новому - /etc/MagOS/config

Нет. В конфиге только то, что относится к модулю и он должен быть рядом с модулем.


Допилил MAXCOPYSIZE для модуля. Значение задается в метрах. Если значение указано, то при старте проверяется размер, если размер модуля больше указанного модуль переводится в режим mount и создается секция в конфиге по которой при выключении машины будет создан новый модуль но уже в режиме copy. Учитывая, что предыдущий модуль не является результатом склейки, то в нем должны сохраниться тени, что при монтировнии учтется.
Дефолтный конфиг, теперь выглядит так:
XZM0=mac-dc0ea1fbbb19.xzm
MODE0=copy
REBUILD0=yes
ADDFILTER0=’’
DROPFILTER0=’’
SQFSOPT0=’’
MAXCOPYSIZE0=’’

Если после сменить MAXCOPYSIZE0 на например 10, то при достижении модулем 10 мегабайт UIRD изменит конфиг на такой:
XZM0=mac-dc0ea1fbbb19.xzm
MODE0=mount
REBUILD0=no
ADDFILTER0=’’
DROPFILTER0=’’
SQFSOPT0=’’
MAXCOPYSIZE0=10
XZM1=mac-dc0ea1fbbb19_next.xzm
MODE1=copy
REBUILD1=yes
ADDFILTER1=’’
DROPFILTER1=’’
SQFSOPT1=’’
MAXCOPYSIZE1=10

То есть первый модуль монтируется и не пересобирается, второй копируется и пересобирается. Если второй модуль также достигнет установленного предела произойдет тоже самое, то есть добавится секция для третьего модуля, а второй будет MODE=mount REBUILD=no.

Без указания MAXCOPYSIZE будет работать по конфигу без автоматики.

P.S. Вверху по ссылке UIRD для последней сборки магос с этими правками. Если решитесь попробовать нужно заменить uird на скачанный и добавить к cmdline ядра к чистому режиму:
uird.mode=toxzm uird.shutdown uird.changes=/существующая_папка
Получите режим приблизительно аналогичный machines.
uird.changes=/существующая_папка/имя_конфига.cfg
Получите аналог сохранения в один модуль.
Дальнейшие настройки смотрите в конфиге, который будет создан в указанной вами папке.

Надо попробовать сделать чуть иначе. Перенести функцию для toxzm до подключения бандлов, а вместо подключения модулей с сохранениями непосредственно в этой функции дописывать имя модуля в uird.load и uird.ro/cp. В файлы с параметрами.
Так UIRDее получится :slight_smile: Можно даже копитурам для этих модулей докрутить наверное.

Если использовать маски для модулей, то наверное можно без конфигов обойтись:
uird.load=changes.xzm uird.ro=changes_mount uird.cp=changes_cp

По сути надо просто “умным” образом реализовать сохранение. Но для этого можно просто написать сценарий и подсунуть его uird.changes=$(ai_saver.sh)

Не нравится мне схема с конфигами вшитыми. Это сложно - мало, кто будет использовать. А вот режим AI какой-нить одной командой активируемый - это другое дело. А уже скрипт может и конфиги и все остальное для себя использовать.

Надо как-то так наверное двигаться.

Я не настаиваю на своем варианте. Давайте думать еще. То что есть сейчас не достаточно управляемо. С конфигами и буквально одной функцией я получил намного больше вариантов работы с сохранениями в модуль. Почитай выше, оно уже работает.
Конфиги я сделал потому, что нужно передать много значений и пихать в cmdline не удобно. Там же не только подключение, но и пересборка. А так все что касается настроек относящихся к работе с сохранением в конкретный модуль лежит в одном месте - в его конфиге. Конфиг создается автоматом и если не нужно ничего сложнее чем аналоги machines или changes.xzm то в конфиг вообще не нужно лезть.

Пробовал.
Из /usr/lib/magos/rc.halt и /usr/lib/magos/rc.halt.pre удалил почти все
UIRD свежее. Задавал в grub2 для папки machines

uird.mode=toxzm uird.shutdown uird.changes=machines/93-new.xzm

uird.shutdown - работает, модули отмонтировались но не формируется 93-new.xzm
В згрузчике mksquashfs нет, но я копировал mksquashfs в /run/initramfs/usr/bin
Может что делаю не так ?

Возможно одного mksquashfs недостаточно, может либы ему нужны. Лучше пересобрать uird наверное, предварительно установив mksquashfs.
Не знаю важно или нет, я писал в uird.changes имя папки начиная со слэша. И самое важное там не xzm должно быть, а cfg после чего uird создаст этот конфиг и уже там пропишет xzm.
То есть uird.changes=/machines/93-new.cfg
Не знаю, кстати, что произойдет если вы укажете 93-new.cfg и при этом 93-new.xzm уже существует. Такой случай не предусмотрел :frowning: Лучше пока новое имя наверное подсунуть, 94-new.cfg :slight_smile:
И не забывайте, что собрать нужно не из мастера, а из бранча. Либо эксперементировать на магосе и взять мой uird.
Мне важно мнение со стороны, насколько это удобно и насколько вообще понятно как это работает. Свое же всегда зашибись, сами знаете :slight_smile:

Тут такой вопрос.

  1. Задал в grub 2 - uird.mode=toxzm …
    И теперь при выключении изменения попадут в модуль.
    Можно ли отменить сохранения модуля ?
    Сейчас я в /etc/MagOS/config пишу SAVETOMODULE=no или перезагружаюсь
  2. Наверно можно для выключения системы задавать uird.shutdown ?
    Или uird.shutdown только для режима сохранения ?
    Вроде шустро отключает