Make-initrd development discussion
 help / color / mirror / Atom feed
From: Leonid Krivoshein <klark.devel@gmail.com>
To: make-initrd@lists.altlinux.org
Subject: Re: [make-initrd] polld и проверка наличия /root/sbin/init
Date: Fri, 7 Apr 2023 01:27:13 +0300
Message-ID: <a9bd77a0-832b-5618-59e2-c1bf4ef0e1be@gmail.com> (raw)
In-Reply-To: <a440494c-bc30-2bdc-d559-cbfbffda72fb@gmail.com>

[-- 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!"

  reply	other threads:[~2023-04-06 22:27 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 [this message]
2023-04-07 13:05     ` Alexey Gladkov
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=a9bd77a0-832b-5618-59e2-c1bf4ef0e1be@gmail.com \
    --to=klark.devel@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