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.