[make-initrd] [PATCH v6 21/22] bootchain-core: adds ability to bring the daemon to the foreground
Alexey Gladkov
gladkov.alexey at gmail.com
Tue Oct 26 22:16:00 MSK 2021
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
> 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" тут признак чего ? не надо этого.
> [ ! -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
>
--
Rgrds, legion
More information about the Make-initrd
mailing list