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

Сделал коммит вот с такой функцией:

wh_exclude() {
find $1 -name '.wh.*' |sed -e "s:$1::" -e  's/\/.wh./\//' > /tmp/wh_files
find ${SYSMNT}/changes/ |sed "s:${SYSMNT}/changes/:/:" > /tmp/ls_changes
find $2 |sed "s:$2/:/:" > /tmp/ls_bundle
cat /tmp/wh_files /tmp/ls_bundle |sort |uniq -d > /tmp/wh_exclude
cat /tmp/wh_files /tmp/ls_changes |sort |uniq -d |sed -r 's:^(/.*/)(.*):\1.wh.\2:' >> /tmp/wh_exclude
rm /tmp/ls_bundle /tmp/wh_files /tmp/ls_changes
}

По идее на больших списках должно работать в разы быстее чем цикл фор, тем более с find внутри. На небольших может наоборот медленнее работать, но не думаю что заметно. Но надо проверять. Ингваро, прогоните на своих проблемах с cups. С простым тестом прошло вроде нормально.
З.Ы. Можно еще ускорить немного если обойтись без временных файлов.

За вами то и не угонишся
У меня модифицированный DdShurick работает

wh_exclude() {
echo ‘’ > /tmp/wh_exclude
find $1 -name ‘.wh.*’ |sed “s:$1::” | while read WH ; do
F=$(echo $WH | sed ‘s/.wh.//g’)
FS=$( find “${SYSMNT}/changes”"$F" -print 2>/dev/null )
#. if [ -e ${SYSMNT}/changes/$F ] ; then
if [ -n “$FS” ] ; then
echo $WH >> /tmp/wh_exclude
echo “” >> /tmp/wh_files
echo “F=$FS” >> /tmp/wh_files
echo “WH=$WH #delete” >> /tmp/wh_files
else
echo ‘’ >> “$LOGUIRD/wh_exclude.log” && echo “WH=$WH” >> /tmp/wh_files
#. elif [ -e $2/$F ] ; then
#. echo $F >> /tmp/wh_exclude
fi
done
}

Для удаленных теней выводится в логи найденный файл тени а сама удаленная тень отмечается как #delete
Все !!! Зависших теней нет. Даже как то пусто стало и уныло

  1. Фильтры у меня в Магее стали теперь со слэшем (было без слэша)
    Пробовал задать

/etc/MagOS
/var/log
/usr/share/plymouth/themes/breeze-magosm

Работает
Это вы то то сделали или я что напутал ?

  1. Заблокировал в фильтре /usr/share/plymouth/themes/breeze-magosm
    Теперь у меня получился полноценный toxzm и Plymouth даже работает
    Но как то нетрадиционно для меня.
    Я всегда изменения писал да магос-модуля
    Т е старался разделить систему и магос. И я мог, например, на одной сборке делать два запуска.
    Магеиа-МагОС и LiveDVD для Магеи
    И то же самое для Убунту

  2. Пробовал установит конфиг для toxzm в /memory/layer-base/0
    Теперь я могу задать запись модуля в любую папку. Допустим

XZM0=/toxzm/uirdsave.xzm
или
XZM0=/base/uirdsave.xzm
или
XZM0=/machines/uirdsave.xzm

  1. Вывод логов понравился. Информативно, емко и все в одном месте

А почему вы удаляете тени, но закомментарили удаление файлов?
Если файл в бандле надо его удалять.

Может что недопонимаю но ведь две ситуации
1)

Если встречается

file + .wh.file = .wh.file
это file с предыдущей записи
И свежий .wh.file из /memory/changes
То file автоматически нигелтруется в образе aufs

Т е нечего удалять

Если встречается

.wh.file + file = .wh.file +file
То есть .wh.file с предыдущей записи
И свежий file из /memory/changes
Тут то .wh.file и надо удалять

Проверял раньше на тесте эти ситуации
Ну и пршел тест для проблемного сервиса cups

модифицированный DdShurick работает просто
Находится тень и если в образе сборки находится файл тени то тень удаляется
Поиск файла мне пришлось сделать на find
Т к условие if [ -e … ] работало у меня в Магее некорректно
Скорее всего basybox не так собрался

При монтировании с shwh тени не работают. Ауфс их рассматривает как обычные файлы. То есть если в одном слое файл, а в другом его тень в ауфс будет и файл и его тень. Если мы запакуем это в модуль то получим модуль в котором есть файл и его тень. Это не допустимо. Получается, что либо файл либо тень нужно перед запаковкой удалить (отфильтровать).
Если файл в ченджез то удаляем тень.
Если файл в старом модуле удаляем файл.
Во всех остальных случаях в shwh ауфс будет либо файл, либо тень. Это нормально и ничего делать не нужно.

