Инструкция для toxzm

Это заготовка для инструкции к режиму toxzm. По мере обсуждения буду править в этом посте.

Toxzm - режим сохранения в модуль полностью реализованный в uird.
Это альтернатива machines и сохранению в модуль, которым требовались скрипты в системе (80-savetomodule в MagOS). Toxzm никак не пересекается с machines и вы можете выбирать что использовать. При этом режим полностью перекрывает возможности как machines так и сохранения в один модуль и имеет приличное количество своих плюшек.

Включение режима сохранения в модуль в UIRD (подключение модулей при старте системы):

uird.mode=toxzm

Включение сохранения в модуль при выключении (только systemd):

uird.shutdown

При первом старте c этими параметрами UIRD создаст конфиг по которому при выключении будет создаваться модуль.
Расположение конфига (модуль будет там же) задается параметром uird.changes:

uird.changes=/existing_folder  

Если передать имя существующей папки, то имя файла конфига для модуля UIRD сгенерирует сам на основе характеристик железа.
То есть на каждой машине имя будет свое и мы получим аналог machines от MagOS.

uird.changes=/existing_folder/newfile.cfg
                или
uird.changes=/existing_folder/newfile.xzm   

Так имя конфига будет одно для всех машин.
(Первый вариант с .cfg - “правильный”, второй c .xzm для похожести на привычные machines и uird.changes=file.xzm можно использовать такую запись, например, при переходе с “магос сохраненки” на toxzm с тем же модулем).

Конфиг создается при первом старте с uird.mode=toxzm и новым значением в uird.changes, он содержит параметры определяющие как подключать и пересобирать модули.
При старте системы модуль может быть смонтирован либо распаковывается в систему, за это отвечает параметр конфига -MODE0=copy (mount) .
При выключении системные изменения пакуются в новый модуль либо сохраняется старый модуль, а изменения игнорятся. За это отвечает параметр - REBUILD0=(yes/no/once).

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

Теперь подробнее по конфигу.
Дефолтный конфиг выглядит так:

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

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

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

Ненумерованные (XZMaaa=) подключаются последними. Такая секция может быть нужна чтоб гарантированно подключить модуль последним, имеет смысл только с MODE=copy.

Если вместо имени модуля параметру XZM(index)= передать пустое значение, то имя модуля будет сгенерировано на основе характеристик железа. Это позволяет использовать модули для конкретной машины и общие для всех машин в одном конфиге.

Модули в секцииях которые сочетаетают MODE=mount и REBUILD=yes имеют ограничение, в них не сохраняются тени ауфс. Ниже будут примеры как это ограничение можно обойти используя два модуля.

В конфиге можно использовать код, например:

XZM0="$(echo mymod.xzm)"         # не знаю зачем, просто пример :)
                или
ADDFILTER0="$(cat ${CFGPWD}/addfilter.lst)"  # в переменная $CFGPWD путь до папки с конфигом.

Фильтры работают поразному для файлов и папок. Если для файлов это просто вхождение подстроки в строку, то для папок обязателен путь от корня. То есть если .wh.’ это вообще все ауфс тени в любом месте, то /bin это только /bin и его подкаталоги с файлами, но не /usr/bin.

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

XZM0=root.xzm 
MODE0=copy                
REBUILD0=yes              
ADDFILTER0=’/root’             

Сохраняется только папка рут, модуль пересобирается при выключении и распаковывается при старте.

XZM0=mac-dc0ea1fbbb19.xzm 
MODE0=copy                
REBUILD0=yes              
MAXCOPYSIZE0=’20’             

В модуль сохраняется все. Если размер модуля превысит 20 метров UIRD создаст секцию нового модуля с индексом “1”, а секцию модуля “0” переведет в MODE0=mount, REBUILD0=no. Такой режим позволяет совмещать монтируемые модули и сохранение теней.

XZM0=''
MODE0=copy                
REBUILD0=yes              

XZMend=88-magos.xzm 
MODEend=copy                
REBUILDend=no              

Перва секция имеет пустое значение в XZM0, значит на каждой машине там будет свое имя модуля, то есть свой модуль для каждой машины. А вторая секция распаковывает непересобираемый модуль, и он всегда распаковывается последним (поверх всех) независимо от того сколько еще модулей (нумерованных секций) будет создано.

XZM0=module.xzm 
MODE0=mount                
REBUILD0=yes              
            
XZM1=wh.xzm 
MODE1=copy                
REBUILD1=yes
ADDFILTER1='\.wh\..*'

В первой секции модуль монтируется при старте и пересобирается при выключении. Он включает все файлы и каталоги кроме теней aufs.
Модуль во второй секции распаковывается при старте и пересобирается при выключении. Он содержит только тени.
Такой режим также позволяет совмещать монтируемые модули и сохранение теней.

