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

Чистить $HOME/ фильтром не совсем удобно
Переменную $HOME mksquashfs не понимает.
Ну а если юзер создаст другого пользователя ?
Придется дописывать фильтр а это трудоемко и не всем понравится
Поэтому то и сделал скрипт кот чистит $HOME для всех введенных пользоватлей
Чистка ведется в /memory/changes. Может не совсем корректно, но учитывая что система уже отключается то это вполне приемлемо
Тем более что пишет изменения toxzm

/usr/lib/magos/rc.halt.pre/11-cleaner - https://cloud.mail.ru/public/4Bdx/5zvPw4obU

На счет $HOME тут дело в том, что скрипт под рутом выполняется, юзер в этот момент даже не залогинен. По этому с переменной не подходит. Можно попробовать шаблон, где вместо $HOME/…

/home/*/...

или

/home/.*/...

Или еще что-то в этом роде, не соображу как правильно.

Можно вероятно сделать в 99-shutdown-uird.sh анализ папки /memory/changes/HOME
и дописывать список исключений
Времени сейчас хватает

Вроде получилось. Добавил две подпроги
99-shutdown-uird.sh - https://cloud.mail.ru/public/kwSo/4xdKiPzK4

99-shutdown-uird.sh положть в /run/initramfs/usr/lib/dracut/hooks/shutdown и просто проверить работу при выключении системы

  1. cleaner_root
    Стр 214 - 220 закоментированы
    А в cleaner_root добавляются исключения учитывая данные в переменной ADDFILTER
    при анализе папки /memory/changes
    Допустим в Росе есть в корне папки bin, sbin, lib, lib64 а в Магее этих папок нет
    Конечно “ненужные” строки в excludedfiles паковку не портят, но лучше когда ничего лишнего

  2. cleaner_home
    В папке /memory/changes/home ищутся директории юзеров и если будут найдены, то будут чиститься

  3. Ср 262 - 266 закоментированы

find $SRC/ -type d | sed 's|'$SRC'||' | while read a ;do|
grep -q "^$a" /tmp/includedfiles && continue|
echo "$a" | grep -vf /tmp/savelist.black | grep -qf /tmp/savelist.white && continue|
echo "$a" >> /tmp/$n/excludedfiles|
done

Долго силился понять что там делается, но учитывая что стр дают большую задержку при больших объемах паковки то просто закоментировал
Вместо них стр 261

``echo “$(cat -t /tmp/savelist.black)” >> /tmp/$n/excludedfiles`

Просто и нет задержек
Опять же если я удаляю из паковки модуля папку, то зачем же мне в excludedfiles описывать содержимое этой папки ?
И по моим данным папки

$HOME/.local/share/RecentDocuments
$HOME/.cache/mozilla

Надо именно удалять из паковки. Т к они могут быть источником зависших теней

  1. Отмечу /tmp/allfiles
    Мои фильтры уменьшились где то на половину
    Т к необходимые исключения вроде формируются в /tmp/allfiles

PS
Есть еще мелкая проблемка, но она проявгляется только у меня

Мой uirdsave.cfg

XZM0=toxzm/base0.xzm
MODE0='mount+wh'
REBUILD0='yes'
ADDFILTER0='boot etc opt root run usr shares var'
DROPFILTER0="$(cat /memory/layer-base/0/optional/base-filtr)"

XZM1=toxzm/home0.xzm
MODE1='mount+wh'
REBUILD1='yes'
ADDFILTER1='etc home var'
DROPFILTER1="$(cat /memory/layer-base/0/optional/home-filtr)"

Но проблем пока нет и особой нужды писать о ней вроде то же нет

Тот кусок, что Вы убрали делает спискифайлов для эксклуда, для каталогов указанных в фильтрах. Я все никак не могу собраться и прпробовать ускорить, если это возможно. Код для фильтров практически такой же как в 80-save2module у Михаила.
В принципе я непротив добавить пред обработку для memory/changes до сборки модулей с сохранениями. Но не хочется дублирования того, что можно сделать фильтрами. Давайте гипотетически предположим задачу, которую не выполнить фильтрами add и drop.

Собственно срочности то нет.

cleaner_root и cleaner_home в toxzm не трогают memory/changes
Они формируют исключения для /tmp/$n/excludedfiles`

cleaner_root на базе списка папок из memory/changes делает список исключений
Папки из ADDFILTER естественно не трогаются
Собственно это инверсия инфы из ADDFILTER