P.S. Похоже был не прав. Если файл “накрыт” тенью то файла не будет в ауфс. То есть удалять надо только тени файл исчезнет сам.

Ну для верности действительно можно и оставить удаление файла.
Вдруг не удалится. Все таки basybox не полноценная ОС.
Мало ли что

А он и не удалится. И чего делать бедному ауфсу когда он видит тень и файл в одном и том же слое? Имею виду ауфс в uird, не shwh. Такую ситуацию допускать нельзя.

Только провел тест. Опять же на проблемном cups
Где uirdsave.xzm мой модуль сохранения

  1. Деактивировал cups из systemd. Выключился с сохранением
    В /memory/bundles/uirdsave.xzm/etc/systemd/system появились тени cups
  2. Активировал cups в systemd. Выключился с сохранением
    В /memory/bundles/uirdsave.xzm/etc/systemd/system появились файлы cups
    Если снова деактивировать cups из systemd то должны в модуле сохранения быть и файлы и тени
  3. Деактивировал cups из systemd. Выключился с сохранением
    В /memory/bundles/uirdsave.xzm/etc/systemd/system появились тени cups
    Файлов cups нет
  4. Активировал cups в systemd. Выключился с сохранением
    В /memory/bundles/uirdsave.xzm/etc/systemd/system появились файлы cups
    Теней cups нет

mageia printer.target.wants # systemctl status cups
● cups.service - CUPS Scheduler
Loaded: loaded (/usr/lib/systemd/system/cups.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2020-02-05 15:03:31 MSK; 16min ago
Docs: man:cupsd(8)
Main PID: 7845 (cupsd)
Status: “Scheduler is running…”
Memory: 5.2M
CGroup: /system.slice/cups.service

Если вы на счет удаления файла, то тест должен быть не таким.
Создаете файл, к примеру /usr/111, перегружаетесь. Файл в модуле. Удаляете файл и снова перегружаетесь. Смотрите что у нас в системе, есть ли файл. И главное смотрите что в модуле. Там должна быть только тень. Если в модуле и файл и тень то все работает не правильно и ждите грабли типа тень-тени или еще чего. Если тень еще и в системе видна то всё, кранты, сушите весла :))

Еще раз обновил wh_exclude. Теперь выглядит так:

wh_exclude() {
find $1 -name '.wh.*' |sed -e "s:$1::" -e  's/\/.wh./\//' > /tmp/wh_files
(cat /tmp/wh_files ;  find $2 |sed "s:$2/:/:" )   |sort |uniq -d > /tmp/wh_exclude
(cat /tmp/wh_files ; find ${SYSMNT}/changes/ |sed "s:${SYSMNT}/changes/:/:" ) |sort |uniq -d |sed -r 's:^(/.*/)(.*):\1.wh.\2:' >> /tmp/wh_exclude
rm /tmp/wh_files 
}

Если проблем не выявится так и оставлю. Простые тесты проходит.

Тут мысль пришла.
Все мои рассуждения о файлах и тенях относится к ситуации когда файлы и их тени генерирует система ( в частности Магеиа в моем случае).
AUFS каким то непонятным для меня образом различает тени верхнего ровня, т е сделанные системой. И тени нижнего уровня
Если в модуле удалить .wh…wh.aufs то локальные тени нигелируются.
Тени верхнего уровня останутся.
А может она и файлы то же различает ?
Возможно когда файл генерируется локально ( в uird или в pfs), то ситуация может быть и такая

file + .wh.file = file + .wh.file

Т е действительно может оказаться что файл из старого модуля не удалится тенью из /memory/changes. Т к тень системная а файл из старого модуля может быть локальным
Но я стараюсь не “влазить” сильно в систему и поэтому то таких ситуаций у меня вероятно нет
Т е строчки

elif [ -e $2/$F ] ; then
echo $F >> /tmp/wh_exclude

Могут где то и пригодиться

Тестил по cups и по /usr/111
И мой вариант и ваш свежий вариант wh_exclude
Все прошло успешно
Опять же все делал из системы (от root)

Ок. Спасибо.
Надо на днях наметить варианты которые надо протестировать. Постепенно проверять и вычеркивать. Ну или чинить и вычеркивать.
А то часто бывает, что одно чинишь другое отваливается.