XZM0='system.xzm'
MODE0=copy                
REBUILD0=yes
ADDFILTER0=''
DROPFILTER0='/home'
MAXCOPYSIZE='50'

XZMh=home.xzm 
MODEh=mount                
REBUILDh=yes
ADDFILTERh='/home'
DROPFILTERh=''

В первом модуле системные изменения, во втором хомяк. Модуль с системными изменениями имеет лимит 50 метров, когда он его превысит модуль будет переведен в MODE0=mount, REBUILD0=no и создана новая секция XZM1=system-(дата-время).xzm
При этом последней будет подключаться ненумерованная секция с хомяком. Секция с хомяком поключается MODEh=mount, REBUILDh=yes, не смотря на это проблем с тенями быть не должно так как ниже этого модуля никакие другие модули не содержат файлов в хомяке (это справедливо для МагОС и до тех пор пока хомяк только в одном модуле)

XZM0=system.xzm 
MODE0=none                

Модуль не будет подключаться при обработке параметров модуля из конфига. Вы должны подключать этот модуль стандартым механизмом UIRD, то есть uird.load и uird.ro/cp

XZM0='my.xzm'
ADDFILTER0='/root
            /home
            /etc'
DROPFILTER0="$(cat $CFGPWD/drop.lst)"

Пример фильтров в несколько строк и из файла.

XZM0=mod.xzm
MODE0=mount+wh
REBUILD0=yes

Режим mount+wh позволяет сохранения с учетом теней в один монтируемый модуль. Тени ауфс при этом разбираются скриптом, а не самой ауфс. Не рекомендуем использовать такую секцию в сочетании с другими, сложно предположить что произойдет с тенями в каждом конкретном случае.

XZM0=zsave.xzm
MODE0='none'
REBUILD0='yes'

XZM1=zwhiteout.xzm
MODE1='copy'
REBUILD1='yes'
ADDFILTER1="$(find /memory/changes/ -perm 0000 |sed 's:/memory/changes::')"

Аналог четвертого примера, но при загрузке с overlayfs. В первый модуль пишутся файлы, во второй тени. Первый модуль должен монтироваться вместе с остальными (uird.ro, uird.load) так как оверлей не умеет горячее подключение слоев. Второй модуль хранит тени, для оверлея это файлы с теми же именами, но с нулевыми правами.

Дополнительные параметры (флаги) для uird.shutdown:

  • log включить журналирование, логи ищите рядом с конфигом и модулями.
  • ask спрашивать всякий раз перед созданием нового модуля
  • shell консоль перед созданием модуля
  • haltonly не создавать модуль при ребуте, создавать только при выключении.
  • silent работать молча, минимум информации на экран.

Пример:

uird.shutdown=log,ask

Дополнительные параметры для uird.mode=toxzm:

  • EXT=pfs - расширение для модулей, по умолчанию - xzm
  • MODE REBUILD DROPFILTER ADDFILTER SQFSOPT MAXCOPYSIZE - параметры для дефолтной секции
  • FSCK SGN MNT_OPTS TIMEOUT и т.д. параметры для монтирования папки в которой лежит конфиг, работают аналогично uird.from, uird.mounts

Пример:

uird.mode=toxzm::EXT=pfs::TIMEOUT=2::MODE=mount

Еще же есть параметры : lowuptime, silent
Или их лучше не трогать ?

silent - надо добавить, забыл. А lowuptime мне кажется не нужен, нет? Ильфат тоже спрашивал.

  1. А как заблокировать загрузку уже созданных toxzm модулей при старте системы.
    Вроде uird.noload не помогло

  2. Режим Machines для toxzm вероятно уже лишний ?

Изменить режим. uitd.mode=clean, а если моде=ноне то да, uird noload

Нельзя же юзеров так головой об стену. Пусть пока и то и то будет, а дальше будем посмотреть. Uird вот год был в сборках прежде чем основным стал.
З.Ы. Вчера еще кой чего допилил. Пример номер 9 в инструкции.

С другой стороны будет путаница. Старый режим да новая версия
Что лучше да что хуже ?
Это же все объяснять придется на форуме.
К примеру на Магее запуск через initrd.gz у меня изначально не получился а uird заработал с первого раза. Зачем же мне совместимость с initrd.gz ?
Toxzm может сам выключать систему и писать модули. Это позволило мне сократить папки /usr/lib/magos/rc.halt и /usr/lib/magos/rc.halt.pre
А это минимизация вмешательства в систему
Что то же очень неплохо.
И плюс пакует у меня гораздо быстрее чем писалка из /usr/lib/magos/rc.halt