[make-initrd] [PATCH v6 21/22] bootchain-core: adds ability to bring the daemon to the foreground

Alexey Gladkov gladkov.alexey at gmail.com
Sat Nov 6 16:22:13 MSK 2021


On Tue, Oct 26, 2021 at 11:29:43PM +0300, Leonid Krivoshein wrote:
> 
> 26.10.2021 22:16, Alexey Gladkov пишет:
> > On Sun, Oct 24, 2021 at 08:23:23PM +0300, Leonid Krivoshein wrote:
> > > Also introduces configuration parameter BC_FGVT_ACTIVATE and new pseudo-step
> > > "fg". This is only works together with the "bootchain-interactive" feature
> > > included to initramfs. Jointly features "bootchain-core" and "bootchain-
> > > interactive" they lay the foundation for building simple text installers
> > > in the stage1.
> > Напомни пожалуйста, а что мешает демону из бэкграунда писать на указанный
> > терминал и читать с него ?
> > 
> > Типа вот так:
> > 
> > exec </dev/tty2 >/dev/tty2 2>&1
> 
> Там ровно этот код и отрабатывает. Суть усложнения концепции заключалась в
> другом: хотелось получить выделенный интерактивный терминал с диалогами,
> отличный от tty1, и активировать его, при необходимости, по таймауту или
> сразу. Чтобы быстрый процесс загрузки не мелькал перед глазами, если в этом
> нет необходимости. И чтобы вывод демонов make-initrd не смешивался на tty1 с
> диалогами.

Так я же и написал tty2. Вопрос был о том, зачем демону перезапускаться ?
Он же может перенаправить свой ввод-вывод на любой терминал.

> Переход в интерактивный режим был разделён на две части: IM_exec() и
> IM_activate() подобно тому, как приложения запускаются в NIX-системах через
> fork() и exec(). Исходно запущенный демон запускает вспомогательный терминал
> для отладки и есть код, который ждёт его завершения. Изначально демон был
> вообще разделён на две части, перезапускалась только вторая часть. Причина
> -- в использовании openvt ... так как другие варианты не подходили.
> 
> Алексей Шепляков предложил тут хорошую идею: использовать для тех же целей
> screen или tmux. Собственно задача: восстановить после себя консоль. Вариант
> идеальный, но у меня пока не вышло из-за проблем с настройкой utf8 в stage1,
> там одно другое цепляет, есть конфликты с plymouth и kbd, который сейчас,
> кажется, совсем нерабочий.

Кто совсем нерабочий ?