На свежем варианте на reboot система ругается.
По виду вроде в команде какой то опции для Магеи не подходят
Но все так быстро что не успеваешь разглядеть
И как тут быть ?
Можно ли из системы выключиться в режиме debug
Еще reboot в Магее записывает модуль в toxzm
Это баг toxzm или мне систему надо настроить что бы писала в конфиге

REBUILD0=‘no’

Добавляете в разные места скрипта /bin/ash и вычисляете на каком месте сбоит.
Для продолжения работы скрипта - exit.
Можно добавлять read qqq например или sleep 5

Стоп. Косяки только с ребутом? С шатдаун норм?

Uird.shutdown=haltonly

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

Тестировал на днях режим mount+wh в shutdown-uird.sh
В wh_exclude есть стр

~ > /tmp/wh_exclude

Однако в логах wh_exclude не появляются. Но зависшие тени при этом нормально удаляются
Сделал свой вариант wh_exclude https://cloud.mail.ru/public/4dnk/n5s3MaEhF
Тут и логи появляются и з. тени удаляются
Только /tmp/wh_files это у меня все тени присутствующие в модуле
Инфа полезная. Я уже нашел, благодаря ей, ошибки в других скриптах.

  1. Тестировал на днях режим mount и none в shutdown-uird.sh на тесте с сервисом cups из systemd.
    Удалил из системы и выключился с сохр. В модуле записи появились тени
    Активировал сервис cups из systemd и выключился с сохр. .
    В модуле записи появились файлы теней нет
    Судя по логам wh_exclude не работает но зависшие тени удалились .
    Что то зря что ли делали mount+wh ?

Как бы да. Специально для Вас. Плюс только в том, что модуль один.
Заьо натолкнуло на мысль как склеивать модули в mkpfs, так чтоб тени сохранялись. Уже вроде работает, подробности у паппирусов в форуме.

Вроде сделал - https://cloud.mail.ru/public/4dnk/n5s3MaEhF
Изменения

  1. shutdown-uird.sh

wh_exclude() {
find $1 -name ‘.wh.*’ | sed “s:$1::” | while read WH ; do
F=$(echo $WH | sed ‘s/.wh.//g’)
FS=$( find “$1"”$F" -print 2>/dev/null )
if [ -n “$FS” ] ; then
[ -f “$2"”$WH" ] && (echo “$WH”) >> /tmp/wh_exclude
[ -f “$2"”$FS" ] && (echo “$FS”) >> /tmp/wh_exclude
(echo “”) >> /tmp/wh_files
(echo “$FS”) >> /tmp/wh_files
(echo “$WH #delete”) >> /tmp/wh_files
else
(echo “$WH”) >> /tmp/wh_files
fi
done
}

Опять же мой модифицированный DdShurick
Для порядка включил запись запрета в wh_exclude не только тени но и файла тени
Работает так:
Если в $1 есть file +.wh.file

[ -f "$2""$WH" ] && (echo "$WH") >>  /tmp/wh_exclude
[ -f "$2""$FS" ] && (echo "$FS")  >>  /tmp/wh_exclude

В логах :

  • wh_exclude - список исключенных теней
  • wh_files - список всех теней в модуле. Отдельно отмечаются удаленные тени и присутствует
    файл удаленной тени. Инфа может и избыточная, но компактная и более удобная в восприятии

стр 190

  if [ "$MODE" = "mount+wh" ] ; then
  	wh_exclude $SRC ${AUFS}-bundle 
  	[ -f '/tmp/wh_exclude' ] && cat /tmp/wh_exclude >> /tmp/$n/excludedfiles
  	[ -f '/tmp/wh_files' ] && cat /tmp/wh_files >> /tmp/$n/wh_files
  	[ -f '/tmp/wh_exclude' ] && mv /tmp/wh_exclude  /tmp/$n/
  	rm -rf /tmp/wh_files /tmp/wh_exclude
  fi

При первом чистом запуске uird ругалась на отсутствие файлов

  1. uird.toxzm_mode

Подумал если есть режим none, то должен быть для порядка и режим none+wh
стр 135

elif [ “$MODE” = “none” -o “$MODE” = “none+wh” ] ; then
[ “$MODE” = “none” ] && grep -q “/$(basename “$MODNAME”)” /proc/mounts && MODE=‘mount’
[ “$MODE” = “none+wh” ] && grep -q “/$(basename “$MODNAME”)” /proc/mounts && MODE=‘mount+wh’

Теперь вроде все работает

PS
Режимы mount и mount+wh по виду различаются только тем что у mount+wh у меня выводятся дополнительные логи
При проведении тестов, в записываемом модуле, различий не обнаружено
Ну и в mount+wh все в одном модуле и легче анализировать