* [make-initrd] polld и проверка наличия /root/sbin/init @ 2023-04-06 1:28 Антон Мидюков 2023-04-06 6:00 ` Leonid Krivoshein 2023-04-06 9:29 ` Alexey Gladkov 0 siblings, 2 replies; 6+ messages in thread From: Антон Мидюков @ 2023-04-06 1:28 UTC (permalink / raw) To: make-initrd Здравствуйте Предыстория: https://bugzilla.altlinux.org/44111 Заглавный вопрос: "в каком случае может быть так, что init в смонтированном корне в первые секунды нет, а потом оно чудесным образом появляется?" Мне кажется, ответ найден: "При распараллеливании процесса монтирования корня (из сквоша, как минимум) на медленном сетевом соединении или достаточно медленном локальном накопителе". Сейчас проблема стала хорошо воспроизводиться на ядре 6.2 при подключении по nfs или загрузке через ventoy и монтировании сквоша (без предварительной загрузки сквоша в память) на многоядерных процессорах. Если ядро одно, то проблемы нет (проверено в виртуалке). В ядре включили алгоритм монтирования оверлея CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU, и это проблему усугубило. Но проблему крайне редко можно было поймать и раньше. Отсюда выводы: 1. Факт монтирования корня недостаточное условие, существует переходный процесс монтирования 2. Обнаружение /sbin/init также не является достаточным условием, что можно продолжать загрузку, переходный процесс может оказаться длинным Гипотеза о переходном процессе основана на сопоставлении двух логов chaind.log и polld.log Ошибка об отсутствии /sbin/init была выдана на 1 секунду раньше, чем было завершено монтирование оверлея (оно занимало две секунды). И другая проблема, вытекающая из этих: bootchain после монтирования /sbin/init совершает ещё действия, поэтому нужно дождаться его выполнения. В случае bootchain было бы надёжным запускать polld только тогда, когда он завершил свою работу. Такое в принципе возможно? -- С уважением, Антон Мидюков <antohami@basealt.ru> ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [make-initrd] polld и проверка наличия /root/sbin/init 2023-04-06 1:28 [make-initrd] polld и проверка наличия /root/sbin/init Антон Мидюков @ 2023-04-06 6:00 ` Leonid Krivoshein 2023-04-06 22:27 ` Leonid Krivoshein 2023-04-06 9:29 ` Alexey Gladkov 1 sibling, 1 reply; 6+ messages in thread From: Leonid Krivoshein @ 2023-04-06 6:00 UTC (permalink / raw) To: make-initrd Добрый день! On 4/6/23 04:28, Антон Мидюков wrote: > Здравствуйте > > Предыстория: https://bugzilla.altlinux.org/44111 > > Заглавный вопрос: "в каком случае может быть так, что init в смонтированном корне в первые секунды нет, а потом оно чудесным образом появляется?" На p10 с пропагатором и более старым ядром не проявляется, так что все под подозрением, кроме этих двоих.)) > Мне кажется, ответ найден: "При распараллеливании процесса монтирования корня (из сквоша, как минимум) на медленном сетевом соединении или достаточно медленном локальном накопителе". > Сейчас проблема стала хорошо воспроизводиться на ядре 6.2 при подключении по nfs или загрузке через ventoy и монтировании сквоша (без предварительной загрузки сквоша в память) на многоядерных процессорах. > Если ядро одно, то проблемы нет (проверено в виртуалке). > В ядре включили алгоритм монтирования оверлея CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU, и это проблему усугубило. > Но проблему крайне редко можно было поймать и раньше. А на p10 с пропагатором удавалось воспроизвести? Мне ни разу не удалось, хотя концовка с монтированием оверлея на скриптах у них схожа. > Отсюда выводы: > 1. Факт монтирования корня недостаточное условие, существует переходный процесс монтирования Насколько я понимаю, у каждой группы процессов может быть собственное пространство имён монтирования, но описываемое поведение говорит о том, что polld и chaind находятся в разных пространствах имён и ещё что-то заставляет перемещать структуры в ядре от одной из групп к другой. В общем странно и невероятно, потому что по идее, если пространства разные, они изолированы, а если одинаковые, все процессы должны увидеть изменения мгновенно. Тем не менее, мы наблюдаем именно такое поведение, описанное Антоном. Весьма похоже на ядерный рейс, поскольку на начальном этапе загрузка работой сильная и "мгновенности" не случается. > 2. Обнаружение /sbin/init также не является достаточным условием, что можно продолжать загрузку, переходный процесс может оказаться длинным Получается, грубо говоря, что мы не знаем, в скольких тредах выполнения (снаружи bootchain) должна пройти синхронизация и чего именно ожидать. В bootchain команда mount завершилась успешно, ядро смонтировало устройства. Но polld почему-то об этом ничего не знает. По идее polld должен начинать проверку только после выхода из bootchain на вызове telinit 2, если эта проверка на нём. > Гипотеза о переходном процессе основана на сопоставлении двух логов chaind.log и polld.log > Ошибка об отсутствии /sbin/init была выдана на 1 секунду раньше, чем было завершено монтирование оверлея (оно занимало две секунды). Похоже на какой-то глюк с ходом часов (хотя monotonic timestamp используется) или особенность работы telinit 2. У меня нет идей. > И другая проблема, вытекающая из этих: > bootchain после монтирования /sbin/init совершает ещё действия, поэтому нужно дождаться его выполнения. В нём это делать бесполезно, там всё хорошо будет. > В случае bootchain было бы надёжным запускать polld только тогда, когда он завершил свою работу. > Такое в принципе возможно? Тут большой вопрос, кто кого запускает. Не знаю назначение polld, но мне кажется именно его сообщения мы видим на /dev/console о запуске и завершении служб. Я считаю, что несмотря на пошаговую загрузку в bootchain, мы не можем останавливать event-driven механизм. -- WBR, Leonid Krivoshein. ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [make-initrd] polld и проверка наличия /root/sbin/init 2023-04-06 6:00 ` Leonid Krivoshein @ 2023-04-06 22:27 ` Leonid Krivoshein 2023-04-07 13:05 ` Alexey Gladkov 0 siblings, 1 reply; 6+ messages in thread From: Leonid Krivoshein @ 2023-04-06 22:27 UTC (permalink / raw) To: make-initrd [-- Attachment #1: Type: text/plain, Size: 3840 bytes --] On 4/6/23 09:00, Leonid Krivoshein wrote: >> Отсюда выводы: >> 1. Факт монтирования корня недостаточное условие, существует >> переходный процесс монтирования > > Насколько я понимаю, у каждой группы процессов может быть собственное > пространство имён монтирования, но описываемое поведение говорит о > том, что polld и chaind находятся в разных пространствах имён и ещё > что-то заставляет перемещать структуры в ядре от одной из групп к > другой. В общем странно и невероятно, потому что по идее, если > пространства разные, они изолированы, а если одинаковые, все процессы > должны увидеть изменения мгновенно. Тем не менее, мы наблюдаем именно > такое поведение, описанное Антоном. Весьма похоже на ядерный рейс, > поскольку на начальном этапе загрузка работой сильная и "мгновенности" > не случается. Сказанное выше больше похоже на тонкую шутку. На самом деле всё может быть проще... Если какой-то внешний процесс по отношению bootchain среагировал на событие, увидев /root/sbin/init или что-то ещё, он же может вызвать telinit 2? Но на шаге squahfs это ещё не было финальным монтированием. В тот же момент bootchain продолжает процесс загрузки в шаге overlayfs, но polld, получив сигнал, уже начинает проверку финального условия. bootchain выполняет telinit 2 только на последнем шаге rootfs, и раз polld начинает обработку раньше, сигнал посылает кто-то ещё и это следует из журнала chaind.log. Возможно, остановка polld на время работы bootchain поможет, я просто не знаю, можно ли это делать. Но я сталкивался с двойной обработкой события на финальном этапе в другом коде при использовании как раз метода загрузки. При написании прототипа отдельной фичи overlayroot (вложил), закрывающей обычный корень на запись, приходится проверять повторный вход в /lib/initrd/boot/scripts/overlayroot. Без это оверлеи монтируются неправильно и система просто не грузится. А откуда возникает второе событие при срабатывании события "корень найден -- пора в stage2"? Раньше я полагал, что его создаёт монтирование overlay. Драка между bootchain и polld может быть не результатом "гонки" в ядре или сторонним вызовом telinit 2, а результатом обработки этого второго события. Но я не так хорошо знаю архитектуру make-initrd. -- WBR, Leonid Krivoshein. [-- Attachment #2: overlayroot --] [-- Type: text/plain, Size: 3806 bytes --] #!/bin/sh -efu . shell-error OVERLAY="${1:-tmpfs}" BASE=/usr/share/make-initrd/data case "$OVERLAY" in -i|--install) OVERLAY="${2:-tmpfs}" ;; -u|--uninstall) [ -d "$BASE/lib/initrd/boot/scripts" ] || fatal "make-initrd is not installed." [ -x "$BASE/lib/initrd/boot/scripts/$PROG" ] || fatal "The $PROG feature is not installed." sed -i -E "/\.\/$PROG/d" "$BASE"/lib/initrd/boot/method/localdev/check sed -i -E "/register_parameter string OVERLAYROOT/d" \ "$BASE"/etc/initrd/cmdline.d/base sed -i -E "/MODULES_TRY_ADD \+= overlay/d" /etc/initrd.mk sed -i -E "/PUT_FILES \+= \/etc\/$PROG\.conf/d" /etc/initrd.mk rm -f -- "/etc/$PROG.conf" "$BASE/lib/initrd/boot/scripts/$PROG" echo "The $PROG feature was uninstalled!" exit 0 ;; -h|--help) cat <<-EOF Usage $PROG [<command> | UUID=... | LABEL=... | <device>] Commands: -i, --install Install $PROG feature. -u, --uninstall Uninstall $PROG feature. -h, --help Show this help message and exit. UUID=, LABEL= and /dev/device specified a device with the R/W layer. By default R/W layer will be created on the TMPFS at the install time. After install or uninstall don't forget to run make-initrd [<args>]... EOF exit 0 ;; esac # Install feature [ -d "$BASE/lib/initrd/boot/scripts" ] || fatal "make-initrd is not installed." [ ! -f "$BASE/lib/initrd/boot/scripts/$PROG" ] || fatal "The $PROG feature already installed." grep -qw "./$PROG" "$BASE"/lib/initrd/boot/method/localdev/check || echo "./$PROG" >> "$BASE"/lib/initrd/boot/method/localdev/check grep -qw "OVERLAYROOT" "$BASE"/etc/initrd/cmdline.d/base || echo "register_parameter string OVERLAYROOT" \ >> "$BASE"/etc/initrd/cmdline.d/base echo "$PROG=$OVERLAY" > "/etc/$PROG.conf" grep -qw "/etc/$PROG.conf" /etc/initrd.mk || echo "PUT_FILES += /etc/$PROG.conf" >> /etc/initrd.mk grep -w "MODULES_TRY_ADD" /etc/initrd.mk |grep -qw overlay || echo "MODULES_TRY_ADD += overlay" >> /etc/initrd.mk cat > "$BASE/lib/initrd/boot/scripts/$PROG" <<EOF #!/bin/bash -efu . shell-error . /.initrd/initenv # Handle first event only [ ! -f /.initrd/$PROG ] || exit 0 [ -n "\${$PROG-}" ] || [ ! -s /etc/$PROG.conf ] || . /etc/$PROG.conf :> /.initrd/$PROG case "\${$PROG-}" in "") # Silent use default boot exit 0 ;; disabled) echo "rootfs has return back to the read/write mode" >&2 exit 0 ;; tmpfs) echo "rootfs switched to the read-only mode, using tmpfs as overlay" >&2 device= ;; UUID=?*) device="/dev/disk/by-uuid/\${$PROG##UUID=}" ;; LABEL=?*) device="/dev/disk/by-label/\${$PROG##LABEL=}" ;; /dev/?*) device="\$$PROG" ;; *) fatal "\$$PROG: invalid $PROG" ;; esac # Wait the device if [ -n "\$device" ]; then i=10 while [ "\$i" != 0 ]; do dev="\$(readlink-e "\$device" 2>/dev/null ||:)" [ -z "\$dev" ] || [ ! -b "\$dev" ] || break i="\$((\$i - 1))" sleep .5 done [ -n "\$dev" ] && [ -b "\$dev" ] || fatal "\$$PROG: invalid device specification" echo "rootfs switched to the read-only mode, using \$dev as overlay" >&2 device="\$dev" fi echo "remounting / with overlayfs" >&2 mkdir -p -- "\$rootmnt.rw" "\$rootmnt.ro" if [ -n "\$device" ]; then mount -- "\$device" "\$rootmnt.rw" else mount -t tmpfs -o mode=755 -- none "\$rootmnt.rw" fi opts="lowerdir=\$rootmnt.ro" opts="\$opts,upperdir=\$rootmnt.rw/rw" opts="\$opts,workdir=\$rootmnt.rw/wk" mkdir -p -- "\$rootmnt.rw/rw" "\$rootmnt.rw/wk" mount --move -- "\$rootmnt" "\$rootmnt.ro" mount -t overlay -o "\$opts" -- overlay "\$rootmnt" mkdir -p -- "\$rootmnt/.ro" "\$rootmnt/.rw" mount --move -- "\$rootmnt.ro" "\$rootmnt/.ro" mount --move -- "\$rootmnt.rw" "\$rootmnt/.rw" rmdir -- "\$rootmnt.rw" "\$rootmnt.ro" echo "rootfs overlayed with overlayfs" >&2 EOF chmod +x "$BASE/lib/initrd/boot/scripts/$PROG" echo "The $PROG feature was installed!" ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [make-initrd] polld и проверка наличия /root/sbin/init 2023-04-06 22:27 ` Leonid Krivoshein @ 2023-04-07 13:05 ` Alexey Gladkov 0 siblings, 0 replies; 6+ messages in thread From: Alexey Gladkov @ 2023-04-07 13:05 UTC (permalink / raw) To: make-initrd On Fri, Apr 07, 2023 at 01:27:13AM +0300, Leonid Krivoshein wrote: > > On 4/6/23 09:00, Leonid Krivoshein wrote: > >> Отсюда выводы: > >> 1. Факт монтирования корня недостаточное условие, существует > >> переходный процесс монтирования > > > > Насколько я понимаю, у каждой группы процессов может быть собственное > > пространство имён монтирования, но описываемое поведение говорит о > > том, что polld и chaind находятся в разных пространствах имён Это называется mount namespace. Для использования другого mountns нужно сделать unshare/clone т.е. определённые действия. Просто так это не случается. polld не меняет свой mountns. В make-initrd вообще никто не использует namespaces поскольку это необязательная фича ядра и для задачи не требуется. > > и ещё > > что-то заставляет перемещать структуры в ядре от одной из групп к > > другой. В общем странно и невероятно, потому что по идее, если > > пространства разные, они изолированы, а если одинаковые, все процессы > > должны увидеть изменения мгновенно. Тем не менее, мы наблюдаем именно > > такое поведение, описанное Антоном. Весьма похоже на ядерный рейс, > > поскольку на начальном этапе загрузка работой сильная и "мгновенности" > > не случается. > > Сказанное выше больше похоже на тонкую шутку. На самом деле всё может > быть проще... > > Если какой-то внешний процесс по отношению bootchain среагировал на > событие, увидев /root/sbin/init или что-то ещё, он же может вызвать > telinit 2? Такой процесс есть - polld. Я же про это уже говорил. > Но на шаге squahfs это ещё не было финальным монтированием. В > тот же момент bootchain продолжает процесс загрузки в шаге overlayfs, но > polld, получив сигнал, уже начинает проверку финального условия. > > bootchain выполняет telinit 2 только на последнем шаге rootfs, и раз > polld начинает обработку раньше, сигнал посылает кто-то ещё и это > следует из журнала chaind.log. Возможно, остановка polld на время работы > bootchain поможет, я просто не знаю, можно ли это делать. Но я > сталкивался с двойной обработкой события на финальном этапе в другом > коде при использовании как раз метода загрузки. > > При написании прототипа отдельной фичи overlayroot (вложил), закрывающей > обычный корень на запись, приходится проверять повторный вход в > /lib/initrd/boot/scripts/overlayroot. Без это оверлеи монтируются > неправильно и система просто не грузится. А откуда возникает второе > событие при срабатывании события "корень найден -- пора в stage2"? > Раньше я полагал, что его создаёт монтирование overlay. > > Драка между bootchain и polld может быть не результатом "гонки" в ядре > или сторонним вызовом telinit 2, а результатом обработки этого второго > события. Но я не так хорошо знаю архитектуру make-initrd. > > > -- > WBR, Leonid Krivoshein. > #!/bin/sh -efu > > . shell-error > > OVERLAY="${1:-tmpfs}" > BASE=/usr/share/make-initrd/data > > case "$OVERLAY" in > -i|--install) > OVERLAY="${2:-tmpfs}" > ;; > > -u|--uninstall) > [ -d "$BASE/lib/initrd/boot/scripts" ] || > fatal "make-initrd is not installed." > [ -x "$BASE/lib/initrd/boot/scripts/$PROG" ] || > fatal "The $PROG feature is not installed." > sed -i -E "/\.\/$PROG/d" "$BASE"/lib/initrd/boot/method/localdev/check > sed -i -E "/register_parameter string OVERLAYROOT/d" \ > "$BASE"/etc/initrd/cmdline.d/base > sed -i -E "/MODULES_TRY_ADD \+= overlay/d" /etc/initrd.mk > sed -i -E "/PUT_FILES \+= \/etc\/$PROG\.conf/d" /etc/initrd.mk > rm -f -- "/etc/$PROG.conf" "$BASE/lib/initrd/boot/scripts/$PROG" > echo "The $PROG feature was uninstalled!" > exit 0 > ;; > > -h|--help) > cat <<-EOF > Usage $PROG [<command> | UUID=... | LABEL=... | <device>] > > Commands: > -i, --install Install $PROG feature. > -u, --uninstall Uninstall $PROG feature. > -h, --help Show this help message and exit. > > UUID=, LABEL= and /dev/device specified a device with the R/W layer. > By default R/W layer will be created on the TMPFS at the install time. > After install or uninstall don't forget to run make-initrd [<args>]... > EOF > exit 0 > ;; > esac > > # Install feature > [ -d "$BASE/lib/initrd/boot/scripts" ] || > fatal "make-initrd is not installed." > [ ! -f "$BASE/lib/initrd/boot/scripts/$PROG" ] || > fatal "The $PROG feature already installed." > grep -qw "./$PROG" "$BASE"/lib/initrd/boot/method/localdev/check || > echo "./$PROG" >> "$BASE"/lib/initrd/boot/method/localdev/check > grep -qw "OVERLAYROOT" "$BASE"/etc/initrd/cmdline.d/base || > echo "register_parameter string OVERLAYROOT" \ > >> "$BASE"/etc/initrd/cmdline.d/base > echo "$PROG=$OVERLAY" > "/etc/$PROG.conf" > grep -qw "/etc/$PROG.conf" /etc/initrd.mk || > echo "PUT_FILES += /etc/$PROG.conf" >> /etc/initrd.mk > grep -w "MODULES_TRY_ADD" /etc/initrd.mk |grep -qw overlay || > echo "MODULES_TRY_ADD += overlay" >> /etc/initrd.mk > cat > "$BASE/lib/initrd/boot/scripts/$PROG" <<EOF > #!/bin/bash -efu > > . shell-error > . /.initrd/initenv > > # Handle first event only > [ ! -f /.initrd/$PROG ] || > exit 0 > [ -n "\${$PROG-}" ] || [ ! -s /etc/$PROG.conf ] || > . /etc/$PROG.conf > :> /.initrd/$PROG > > case "\${$PROG-}" in > "") # Silent use default boot > exit 0 > ;; > disabled) > echo "rootfs has return back to the read/write mode" >&2 > exit 0 > ;; > tmpfs) > echo "rootfs switched to the read-only mode, using tmpfs as overlay" >&2 > device= > ;; > UUID=?*) > device="/dev/disk/by-uuid/\${$PROG##UUID=}" > ;; > LABEL=?*) > device="/dev/disk/by-label/\${$PROG##LABEL=}" > ;; > /dev/?*) > device="\$$PROG" > ;; > *) > fatal "\$$PROG: invalid $PROG" > ;; > esac > > # Wait the device > if [ -n "\$device" ]; then > i=10 > > while [ "\$i" != 0 ]; do > dev="\$(readlink-e "\$device" 2>/dev/null ||:)" > [ -z "\$dev" ] || [ ! -b "\$dev" ] || > break > i="\$((\$i - 1))" > sleep .5 > done > > [ -n "\$dev" ] && [ -b "\$dev" ] || > fatal "\$$PROG: invalid device specification" > echo "rootfs switched to the read-only mode, using \$dev as overlay" >&2 > device="\$dev" > fi > > echo "remounting / with overlayfs" >&2 > > mkdir -p -- "\$rootmnt.rw" "\$rootmnt.ro" > > if [ -n "\$device" ]; then > mount -- "\$device" "\$rootmnt.rw" > else > mount -t tmpfs -o mode=755 -- none "\$rootmnt.rw" > fi > > opts="lowerdir=\$rootmnt.ro" > opts="\$opts,upperdir=\$rootmnt.rw/rw" > opts="\$opts,workdir=\$rootmnt.rw/wk" > > mkdir -p -- "\$rootmnt.rw/rw" "\$rootmnt.rw/wk" > mount --move -- "\$rootmnt" "\$rootmnt.ro" > mount -t overlay -o "\$opts" -- overlay "\$rootmnt" > mkdir -p -- "\$rootmnt/.ro" "\$rootmnt/.rw" > mount --move -- "\$rootmnt.ro" "\$rootmnt/.ro" > mount --move -- "\$rootmnt.rw" "\$rootmnt/.rw" > rmdir -- "\$rootmnt.rw" "\$rootmnt.ro" > > echo "rootfs overlayed with overlayfs" >&2 > EOF > chmod +x "$BASE/lib/initrd/boot/scripts/$PROG" > echo "The $PROG feature was installed!" > _______________________________________________ > Make-initrd mailing list > Make-initrd@lists.altlinux.org > https://lists.altlinux.org/mailman/listinfo/make-initrd -- Rgrds, legion ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [make-initrd] polld и проверка наличия /root/sbin/init 2023-04-06 1:28 [make-initrd] polld и проверка наличия /root/sbin/init Антон Мидюков 2023-04-06 6:00 ` Leonid Krivoshein @ 2023-04-06 9:29 ` Alexey Gladkov 2023-04-09 20:18 ` Leonid Krivoshein 1 sibling, 1 reply; 6+ messages in thread From: Alexey Gladkov @ 2023-04-06 9:29 UTC (permalink / raw) To: make-initrd On Thu, Apr 06, 2023 at 08:28:20AM +0700, Антон Мидюков wrote: > Здравствуйте > > Предыстория: https://bugzilla.altlinux.org/44111 > > Заглавный вопрос: "в каком случае может быть так, что init в смонтированном корне в первые секунды нет, а потом оно чудесным образом появляется?" > > Мне кажется, ответ найден: "При распараллеливании процесса монтирования корня (из сквоша, как минимум) на медленном сетевом соединении или достаточно медленном локальном накопителе". > Сейчас проблема стала хорошо воспроизводиться на ядре 6.2 при подключении по nfs или загрузке через ventoy и монтировании сквоша (без предварительной загрузки сквоша в память) на многоядерных процессорах. > Если ядро одно, то проблемы нет (проверено в виртуалке). > В ядре включили алгоритм монтирования оверлея CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU, и это проблему усугубило. > Но проблему крайне редко можно было поймать и раньше. > > Отсюда выводы: > 1. Факт монтирования корня недостаточное условие, существует переходный процесс монтирования > 2. Обнаружение /sbin/init также не является достаточным условием, что можно продолжать загрузку, переходный процесс может оказаться длинным Для обычных систем обнаружения INIT необходимое и достаточное условие. initramfs ничего не знает о системе, кроме того, что там должен быть INIT. Для более сложных случаев можно указать свой boot method: /lib/initrd/boot/method/SOMETHING/check /lib/initrd/boot/method/SOMETHING/action echo SOMETHING > /etc/initrd/method > Гипотеза о переходном процессе основана на сопоставлении двух логов chaind.log и polld.log > Ошибка об отсутствии /sbin/init была выдана на 1 секунду раньше, чем было завершено монтирование оверлея (оно занимало две секунды). > > И другая проблема, вытекающая из этих: > bootchain после монтирования /sbin/init совершает ещё действия, поэтому нужно дождаться его выполнения. > В случае bootchain было бы надёжным запускать polld только тогда, когда он завершил свою работу. > Такое в принципе возможно? В новой версии make-initrd у pipeline будет шаг останавливающий или запускающий сервисы. В bootchain вы может сделать такой же шаг. Хотя я считаю более правильным сделать свой boot method с нужными дополнительными проверками. -- Rgrds, legion ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [make-initrd] polld и проверка наличия /root/sbin/init 2023-04-06 9:29 ` Alexey Gladkov @ 2023-04-09 20:18 ` Leonid Krivoshein 0 siblings, 0 replies; 6+ messages in thread From: Leonid Krivoshein @ 2023-04-09 20:18 UTC (permalink / raw) To: make-initrd Привет! On 4/6/23 12:29, Alexey Gladkov wrote: > [...] > Для более сложных случаев можно указать свой boot method: > > /lib/initrd/boot/method/SOMETHING/check > /lib/initrd/boot/method/SOMETHING/action > > echo SOMETHING > /etc/initrd/method Спасибо! Предположительно помогло создание симлинка check => /bin/false в altboot, т.е. способ решения проблемы через boot method сработал: ALT #45787. Но проблема была в другом месте... >> [...] >> bootchain после монтирования /sbin/init совершает ещё действия, поэтому нужно дождаться его выполнения. >> В случае bootchain было бы надёжным запускать polld только тогда, когда он завершил свою работу. >> Такое в принципе возможно? > В новой версии make-initrd у pipeline будет шаг останавливающий или > запускающий сервисы. В bootchain вы может сделать такой же шаг. Если какие-то вспомогательные сервисы нужны или не нужны, конечно их можно запускать из цепочки. Но делать так с ключевыми сервисами make-initrd, назначение которых я даже толком не понимаю, мне кажется неправильным. Такой подход может поломать что-то ещё. > Хотя я > считаю более правильным сделать свой boot method с нужными дополнительными > проверками. В ходе разборок заметил странную штуку... 1. pipeline раньше использовал telinit 2 в шаге rootfs. 2. bootchain делал изначально точно так же. 3. В какой-то момент в pipeline/rootfs поменялся механизм: вместо telinit 2 стал перезаписываться boot method => localdev. 4. Почти сразу я портировал это изменение в bootchain/rootfs. 5. И pipeline, и bootchain изначально меняют boot method на себя и оба не предоставляют функций check и action для проверки специального условия нахождения корня, полагаясь на то, что когда цепочка будет завершена, метод загрузки переключится на localdev и там уже есть нужный функционал проверки. 7. Странное и неожиданное здесь то, что данный функционал работает параллельно с pipeline или bootchain несмотря на то, что метод загрузки изменён в самом начале цепочки -- это и есть причина рейса. 8. Для pipeline данная проблема остаётся в равной степени актуальной. 9. Для bootchain сделал лишь одно изменение: перенёс переключение на метод localdev из шага rootfs за конец цикла демона chaind чтобы успевать переписать в stage2 файл журнала. 10. Добавлять в bootchain или pipeline проверку успешности прохождения цепочки, наверное, можно, но я не стал городить огород, поскольку на Сизифных регулярках, в основном, используется altboot поверх bootchain. 11. Проверять что-либо в altboot смысла не было -- он не первый и не последний шаг bootchain, просто переписать boot method -- недостаточно, т.к. bootchain это делает, а толку ноль, но объединив всё вместе с симлинком на /bin/false результат неожиданно проблему вылечил. Короче говоря, в make-initrd проверка метода localdev почему-то срабатывает, даже если метод загрузки установлен не localdev, и побороть это помогает только создание собственного check. -- WBR, Leonid Krivoshein. ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2023-04-09 20:18 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2023-04-06 1:28 [make-initrd] polld и проверка наличия /root/sbin/init Антон Мидюков 2023-04-06 6:00 ` Leonid Krivoshein 2023-04-06 22:27 ` Leonid Krivoshein 2023-04-07 13:05 ` Alexey Gladkov 2023-04-06 9:29 ` Alexey Gladkov 2023-04-09 20:18 ` Leonid Krivoshein
Make-initrd development discussion This inbox may be cloned and mirrored by anyone: git clone --mirror http://lore.altlinux.org/make-initrd/0 make-initrd/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 make-initrd make-initrd/ http://lore.altlinux.org/make-initrd \ make-initrd@lists.altlinux.org make-initrd@lists.altlinux.ru make-initrd@lists.altlinux.com public-inbox-index make-initrd Example config snippet for mirrors. Newsgroup available over NNTP: nntp://lore.altlinux.org/org.altlinux.lists.make-initrd AGPL code for this site: git clone https://public-inbox.org/public-inbox.git