> Так что переключение на другие консоли через
> openvt -- пока единственная рабочая, но не лучшая реализация, надо обсудить,
> как это улучшить, не меняя API.
> 
> 
> > 
> > > See README.md for more details.
> > > 
> > > Signed-off-by: Leonid Krivoshein <klark.devel at gmail.com>
> > > ---
> > >   features/bootchain-core/README.md             | 16 +++++++
> > >   .../data/bin/bootchain-sh-functions           |  2 +
> > >   features/bootchain-core/data/sbin/chaind      | 45 ++++++++++++++++---
> > >   3 files changed, 58 insertions(+), 5 deletions(-)
> > > 
> > > diff --git a/features/bootchain-core/README.md b/features/bootchain-core/README.md
> > > index ab89181..943b4b0 100644
> > > --- a/features/bootchain-core/README.md
> > > +++ b/features/bootchain-core/README.md
> > > @@ -50,11 +50,18 @@ us to optimize fill in `initramfs` only which we are need.
> > >   - Modularity: loading methods are initially separated from the common
> > >     code and daemon.
> > > +- Provides the ability to bring the daemon to the foreground at any time. This
> > > +  restarts the `chaind` process on a specific terminal, although initially the
> > > +  daemon is started in the background.
> > >   - Some steps (actions) are built directly into the code of the main loop
> > >     of the `chaind` daemon, external scripts are not called to execute them.
> > >     Such pseudo-steps allow you to control, basically, the internal state of the
> > >     daemon and should not be taken into account in the boot chain, as if they are
> > >     hidden.
> > > +- Optionally, the daemon can work in conjunction with the `bootchain-interactive`
> > > +  feature, can move to the foreground and continue working on a specific terminal,
> > > +  by default, tty2. Jointly features `bootchain-core` and `bootchain-interactive`
> > > +  they lay the foundation for building simple text installers in stage1.
> > >   - The `chaind` daemon allows you to overload the chain with a new set of steps,
> > >     thanks to this, you can change the logic of work "on the fly", support loops
> > >     and conditional jumps, in text dialogs it is an opportunity to go back.
> > > @@ -147,6 +154,11 @@ parameters:
> > >     should be output in the background. By default, the value is 3, respectively,
> > >     the log is output to tty3. An empty value allows you to disable log output
> > >     to any terminal.
> > > +- `BC_FGVT_ACTIVATE` - delay in seconds before activating the interactive
> > > +  terminal, by default tty2 is activated after 2 seconds in debug mode
> > > +  or after 8 seconds in normal mode. An empty value instructs to activate
> > > +  the interactive terminal immediately. This configuration option only works
> > > +  together with the `bootchain-interactive` features included in initramfs.
> > >   - `BC_LOGFILE` - the full path to the log file or the name of a special device,
> > >     to which debugging messages will be output. In NATIVE mode, the default value
> > >     is `/var/log/chaind.log`, in COMPATIBILITY mode with `pipeline` the default
> > > @@ -165,6 +177,10 @@ embedded in the code of the main loop of the `boot chain-loop` daemon, do
> > >   not need additional parameters and should not be taken into account when
> > >   addressing, as if they are hidden.
> > > +- `fg` - provides the transfer of the daemon to interactive mode when building
> > > +  initramfs with `bootchain-interactive` features. The `bootchain-core` itself
> > > +  is not interactivity required, but some other steps may need it, such as
> > > +  `altboot`.
> > >   - `noop` - does not perform any actions and is designed to pull off the results
> > >     on the <OUT> of the previous step from the <IN> of the next step, which can
> > >     be useful, for example, when we don`t want the results of the `waitdev` step
> > > diff --git a/features/bootchain-core/data/bin/bootchain-sh-functions b/features/bootchain-core/data/bin/bootchain-sh-functions
> > > index 3a9ec6b..743a8f9 100644
> > > --- a/features/bootchain-core/data/bin/bootchain-sh-functions
> > > +++ b/features/bootchain-core/data/bin/bootchain-sh-functions
> > > @@ -25,6 +25,8 @@ else
> > >   	pipeline_mode=
> > >   fi
> > > +[ -n "$BC_DEBUG" ] && BC_FGVT_ACTIVATE=1 ||
> > > +	BC_FGVT_ACTIVATE="${BC_FGVT_ACTIVATE:-7}"
> > >   BC_NEXTCHAIN=/.initrd/bootchain/bootchain.next
> > >   BC_PASSED=/.initrd/bootchain/passed
> > >   handlerdir=/lib/bootchain
> > > diff --git a/features/bootchain-core/data/sbin/chaind b/features/bootchain-core/data/sbin/chaind
> > > index e8ce94a..68a1aae 100755
> > > --- a/features/bootchain-core/data/sbin/chaind
> > > +++ b/features/bootchain-core/data/sbin/chaind
> > > @@ -2,11 +2,12 @@
> > >   . bootchain-sh-functions
> > > -bcretry=1
> > > +bcretry="${bcretry:-1}"
> > >   pidfile="/var/run/$PROG.pid"
> > > -chainsteps="$BOOTCHAIN"
> > > -stepnum=0
> > > -prevdir=
> > > +chainsteps="${chainsteps-}"
> > > +stepnum="${stepnum:-0}"
> > > +prevdir="${prevdir-}"
> > > +BC_IM_supported=
> > >   exit_handler()
> > > @@ -25,6 +26,8 @@ debug()
> > >   }
> > > +# Only when daemon started first time
> > > +if [ "x${1-}" != "x--foreground" ]; then
> > "x" тут признак чего ? не надо этого.
> 
> Признак Debian-way! :-) Ну, я боялся, что в этом месте "--" может быть не
> так истолковано.
> 
> 
> > >   	[ ! -f "$pidfile" ] ||
> > >   		fatal "already running"
> > >   	set_cleanup_handler exit_handler
> > > @@ -57,12 +60,44 @@ debug()
> > >   	mountpoint -q -- "$mntdir" ||
> > >   		run mount -t tmpfs tmpfs "$mntdir" ||:
> > > +	chainsteps="$BOOTCHAIN"
> > > +fi
> > > +
> > > +# Check that interactive mode supports
> > > +if has_feature bootchain-interactive; then
> > > +	. interactive-sh-functions
> > > +
> > > +	[ "x${1-}" != "x--foreground" ] ||
> > > +		IM_activate "$BC_FGVT_ACTIVATE" "$BC_LOGFILE"
> > > +	BC_IM_supported=1
> > > +fi
> > > +
> > >   rc=0
> > >   while [ -n "$chainsteps" ]; do
> > >   	name="${chainsteps%%,*}"
> > >   	exe="$handlerdir/$name"
> > > -	if [ "$name" = noop ]; then
> > > +	if [ "$name" = fg ]; then
> > > +		[ -n "$BC_IM_supported" ] ||
> > > +			fatal "bootchain-interactive feature required"
> > > +		assign "callnum" "\${callnum_$name:-0}"
> > > +		chainsteps="${chainsteps#$name}"
> > > +		chainsteps="${chainsteps#,}"
> > > +
> > > +		if IM_is_active; then
> > > +			message "[$callnum] Step '$name' has ignored"
> > > +		else
> > > +			message "[$callnum] Switching to foreground"
> > > +
> > > +			callnum=$((1 + $callnum))
> > > +			assign "callnum_$name" "\$callnum"
> > > +
> > > +			export stepnum chainsteps callnum_fg prevdir bcretry
> > > +
> > > +			IM_exec "$0" --foreground
> > > +		fi
> > > +
> > > +	elif [ "$name" = noop ]; then
> > >   		chainsteps="${chainsteps#$name}"
> > >   		chainsteps="${chainsteps#,}"
> > >   		prevdir=
> > > -- 
> > > 2.24.1
> > > 
> > > _______________________________________________
> > > Make-initrd mailing list
> > > Make-initrd at lists.altlinux.org
> > > https://lists.altlinux.org/mailman/listinfo/make-initrd
> > > 
> 
> -- 
> Best regards,
> Leonid Krivoshein.
> 
> _______________________________________________
> Make-initrd mailing list
> Make-initrd at lists.altlinux.org
> https://lists.altlinux.org/mailman/listinfo/make-initrd

-- 
Rgrds, legion



More information about the Make-initrd mailing list