[make-initrd] [PATCH v6 21/22] bootchain-core: adds ability to bring the daemon to the foreground
Leonid Krivoshein
klark.devel at gmail.com
Sun Oct 24 20:23:22 MSK 2021
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.
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
[ ! -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
More information about the Make-initrd
mailing list