From: Alexey Gladkov <gladkov.alexey@gmail.com> To: make-initrd@lists.altlinux.org Subject: Re: [make-initrd] polld и проверка наличия /root/sbin/init Date: Fri, 7 Apr 2023 15:05:22 +0200 Message-ID: <ZDAVElFe5XRsLUJp@example.org> (raw) In-Reply-To: <a9bd77a0-832b-5618-59e2-c1bf4ef0e1be@gmail.com> 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
next prev parent reply other threads:[~2023-04-07 13:05 UTC|newest] Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-04-06 1:28 Антон Мидюков 2023-04-06 6:00 ` Leonid Krivoshein 2023-04-06 22:27 ` Leonid Krivoshein 2023-04-07 13:05 ` Alexey Gladkov [this message] 2023-04-06 9:29 ` Alexey Gladkov 2023-04-09 20:18 ` Leonid Krivoshein
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=ZDAVElFe5XRsLUJp@example.org \ --to=gladkov.alexey@gmail.com \ --cc=make-initrd@lists.altlinux.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
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