[make-initrd] [PATCH v6 01/22] separate new feature of bootchain-core from pipeline
Alexey Gladkov
gladkov.alexey at gmail.com
Tue Oct 26 12:08:23 MSK 2021
On Sun, Oct 24, 2021 at 08:19:59PM +0300, Leonid Krivoshein wrote:
> Pipeline live as an add-in over bootchain-core for backward
> compatibility with already existing solutions.
> For bootchain-core it is planned to implement a number of
> new features to cover the tasks of bootloading the installer
> and live systems.
>
> Signed-off-by: Leonid Krivoshein <klark.devel at gmail.com>
> ---
> features/bootchain-core/README.md | 82 +++++++++++++++++++
> features/bootchain-core/config.mk | 8 ++
> .../data/etc/initrd/cmdline.d/bootchain-core} | 3 +-
> .../data/etc/rc.d/init.d/bootchain} | 8 +-
> .../udev/rules.d/50-bootchain-waitdev.rules} | 2 +-
> .../data/lib/bootchain}/getimage | 2 +-
> .../data/lib/bootchain}/mountfs | 2 +-
> .../data/lib/bootchain}/overlayfs | 2 +-
> .../data/lib/bootchain}/rootfs | 2 +-
> .../data/lib/bootchain}/waitdev | 4 +-
> .../data/lib/initrd/cmdline.d/bootchain | 6 ++
> .../data/lib/initrd/cmdline.d/pipeline | 2 +-
> .../lib/uevent/filters/bootchain-waitdev} | 4 +-
> .../data/sbin/bootchain-sh-functions} | 12 +--
> .../data/sbin/chaind} | 22 ++---
> features/bootchain-core/rules.mk | 4 +
> features/pipeline/config.mk | 9 +-
> features/pipeline/rules.mk | 6 --
> 18 files changed, 134 insertions(+), 46 deletions(-)
> create mode 100644 features/bootchain-core/README.md
> create mode 100644 features/bootchain-core/config.mk
> rename features/{pipeline/data/etc/initrd/cmdline.d/pipeline => bootchain-core/data/etc/initrd/cmdline.d/bootchain-core} (63%)
> rename features/{pipeline/data/etc/rc.d/init.d/pipeline => bootchain-core/data/etc/rc.d/init.d/bootchain} (83%)
> rename features/{pipeline/data/etc/udev/rules.d/50-pipeline-waitdev.rules => bootchain-core/data/etc/udev/rules.d/50-bootchain-waitdev.rules} (77%)
> rename features/{pipeline/data/lib/pipeline => bootchain-core/data/lib/bootchain}/getimage (93%)
> rename features/{pipeline/data/lib/pipeline => bootchain-core/data/lib/bootchain}/mountfs (91%)
> rename features/{pipeline/data/lib/pipeline => bootchain-core/data/lib/bootchain}/overlayfs (95%)
> rename features/{pipeline/data/lib/pipeline => bootchain-core/data/lib/bootchain}/rootfs (86%)
> rename features/{pipeline/data/lib/pipeline => bootchain-core/data/lib/bootchain}/waitdev (83%)
> create mode 100755 features/bootchain-core/data/lib/initrd/cmdline.d/bootchain
> rename features/{pipeline => bootchain-core}/data/lib/initrd/cmdline.d/pipeline (64%)
> rename features/{pipeline/data/lib/uevent/filters/pipeline-waitdev => bootchain-core/data/lib/uevent/filters/bootchain-waitdev} (77%)
> rename features/{pipeline/data/sbin/pipeline-sh-functions => bootchain-core/data/sbin/bootchain-sh-functions} (70%)
> rename features/{pipeline/data/sbin/pipelined => bootchain-core/data/sbin/chaind} (78%)
> create mode 100644 features/bootchain-core/rules.mk
>
> diff --git a/features/bootchain-core/README.md b/features/bootchain-core/README.md
> new file mode 100644
> index 0000000..ce2bf98
> --- /dev/null
> +++ b/features/bootchain-core/README.md
> @@ -0,0 +1,82 @@
> +# Feature: bootchain-core
> +
> +`bootchain-core` - it's a fork and further development the original
> +feature of `pipeline`. This feature allow us to consistently setup
> +steps-scripts one by one. For details about `pipeline` you can see
> +in ../features/pipeline/README.md.
> +
> +In fork process `pipeline` was divided by three parts:
> +
> +- `bootchain-core` - the main functional of feature `pipeline`, common
> + API and daemon.
> +- `bootchain-getimage` - method to networking boot from ISO-image with
> + the wget utility.
> +- `bootchain-waitdev` - method to boot from specified local media.
> +
> +The future work with `bootchain` allowed us to create a few modules.
> +They are expected to be upstream soon. This divide on modules allow
> +us to optimize fill in `initramfs` only which we are need.
> +
> +## Main components of bootchain-core
> +
> +- `/sbin/bootchain-sh-functions` - common API and evolution
> + of `pipeline-sh-functions`.
> +- `/sbin/chaind` - daemon, evolution of `pipelined`.
> +- `/etc/rc.d/init.d/bootchain` - sysvinit start script.
> +
> +## Reasons of making fork and rename pipeline
> +
> +- A set of `bootchain` modules was developed in order to create a
> + replacement in stage1 programs `propagator`, fully integrated into
> + the run-time `make-initrd`. In the original version, the `pipeline`
> + feature did not satisfy this need. At an early stage of development,
> + it was not yet known what functionality `bootchain` would eventually
> + have, how far it would go from the fork and be able to whether to be
> + fully compatible with it.
> +- For some time, the development of `bootchain` was carried out independently
> + of the main project `make-initrd`. To build and test bootable disks with
> + `make-initrd` and `bootchain` so that `bootchain` does not depend on
> + `make-initrd` versions, so that not intersect with the `pipeline` features
> + built into the `make-initrd` and so as not to interfere the author of
> + `make-initrd`, the `pipeline` feature had to be copied under a different
> + name, giving it a more appropriate name at the same time.
> +- The result of the completed step is not always used next. Steps-scripts
> + they can use the results not only of the previous one, but also of any
> + earlier one the completed step. So it's not a pipeline in its purest
> + form, but rather a chain loading steps, the sequence of actions performed.
> +
> +## External elements of the bootchain (steps-scripts)
> +
> +- `mountfs` - mounts a file or device from the result of the previous or other
> + specified step.
> +- `overlayfs` - combines one or more elements of the boot chain using overlayfs.
> +- `rootfs` - forces the daemon to use the result of the previous element as the
> + found root of stage 2.
> +
> +## Boot parameters
> +
> +- `bootchain=name1[,name2][,name3]` - defines the initial state of the boot
> + chains, i.e. the steps that the daemon must go through one by one. These can
> + be both built-in pseudo-steps and real scripts of the actions performed. The
> + names these steps are listed separated by commas.
> +- `pipeline=name1[,name2][,name3]` - alias for `bootchain=...`.
> +- `mountfs=target` - specifies the file or device to be mounted.
> +- `overlayfs=list` - defines the list of elements to combine.
> +
> +## bootchain-sh-functions API
> +
> +- check_parameter() - checks that the required parameter is not empty, otherwise
> + it exits via fatal().
> +- get_parameter() - outputs the value of the parameter of the current step by
> + the index $callnum.
> +- resolve_target() - output the path to a file, directory or device, depending
> + on from the parameter.
> +- run() - run an external command.
> +
> +## Example
> +
> +Cmdline: root=pipeline pipeline=getimage,mountfs,overlayfs,rootfs getimage=http://ftp.altlinux.org/pub/people/mike/iso/misc/vi-20140918-i586.iso mountfs=rescue
> +
> +Following these parameters, the daemon loads the image "vi-20140918-i586.iso",
> +mounts it via the loop device, mounts the "rescue" file from it as squashfs of
> +the root system, makes it writable using overlayfs and tries to boot from it.
> diff --git a/features/bootchain-core/config.mk b/features/bootchain-core/config.mk
> new file mode 100644
> index 0000000..33e66ed
> --- /dev/null
> +++ b/features/bootchain-core/config.mk
> @@ -0,0 +1,8 @@
> +$(call feature-requires,depmod-image add-udev-rules)
> +
> +BOOTCHAIN_CORE_DATADIR = $(FEATURESDIR)/bootchain-core/data
> +
> +BOOTCHAIN_CORE_RULES = \
> + *-cdrom_id.rules
> +
> +BOOTCHAIN_CORE_MODULES = isofs squashfs overlay
> diff --git a/features/pipeline/data/etc/initrd/cmdline.d/pipeline b/features/bootchain-core/data/etc/initrd/cmdline.d/bootchain-core
> similarity index 63%
> rename from features/pipeline/data/etc/initrd/cmdline.d/pipeline
> rename to features/bootchain-core/data/etc/initrd/cmdline.d/bootchain-core
> index 4200d57..8af3a20 100644
> --- a/features/pipeline/data/etc/initrd/cmdline.d/pipeline
> +++ b/features/bootchain-core/data/etc/initrd/cmdline.d/bootchain-core
> @@ -1,4 +1,5 @@
> -register_parameter string PIPELINE
> +register_parameter string BOOTCHAIN
> +register_alias BOOTCHAIN PIPELINE
> register_array string GETIMAGE
> register_array string MOUNTFS
> register_array string OVERLAYFS
> diff --git a/features/pipeline/data/etc/rc.d/init.d/pipeline b/features/bootchain-core/data/etc/rc.d/init.d/bootchain
> similarity index 83%
> rename from features/pipeline/data/etc/rc.d/init.d/pipeline
> rename to features/bootchain-core/data/etc/rc.d/init.d/bootchain
> index 89d9de5..1be6d39 100755
> --- a/features/pipeline/data/etc/rc.d/init.d/pipeline
> +++ b/features/bootchain-core/data/etc/rc.d/init.d/bootchain
> @@ -1,6 +1,6 @@
> #!/bin/bash
> ### BEGIN INIT INFO
> -# Provides: pipeline
> +# Provides: bootchain
> # Required-Start: uevent udev
> # Should-Start:
> # Required-Stop:
> @@ -13,14 +13,14 @@
> . /.initrd/initenv
> . /etc/init.d/template
>
> -NAME=pipelined
> +NAME=chaind
> PIDFILE="/var/run/$NAME.pid"
> ARGS="--lockfile $LOCKFILE --pidfile $PIDFILE --name $NAME --displayname $NAME"
>
> prepare() {
> local dir i n
>
> - dir=/.initrd/pipeline/waitdev
> + dir=/.initrd/bootchain/waitdev
> mkdir -p -- "$dir"
>
> i=0
> @@ -32,7 +32,7 @@ prepare() {
>
> start() {
> RETVAL=0
> - if [ "${ROOT-}" = pipeline ]; then
> + if [ "${ROOT-}" = bootchain ] || [ "${ROOT-}" = pipeline ]; then
> prepare
> start_daemon --background $ARGS "$NAME"
> RETVAL=$?
> diff --git a/features/pipeline/data/etc/udev/rules.d/50-pipeline-waitdev.rules b/features/bootchain-core/data/etc/udev/rules.d/50-bootchain-waitdev.rules
> similarity index 77%
> rename from features/pipeline/data/etc/udev/rules.d/50-pipeline-waitdev.rules
> rename to features/bootchain-core/data/etc/udev/rules.d/50-bootchain-waitdev.rules
> index e473deb..e4b8616 100644
> --- a/features/pipeline/data/etc/udev/rules.d/50-pipeline-waitdev.rules
> +++ b/features/bootchain-core/data/etc/udev/rules.d/50-bootchain-waitdev.rules
> @@ -1 +1 @@
> -SUBSYSTEM=="block", ACTION!="remove", RUN+="/lib/uevent/filters/pipeline-waitdev"
> +SUBSYSTEM=="block", ACTION!="remove", RUN+="/lib/uevent/filters/bootchain-waitdev"
> diff --git a/features/pipeline/data/lib/pipeline/getimage b/features/bootchain-core/data/lib/bootchain/getimage
> similarity index 93%
> rename from features/pipeline/data/lib/pipeline/getimage
> rename to features/bootchain-core/data/lib/bootchain/getimage
> index 409ad14..1f141ac 100755
> --- a/features/pipeline/data/lib/pipeline/getimage
> +++ b/features/bootchain-core/data/lib/bootchain/getimage
> @@ -1,6 +1,6 @@
> #!/bin/bash -efu
>
> -. pipeline-sh-functions
> +. bootchain-sh-functions
>
> check_parameter GETIMAGE
> url="$(get_parameter GETIMAGE)"
> diff --git a/features/pipeline/data/lib/pipeline/mountfs b/features/bootchain-core/data/lib/bootchain/mountfs
> similarity index 91%
> rename from features/pipeline/data/lib/pipeline/mountfs
> rename to features/bootchain-core/data/lib/bootchain/mountfs
> index d15ae91..45ffa68 100755
> --- a/features/pipeline/data/lib/pipeline/mountfs
> +++ b/features/bootchain-core/data/lib/bootchain/mountfs
> @@ -1,6 +1,6 @@
> #!/bin/bash -efu
>
> -. pipeline-sh-functions
> +. bootchain-sh-functions
>
> check_parameter MOUNTFS
> param="$(get_parameter MOUNTFS)"
> diff --git a/features/pipeline/data/lib/pipeline/overlayfs b/features/bootchain-core/data/lib/bootchain/overlayfs
> similarity index 95%
> rename from features/pipeline/data/lib/pipeline/overlayfs
> rename to features/bootchain-core/data/lib/bootchain/overlayfs
> index 23b869b..58261cc 100755
> --- a/features/pipeline/data/lib/pipeline/overlayfs
> +++ b/features/bootchain-core/data/lib/bootchain/overlayfs
> @@ -1,6 +1,6 @@
> #!/bin/bash -efu
>
> -. pipeline-sh-functions
> +. bootchain-sh-functions
>
> target="$(get_parameter OVERLAYFS)"
>
> diff --git a/features/pipeline/data/lib/pipeline/rootfs b/features/bootchain-core/data/lib/bootchain/rootfs
> similarity index 86%
> rename from features/pipeline/data/lib/pipeline/rootfs
> rename to features/bootchain-core/data/lib/bootchain/rootfs
> index e4b2ca9..6ac64a6 100755
> --- a/features/pipeline/data/lib/pipeline/rootfs
> +++ b/features/bootchain-core/data/lib/bootchain/rootfs
> @@ -1,6 +1,6 @@
> #!/bin/bash -efu
>
> -. pipeline-sh-functions
> +. bootchain-sh-functions
>
> [ -n "$prevdir" ] ||
> fatal "no previous step to use as rootfs"
> diff --git a/features/pipeline/data/lib/pipeline/waitdev b/features/bootchain-core/data/lib/bootchain/waitdev
> similarity index 83%
> rename from features/pipeline/data/lib/pipeline/waitdev
> rename to features/bootchain-core/data/lib/bootchain/waitdev
> index f818cc5..74af6ea 100755
> --- a/features/pipeline/data/lib/pipeline/waitdev
> +++ b/features/bootchain-core/data/lib/bootchain/waitdev
> @@ -1,12 +1,12 @@
> #!/bin/bash -efu
>
> -. pipeline-sh-functions
> +. bootchain-sh-functions
>
> check_parameter WAITDEV
> devspec="$(get_parameter WAITDEV)"
>
> while [ -n "$devspec" ]; do
> - envfile="/.initrd/pipeline/waitdev/$callnum"
> + envfile="/.initrd/bootchain/waitdev/$callnum"
>
> if [ -s "$envfile" ]; then
> devfile=
> diff --git a/features/bootchain-core/data/lib/initrd/cmdline.d/bootchain b/features/bootchain-core/data/lib/initrd/cmdline.d/bootchain
> new file mode 100755
> index 0000000..b692f6d
> --- /dev/null
> +++ b/features/bootchain-core/data/lib/initrd/cmdline.d/bootchain
> @@ -0,0 +1,6 @@
> +#!/bin/bash -efu
> +
> +. /.initrd/initenv
> +
> +[ "${ROOT-}" != bootchain ] ||
> + echo bootchain > /etc/initrd/method
> diff --git a/features/pipeline/data/lib/initrd/cmdline.d/pipeline b/features/bootchain-core/data/lib/initrd/cmdline.d/pipeline
> similarity index 64%
> rename from features/pipeline/data/lib/initrd/cmdline.d/pipeline
> rename to features/bootchain-core/data/lib/initrd/cmdline.d/pipeline
> index ac65b68..21b164c 100755
> --- a/features/pipeline/data/lib/initrd/cmdline.d/pipeline
> +++ b/features/bootchain-core/data/lib/initrd/cmdline.d/pipeline
> @@ -3,4 +3,4 @@
> . /.initrd/initenv
>
> [ "${ROOT-}" != pipeline ] ||
> - echo pipeline > /etc/initrd/method
> + echo bootchain > /etc/initrd/method
> diff --git a/features/pipeline/data/lib/uevent/filters/pipeline-waitdev b/features/bootchain-core/data/lib/uevent/filters/bootchain-waitdev
> similarity index 77%
> rename from features/pipeline/data/lib/uevent/filters/pipeline-waitdev
> rename to features/bootchain-core/data/lib/uevent/filters/bootchain-waitdev
> index d975006..272aee7 100755
> --- a/features/pipeline/data/lib/uevent/filters/pipeline-waitdev
> +++ b/features/bootchain-core/data/lib/uevent/filters/bootchain-waitdev
> @@ -3,8 +3,8 @@
> . /.initrd/initenv
> . initrd-sh-functions
>
> -mkdir -p -- /.initrd/pipeline/waitdev
> -cd /.initrd/pipeline/waitdev
> +mkdir -p -- /.initrd/bootchain/waitdev
> +cd /.initrd/bootchain/waitdev/
>
> i=0
> while [ "$i" -lt "${WAITDEV:-0}" ]; do
> diff --git a/features/pipeline/data/sbin/pipeline-sh-functions b/features/bootchain-core/data/sbin/bootchain-sh-functions
> similarity index 70%
> rename from features/pipeline/data/sbin/pipeline-sh-functions
> rename to features/bootchain-core/data/sbin/bootchain-sh-functions
> index 662d069..fa6201f 100644
> --- a/features/pipeline/data/sbin/pipeline-sh-functions
> +++ b/features/bootchain-core/data/sbin/bootchain-sh-functions
> @@ -1,13 +1,13 @@
> #!/bin/bash -efu
>
> -if [ -z "${__pipeline_sh_functions-}" ]; then
> -__pipeline_sh_functions=1
> +if [ -z "${__bootchain_sh_functions-}" ]; then
> +__bootchain_sh_functions=1
>
> . /.initrd/initenv
> . shell-signal
>
> -handlerdir="/lib/pipeline"
> -mntdir="/dev/pipeline"
> +handlerdir=/lib/bootchain
> +[ "${ROOT-}" = pipeline ] && mntdir=/dev/pipeline || mntdir=/dev/bootchain
>
> check_parameter()
> {
> @@ -29,7 +29,7 @@ resolve_target()
> '')
> ;;
> pipe[0-9]|pipe[0-9][0-9]|pipe[0-9][0-9][0-9])
> - target="$mntdir/dst/$target"
> + target="$mntdir/dst/step${target:4}"
> ;;
Тут явно что-то не то.
Ты переименовал pipe* в step* и сделал это изменение для сохранения
обратной совместимости. Только что будет если в качестве аргумента этой
функции передадут новое имя step* ?
Кажется, потерян ещё один кейс:
step[0-9]|step[0-9][0-9]|step[0-9][0-9][0-9])
target="$mntdir/dst/$target"
;;
> *)
> if [ -z "${prevdir-}" ]; then
> @@ -48,4 +48,4 @@ run()
> "$@"
> }
>
> -fi # __pipeline_sh_functions
> +fi # __bootchain_sh_functions
> diff --git a/features/pipeline/data/sbin/pipelined b/features/bootchain-core/data/sbin/chaind
> similarity index 78%
> rename from features/pipeline/data/sbin/pipelined
> rename to features/bootchain-core/data/sbin/chaind
> index 1d30061..d401101 100755
> --- a/features/pipeline/data/sbin/pipelined
> +++ b/features/bootchain-core/data/sbin/chaind
> @@ -21,7 +21,7 @@ exit_handler()
> set_cleanup_handler exit_handler
> echo "$$" >"$pidfile"
>
> -. pipeline-sh-functions
> +. bootchain-sh-functions
>
>
> [ "${RDLOG-}" != 'console' ] ||
> @@ -35,22 +35,22 @@ mkdir -p -- "$mntdir"
> mountpoint -q "$mntdir" ||
> mount -t tmpfs tmpfs "$mntdir" ||:
>
> -pipenum=0
> -pipe="$PIPELINE"
> +stepnum=0
> +chainsteps="$BOOTCHAIN"
> datadir=
> destdir=
>
> -while [ -n "$pipe" ]; do
> - name="${pipe%%,*}"
> +while [ -n "$chainsteps" ]; do
> + name="${chainsteps%%,*}"
> exe="$handlerdir/$name"
>
> if [ -x "$exe" ]; then
> eval "callnum=\"\${callnum_$name:-0}\""
>
> - datadir="$mntdir/src/pipe$pipenum"
> - destdir="$mntdir/dst/pipe$pipenum"
> + datadir="$mntdir/src/step$stepnum"
> + destdir="$mntdir/dst/step$stepnum"
>
> - [ "$pipenum" != 0 ] ||
> + [ "$stepnum" != 0 ] ||
> prevdir=""
>
> mkdir -p -- "$datadir" "$destdir"
> @@ -80,8 +80,8 @@ while [ -n "$pipe" ]; do
> eval "callnum_$name=\"\$callnum\""
> fi
>
> - pipe="${pipe#$name}"
> - pipe="${pipe#,}"
> + chainsteps="${chainsteps#$name}"
> + chainsteps="${chainsteps#,}"
>
> - pipenum=$(($pipenum + 1))
> + stepnum=$(($stepnum + 1))
> done
> diff --git a/features/bootchain-core/rules.mk b/features/bootchain-core/rules.mk
> new file mode 100644
> index 0000000..724a0b0
> --- /dev/null
> +++ b/features/bootchain-core/rules.mk
> @@ -0,0 +1,4 @@
> +MODULES_TRY_ADD += $(BOOTCHAIN_CORE_MODULES)
> +
> +PUT_UDEV_RULES += $(BOOTCHAIN_CORE_RULES)
> +PUT_FEATURE_DIRS += $(BOOTCHAIN_CORE_DATADIR)
> diff --git a/features/pipeline/config.mk b/features/pipeline/config.mk
> index 9172528..3ff29ac 100644
> --- a/features/pipeline/config.mk
> +++ b/features/pipeline/config.mk
> @@ -1,8 +1 @@
> -$(call feature-requires,depmod-image add-udev-rules)
> -
> -PIPELINE_DATADIR = $(FEATURESDIR)/pipeline/data
> -
> -PIPELINE_RULES = \
> - *-cdrom_id.rules
> -
> -PIPELINE_MODULES = isofs squashfs overlay
> +$(call feature-requires,bootchain-core)
> diff --git a/features/pipeline/rules.mk b/features/pipeline/rules.mk
> index 3ccd260..e69de29 100644
> --- a/features/pipeline/rules.mk
> +++ b/features/pipeline/rules.mk
> @@ -1,6 +0,0 @@
> -MODULES_TRY_ADD += $(PIPELINE_MODULES)
> -
> -PUT_UDEV_RULES += $(PIPELINE_RULES)
> -
> -PUT_FEATURE_DIRS += $(PIPELINE_DATADIR)
> -PUT_FEATURE_FILES += $(PIPELINE_FILES)
> --
> 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