Без cleaner_root для другого дистра возможно надо будет добавлять свои строки (стр 214 - 220 )

		echo "/run" >> /tmp/$n/excludedfiles
		echo "/tmp" >> /tmp/$n/excludedfiles
		echo "/memory" >> /tmp/$n/excludedfiles
		echo "/dev" >> /tmp/$n/excludedfiles # maybe it is not necessary
		echo "/proc" >> /tmp/$n/excludedfiles # maybe it is not necessary
		echo "/sys" >> /tmp/$n/excludedfiles # maybe it is not necessary
		echo "/mnt" >> /tmp/$n/excludedfiles # maybe it is not necessary

Помнится с Магеей были проблемы и пришлось добавить нужные исключения именно сюда
Без правок в этом мести в toxzm были проблемы с сохранением /memory/changes/etc/systemd
Если в фильтре присутствовала строка /sys
То что работает в Росе необязательно будет работать в Магее.
А так все исключения делается автоматически. Просто удобство и Роса и Магея работают
Можно и через фильтр исключать. Я раньше так и делал в 81-save2module
Но там у меня фильтр использовался в mksquashfs без всяких правок от МагОС

А без cleaner_home для каждого вновь введенного юзера придется редактировать фильтр
То же не очень хорошо. А так у меня фильтры уже сократились
А если писать изменения в один модуль то фильтр еще больше сократится
К тому же cleaner_home` для папки /root делает исключения
В свое время пробовал через фильтр чистить /home и по всякому пробовал и ничего не получилось. Для каждого юзера надо прописывать свой путь в фильтрах а это как то хлопотно

Если восстановить этот кусок то может получиться

Но тогда опять появятся задержки при больших объемах паковки

Повторюсь
В toxzm из memory/changes ничего не удаляетсяя а только делаются исключения
Стремился сохранить именно вашу логику работы
Т к непонятно что будет если в toxzm из memory/changes что то начать удалять ?
А чистить удалением можно и из системы при отключении в /usr/lib/magos/rc.halt.pre
Т к система все равно отключается и от нее вроде не убудет

Попробуйте вот такой кусок, в uird еще не проверял, только отдельно:

if [ -n "$ADDFILTER" -o -n "$DROPFILTER" ] ;then
			echolog "Please wait. Preparing excludes for module ${SAVETOMODULENAME}....." 
			# do not create list of all files from changes, if it already exists
				if ! [ -f /tmp/allfiles -o -f /tmp/alldirs ] ; then
					find $SRC/ -type l >/tmp/allfiles
					find $SRC/ -type f >>/tmp/allfiles
					find $SRC/ -type c >>/tmp/allfiles
					sed -i 's|^'$SRC'||' /tmp/allfiles
				fi
				>/tmp/savelist.black
				for item in $DROPFILTER ; do 
					if [ -d "$SRC$item" ] ; then
						echo "$item" >> /tmp/$n/excludedfiles
					else
						echo "$item" >> /tmp/savelist.black 
					fi
				done
				>/tmp/savelist.white
				for item in $ADDFILTER ; do 
					if [ -d "$SRC$item" ] ; then
						echo "^$item" >> /tmp/savelist.white
					else
						echo "$item" >> /tmp/savelist.white 
					fi
				done
				grep -q . /tmp/savelist.white || echo '.' > /tmp/savelist.white
				grep -f /tmp/savelist.white /tmp/allfiles | grep -vf /tmp/savelist.black > /tmp/includedfiles
				grep -q . /tmp/savelist.black && grep -f /tmp/savelist.black /tmp/allfiles >> /tmp/$n/excludedfiles
				grep -vf /tmp/savelist.white /tmp/allfiles >> /tmp/$n/excludedfiles
								
		fi

Должно работать быстрее. Работает также, для файлов можно просто имя, для папок только с полным путем.
Можно значительно ускорить если с грепов переписать на sort и uniq, но тогда вместо шаблонов в фильтры нужно будет писать полные пути для файлов и папок. Потеряем в удобстве. Скотлько секунд у вас уходит на фильтры?

Для папок только с полным путем это со слэшем задавать или без него ?

  1. Задал в фильтре

    magos
    uird

И нужные файлы нашлись
Но задал

sys

И вот нашлось

usr/lib/systemd/system/magos-postinit.service
/usr/lib/systemd/system/reboot.target.wants/magos-reboot.service
/usr/lib/systemd/system/multi-user.target.wants/magos-rc-local.service
/usr/lib/systemd/system/multi-user.target.wants/magos-rc-network.service
/usr/lib/systemd/system/poweroff.target.wants/magos-pre-poweroff.service
/usr/lib/systemd/system/poweroff.target.wants/magos-poweroff.service
/usr/lib/systemd/system/basic.target.wants/magos-postinit.service
/usr/lib/systemd/system/magos-rc-local.service
/usr/lib/systemd/system/magos-rc-network.service
/usr/lib/systemd/system/magos-pre-poweroff.service
/usr/lib/systemd/system/magos-poweroff.service
/usr/lib/systemd/system/magos-reboot.service
/etc/systemd/system/default.target
/etc/systemd/system/tmp.mount
/tmp/systemd-private-a41b02d8e39348669f73a408e240e840-adb.service-lTVCF4/tmp/adb.0.log
/etc/sysconfig/firstboot
/etc/sysconfig/harddrake2/service.conf
/etc/sysconfig/network
/etc/sysconfig/finish-install
/etc/sysconfig/.1~/locales
/etc/sysconfig/.1~/keyboard
/etc/sysconfig/i18n
/etc/sysconfig/keyboard
/etc/sysconfig/desktop
/var/lib/systemd/random-seed
/var/log/syslog

Т е все файлы где в именах есть sys попадают в excludedfiles
Что то неувязочка.
Но файлы и папки с именами syslog, systemd, sysconfig и т д по идее не должны попадать в excludedfiles

Со слэшем и с путем от корня.

Все верно, вы задаете не имя файла, а шаблон для поиска. То есть если написать sys то попадет все где есть sys. Так и раньше работало. Если нужно точнее пишите с путем или с куском пути, чтоб не наловить лишнего. Удобно задавать шаблонами cache, mozilla и так далее. Должны по идее работать и конструкции типа /home/.*cache, но это лучше проверить.

Отдельная обработка для папок сделана вот для какого случая. Допустим у вас есть файл /home/user/bin если не обрабатывать папки отдельно то указав /bin в дропфильтре вы отфильтруете и /bin папку и ваш файл. А сейчас если указать /bin фильтруется только папка в корне.

Вот что получилось
99-shutdown-uird.sh - https://cloud.mail.ru/public/3FkE/2j2LHXYuZ
Положить 99-shutdown-uird.sh в /run/initramfs/usr/lib/dracut/hooks/shutdown
И просто проверить работу при выключении системы
При обновлении ядра :
Обработка фильтров достаточно быстро - ~6 сек
Полное вр работы uird - ~30 сек

В DROPFILTER только шаблоны для поиска файлов
Файлы из EXCLUDFILTER прямо идут в исключения

XZM0=toxzm/base0.xzm
MODE0='mount+wh'
REBUILD0='yes'
ADDFILTER0='boot etc opt root run usr shares var'
DROPFILTER0="$(cat /memory/layer-base/0/optional/search-filtr)"
EXCLUDFILTER0="$(cat /memory/layer-base/0/optional/base-filtr)"

XZM1=toxzm/home0.xzm
MODE1='mount+wh'
REBUILD1='yes'
ADDFILTER1='etc home var'
DROPFILTER1="$(cat /memory/layer-base/0/optional/search-filtr)"
EXCLUDFILTER1="$(cat /memory/layer-base/0/optional/home-filtr)"

С общего фильтра разделение файлов идет плохо и особенно моих бывших
Там было много лишнего
Почистил но все равно нет чистого разделения

Вот мой search-filtr

uird
MagOS
magos
Trash
RecentDocuments
.cache

Все файлы с указанными именами будут удалены.

  1. Строки оставил как было раньше

    			>/tmp/savelist.black
    			for item in $DROPFILTER ; do echo "$item" >> /tmp/savelist.black ; done
    			>/tmp/savelist.white
    			for item in $ADDFILTER ; do echo "$item" >> /tmp/savelist.white ; done
    

Т к ваш вариант на вторую запись у меня дает сбой.
Хотя он вроде ничем не отличается от этого варианта

  1. Работает строка

/home/.*/.cache/mozilla

Но не спешите радоваться.
Если будет строка неустановленного браузера, допустим opera

 /home/.*/.cache/opera

То работа toxzm завершится сбоем и модуля не получится
В этом плане мой подпрога cleaner_home вне конкуренции.
Установлен пакет или нет но чистит все

Подпрогу cleaner_root можно теперь и не использовать но обращаю внимание что основной параметр включения тех или иных папок крня это ADDFILTER (разрешенные папки )
Если писать в фильтре запрещенные папки (допустим /sys /run и т д)
То это будет лишь повторение инфы из ADDFILTER но с инверсией логики
В двух местах что то редактировать представляется мне сложновато и можно ведь и ошибиться
Поэтому у себя cleaner_root оставил
Ну и фильтр проще стал

PS
Главное то простота. В МагОС допустим похожий вариант подготовки исключений то же есть
Но все берется из общего фильтра и как этот фильтр делать я нигде не нашел
А доходить методом проб и ошибок уж больно времяемко
А сейчас фильтры разделены по темам и путаться то не в чем

Все вроде работает !!!

У Вас слишком гвоздями прибито получается. И корзина и кэши и конфиги в хомяке могут иметь другие пути. Фильтр для эксклудов повторяет логику дропфильтра, сложно будет объяснять в чем разница. Возможно имеет смысл добавить в секции PREACTIONS0= и писать туда вообще любой код который выполнится в uird.shutdown при обработке секции. А туда уже можно и чистку $SRC вписывать. И записывать напрямую имена файлов в /tmp/$n/excludedfiles. Надо подумать.

Вероятно вы о cleaner_home .
Так его можно вообще убрать т к скорее всего он лишний. Подобрал
А чистить при отключении системы скриптом из /usr/lib/magos/rc.halt.pre
Это даже вроде предпочтительнее, т к увеличится скорость формирования списка исключений

в предложенных вами правках, DROPFILTER делится на две части

>/tmp/savelist.black
for item in $DROPFILTER ; do 
			if [ -d "$SRC$item" ] ; then
			echo "$item" >> /tmp/$n/excludedfiles
			else
				echo "$item" >> /tmp/savelist.black 
			fi
				done

Но тут надо следить за содержимым DROPFILTER
Если там будет строка

/etc/X11/xorg.conf.old

И если отсутствует файл xorg.conf.old в /etc/X11
То это строка запишется в savelist.black и будет обрабатываться поисковыми строками
Т к в DROPFILTER у меня были строки на все случаи жизни то в savelist.black попадали лишние строки
И отсюда большие задержки при формировании списка исключений, кот у меня наблюдались

Я сделал то же самое, но только вручную

Строки из DROPFILTER - попадают в savelist.black
Строки из EXCLUDFILTER - попадают в /tmp/$n/excludedfiles

Так как ваши правки у меня не прошли. При второй записи модуля наблюдался сбой и модуля не получалось
Строки оставил как было раньше

			>/tmp/savelist.black
			for item in $DROPFILTER ; do echo "$item" >> /tmp/savelist.black ; done
			>/tmp/savelist.white
			for item in $ADDFILTER ; do echo "$item" >> /tmp/savelist.white ; done

Так все работает.
Почему ваши правки не прошли непонятно. Вроде то же самое

  1. Изменил немного
    99-shutdown-uird.sh - https://cloud.mail.ru/public/4RCu/54DW5anJN
    Положить 99-shutdown-uird.sh в /run/initramfs/usr/lib/dracut/hooks/shutdown
    И просто проверить работу при выключении системы

Теперь для каждого модуля формируется свой /tmp/allfiles из тех папок кот разрешены

for a in $ADDFILTER ;do
#sed  -i "s/$a//"  /tmp/changesfiles 2>/dev/null
            if [ -d  "$SRC/$a" ] ; then   
					find $SRC/$a/ -type l >>/tmp/allfiles
					find $SRC/$a/ -type f >>/tmp/allfiles
					find $SRC/$a/ -type d >>/tmp/allfiles					
					find $SRC/$a/ -type c >>/tmp/allfiles
					sed -i 's|'$SRC'||' /tmp/allfiles
           fi
done	

ЗЫ

А почему бы не использовать строку

find $SRC/$a/ -type d >>/tmp/allfiles

Теперь и директории удаляются
Ну вроде все. Теперь только тестировать буду

В DROPFILTER применил шаблон для поиска .cache
Сделал правку

Теперь все директории .cache в списке исключений
Это -
/root/.cache
$HOME/.cache
var/cache/fontconfig/d9b725d3-0a88-4fda-b8e0-061790f2182a-le64.cache-7 и все подобные
var/cache/cups/job.cache

Так что вроде проблема решена.

Может действительно убрать грепы и сравнивать списками. Будет очень быстро, но шаблоны работать не будут. Только имена файлов и папок с полными путями.
Это исключит случайные срабатывания фильтров из-за непродуманных шаблонов и ускорит обработку буквально до секунды.
Как считаете?

  1. Первое что я сделал в МагОС, когда так и не поняв как составляется список исключений, то начал делать его вручную. Как раз только имена файлов и папок с полными путями.
    Фильтр напрямую считывался mksquashfs и без всяких обработок
    Конечно от сборки к сборке накапливается много лишнего, каких то файлов вообще нет но mksquashfs прекрасно сам разбирается с лишними строками.
    И делает это довольно шустро, но все таки трудоемкость есть и у меня нет уверенных знаний системы, что бы порою решить что нужно исключить а что нет
    И сомнительно что бы обычный и даже опытный юзер знал что удалять а что оставлять

  2. Сейчас я на вашей toxzm с изменениями описанными ренее
    Мой последний search-filtr для DROPFILTER

    MagOS
    magos
    magosm
    uird
    .cache
    Trash
    RecentDocuments
    .updated
    old

На счет быстродействия !!!
Задержки были на обновлении ядра. Сейчас собирается список исключений чуть дольше.
Если на обычном выключении я вообще не мог ничего прочесть то при обновлении ядра я хоть что то могу посмотреть и то все прочитать не успеваю.
Похоже задержки у меня давали отсутствующие файлы и папки с полными путями в фильтре
Нет этого файла а поисковик ищет …

Последний 99-shutdown-uird.sh - https://cloud.mail.ru/public/4RCu/54DW5anJN
С быстродействием все ок !!!
В остальных фильтрах у меня сейчас минимум строк.
Можно сказать - три сестры и дядя ваня
По сравнению с ручным сотавлением списка исключений где то на 90 % шаблоны мне подошли

Вот в этом то все и дело. На сколько правомерно поиск исключений из списка allfiles

for a in $ADDFILTER ;do
#sed  -i "s/$a//"  /tmp/changesfiles 2>/dev/null
            if [ -d  "$SRC/$a" ] ; then   
					find $SRC/$a/ -type l >>/tmp/allfiles
					find $SRC/$a/ -type f >>/tmp/allfiles
					find $SRC/$a/ -type d >>/tmp/allfiles					
					find $SRC/$a/ -type c >>/tmp/allfiles
					sed -i 's|'$SRC'||' /tmp/allfiles
           fi
done

Особенно почему в МагОС не используется поиск директорий

find $SRC/$a/ -type d >>/tmp/allfiles

Попробовал шаблоном удалять все .cache
И как результат мой домашний комп (2 Гб ОЗУ) гораздо реже начал подвисать в firefox

PS

Что то нет желающих обсуждать ?
Может, в виду важности темы, на других форумах дать ссылку на тему ?
Может кто что то дельное подскажет ?

Я писал выше почему папки отдельно обрабатываются.
Допустим у вас есть файл /home/bin и его нужно дропнуть. Если папки обрабатывать совместно с файлами (как вы предлагаете) то /bin в дропфильтре удалит и файл /home/bin и весь /bin впридачу. Выбрать только файл можно написав /home/bin, а как в таком случае удалить только папку /bin?

У меня же в DROPFILTER только шаблоны
Поэтому строк с путями типа /home/bin быть просто не должно
Конечно опасно. Но так сделано в том числе для проверки работы поиска исключений по шаблонам. Вообще ведь у меня было много проблем и работало не очень хорошо.
С другой стороны когда задаешь шаблон MagOS а удаляется file:///etc/MagOS/config
то же малопонятно. Удалял одно а удалилось другое. И папка MagOS пустая
А для файлов с путями применил EXCLUDFILTER
Тут строки идут прямо в исключения

О том и речь. Надо придумать чтоб потом не удивляться :slight_smile:

При использовании этой строки удаляются директории
Теперь задаешь шаблон MagOS и он удаляется
Только удаляются в частности /etc/MagOS а так же все папки MagOS в /memory/changes

Извиняюсь за неточности.

Задержки у меня давали закоментированные строки (273 …)

    find $SRC/ -type d | sed 's|'$SRC'||' | while read a ;do
    grep -q "^$a" /tmp/includedfiles && continue
    echo "$a" >> /tmp/$n/excludedfiles
    done

И закоментированные стр как раз и ищут директории
Без них подготовка исключений, при обновлении ядра, прошла быстро
А в этом варианте будут зависания при больших объемах паковки
Формируется includedfiles и если эти файлы находятся в $SRC то они попадают в excludedfiles
Как то многоходовка получается. Не проще ли сразу писать файлы для excludedfiles в отдельном фильтре

Получилось что я вместо этих строк применил

find $SRC/$a/ -type d >>/tmp/allfiles

Для файлов с путями, которые пишутся прямо в excludedfiles, применил фильтр EXCLUDFILTER
И вроде у меня теперь все ок !
Если файла из EXCLUDFILTER нет $SRC то mksquashfs сам неплохо разбирается с отсутствующими файлами в списке
И смысла в закоментированных строках я не нахожу

С этой правкой задержек в подготовке списка исключений в toxzm, при обновлении ядра, нет

Предложенная мною подпрога cleaner_home вроде как лишняя. Просто еще не успел до конца протестировать.
А подпрогу cleaner_root я бы оставил. Так как