Buildroot Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: "Yann E. MORIN" <yann.morin.1998@free.fr>
To: "Arnout Vandecappelle (Essensium/Mind)" <arnout@mind.be>
Cc: Adam Duskett <aduskett@gmail.com>,
	Thierry Bultel <thierry.bultel@linatsea.fr>,
	buildroot@buildroot.org
Subject: Re: [Buildroot] [PATCH next v5 1/3] package/dracut: new host package
Date: Thu, 18 Aug 2022 23:09:15 +0200	[thread overview]
Message-ID: <20220818210915.GV2854108@scaer> (raw)
In-Reply-To: <20220815111710.1459820-1-arnout@mind.be>

ARnout, Thierry, All,

On 2022-08-15 13:17 +0200, Arnout Vandecappelle (Essensium/Mind) spake thusly:
> From: Thierry Bultel <thierry.bultel@linatsea.fr>
> 
> Dracut is the tool used by desktop distributions to build initrds.
> 
> In the embedded world, it can be very useful, too, for instance when
> wanting to create an initramfs for a system recovery mode.
> Whereas it is definitively possible to achieve this with buildroot, the
> process is to have a dedicated buildroot configuration for that, and
> perform a full build. Instead of doing that, dracut can pick the needed
> binaries/shared libraries, configuration files, or kernel modules from
> the 'target' directory.
> The advantage is to save build time, and also to have a consistency
> between the packages versions taken for the recovery and the production
> filesystem.
> 
> The principle of dracut is based on the so-called 'dracut modules'. The
> modules determine what will be included in the initramfs. For example,
> one of dracut's modules checks the kernel modules that are included and
> also includes the corresponding firmware blobs.
> On the host, they are on host/lib/dracut/modules.d
> Each directory as a prefix number for the order of execution, and
> at least a "module-setup.sh" script.
> 
> Dracut sources all of them, and typically calls the "check()" function,
> which is the placeholder for required binaries (that are aimed to be
> polulated in the initrd), then the "depends()" function, that lists
> other modules to depend on, and the "install()" function, that makes
> the actual work.
> 
> Dracut was initially thought to work with systems using systemd,
> but it can also work without it. Do to so, every "systemd-xxx"
> module must be disabled in the dracut configuration file. For
> convenience, the 05busybox-init module is provided, to support
> busybox init system. Note that this module should *not* be enabled when
> using systemd init. It is therefore only installed if busybox init is
> selected.
> 
> Musl and uClibc make assumptions about the existence of some symlinks
> that are not discoverable with readelf. Therefore, another module
> 05libc-links is provided that creates those links. The module is
> installed regardless of which libc is used - the script itself discovers
> if the links need to be installed based on which libc is found.
> 
> Signed-off-by: Thierry Bultel <thierry.bultel@linatsea.fr>
> Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
> Cc: Adam Duskett <aduskett@gmail.com>

Applied to next, with all the changes we discussed in this thread and
on IRC, thanks.

Regards,
Yann E. MORIN.

> ---
> Changes v1 -> v2 (all suggested by Arnout)
>   - added a wrapper script
> Changes v2 -> v3
>   - added modules for:
>      - supporting busybox system init type
>      - fixing a missing symlink for uClibc
> Changes v3 -> v4
>   - some explanations on the dracut modules in the commit log
>   - fixed a bug on the 'require_binary' line in busybox module
>   - expanded variables with double quotes and curly braces
>   - removed commented out code
>   - fixes for 'fakeroot' and 'uclibc' and 'musl' as patches
>   - musl and uclibc dynamic fix
>   - renamed dracut wrapper
>   - disabled when using another init system than systemd or busybox
> Changes v4 -> v5
>   - add hash file;
>   - add DEVELOPERS entries;
>   - replace patch 0001 with an intree file and copy in post-install;
>   - properly format patch 0000, add signoff, rename to 0001;
>   - rename busybox-buildroot to busybox-init;
>   - correct the symlink creation for musl and uclibc;
>   - remove directory part from the extra modules;
>   - remove unused dracut script (identical to dracut_wrapper);
>   - switch to prelink-cross instead of cross-ldd;
>   - make dracut_wrapper script relocatable;
>   - don't set sysroot in wrapper script, expect it to be passed as
>     --sysroot argument;
>   - call the wrapper script bin/dracut instead of sbin/dracut, and
>     rename the original to dracut.real;
>   - fix shellcheck warnings in the module scripts.
> ---
>  DEVELOPERS                                    |  2 +
>  package/Config.in.host                        |  1 +
>  ...001-dracut.sh-don-t-unset-LD_PRELOAD.patch | 29 +++++++++
>  package/dracut/Config.in.host                 |  9 +++
>  package/dracut/busybox-init-module-setup.sh   | 62 +++++++++++++++++++
>  package/dracut/dracut.hash                    |  3 +
>  package/dracut/dracut.mk                      | 47 ++++++++++++++
>  package/dracut/dracut_wrapper.sh              | 33 ++++++++++
>  package/dracut/libc-links-module-setup.sh     | 27 ++++++++
>  9 files changed, 213 insertions(+)
>  create mode 100644 package/dracut/0001-dracut.sh-don-t-unset-LD_PRELOAD.patch
>  create mode 100644 package/dracut/Config.in.host
>  create mode 100644 package/dracut/busybox-init-module-setup.sh
>  create mode 100644 package/dracut/dracut.hash
>  create mode 100644 package/dracut/dracut.mk
>  create mode 100644 package/dracut/dracut_wrapper.sh
>  create mode 100755 package/dracut/libc-links-module-setup.sh
> 
> diff --git a/DEVELOPERS b/DEVELOPERS
> index d2bd0d809a..4287fd9cf7 100644
> --- a/DEVELOPERS
> +++ b/DEVELOPERS
> @@ -225,6 +225,7 @@ F:	package/espeak/
>  N:	Arnout Vandecappelle <arnout@mind.be>
>  F:	package/arp-scan/
>  F:	package/dehydrated/
> +F:	package/dracut/
>  F:	package/freescale-imx/firmware-imx/
>  F:	package/freescale-imx/imx-lib/
>  F:	package/libpagekite/
> @@ -2796,6 +2797,7 @@ F:	configs/beagleboardx15_defconfig
>  F:	package/pugixml/
>  
>  N:	Thierry Bultel <tbultel@free.fr>
> +F:	package/dracut/
>  F:	package/mpd-mpc/
>  
>  N:	Thijs Vermeir <thijsvermeir@gmail.com>
> diff --git a/package/Config.in.host b/package/Config.in.host
> index 99edeafece..f437ef680c 100644
> --- a/package/Config.in.host
> +++ b/package/Config.in.host
> @@ -19,6 +19,7 @@ menu "Host utilities"
>  	source "package/dos2unix/Config.in.host"
>  	source "package/dosfstools/Config.in.host"
>  	source "package/doxygen/Config.in.host"
> +	source "package/dracut/Config.in.host"
>  	source "package/dtc/Config.in.host"
>  	source "package/e2fsprogs/Config.in.host"
>  	source "package/e2tools/Config.in.host"
> diff --git a/package/dracut/0001-dracut.sh-don-t-unset-LD_PRELOAD.patch b/package/dracut/0001-dracut.sh-don-t-unset-LD_PRELOAD.patch
> new file mode 100644
> index 0000000000..87083d2cef
> --- /dev/null
> +++ b/package/dracut/0001-dracut.sh-don-t-unset-LD_PRELOAD.patch
> @@ -0,0 +1,29 @@
> +From bb12f15856911d8532b569116da7dab4cbf107be Mon Sep 17 00:00:00 2001
> +From: Thierry Bultel <thierry.bultel@linatsea.fr>
> +Date: Mon, 10 Jan 2022 09:09:43 +0100
> +Subject: [PATCH] dracut.sh: don't unset LD_PRELOAD
> +
> +LD_PRELOAD is needed to run under fakeroot.
> +
> +Signed-off-by: Thierry Bultel <thierry.bultel@linatsea.fr>
> +Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
> +---
> + dracut.sh | 2 --
> + 1 file changed, 2 deletions(-)
> +
> +diff --git a/dracut.sh b/dracut.sh
> +index 60ac46f4..37f25b38 100755
> +--- a/dracut.sh
> ++++ b/dracut.sh
> +@@ -868,8 +868,6 @@ export LC_ALL=C
> + export LANG=C
> + unset LC_MESSAGES
> + unset LC_CTYPE
> +-unset LD_LIBRARY_PATH
> +-unset LD_PRELOAD
> + unset GREP_OPTIONS
> + 
> + export DRACUT_LOG_LEVEL=warning
> +-- 
> +2.37.1
> +
> diff --git a/package/dracut/Config.in.host b/package/dracut/Config.in.host
> new file mode 100644
> index 0000000000..18f562b310
> --- /dev/null
> +++ b/package/dracut/Config.in.host
> @@ -0,0 +1,9 @@
> +config BR2_PACKAGE_HOST_DRACUT
> +	bool
> +	select BR2_PACKAGE_HOST_KMOD
> +	help
> +	  dracut is used to create an initramfs image by
> +	  copying tools and files from an installed system
> +	  and combining it with the dracut framework.
> +
> +	  https://dracut.wiki.kernel.org
> diff --git a/package/dracut/busybox-init-module-setup.sh b/package/dracut/busybox-init-module-setup.sh
> new file mode 100644
> index 0000000000..2667f866d1
> --- /dev/null
> +++ b/package/dracut/busybox-init-module-setup.sh
> @@ -0,0 +1,62 @@
> +#!/bin/bash
> +
> +check() {
> +	require_binaries busybox || return 1
> +	return 0
> +}
> +
> +depends() {
> +	return 0
> +}
> +
> +install_busybox_links() {
> +	dir=$1
> +	linkname=$2
> +
> +	(cd "${dracutsysrootdir?}${dir}" &&
> +	for x in *; do
> +		if [ "$(readlink "$x")" = "${linkname}" ]; then
> +			ln -sf "${linkname}" "${initdir?}/${dir}/$x"
> +		fi
> +	done
> +	)
> +}
> +
> +install() {
> +	inst_multiple /bin/busybox
> +
> +	# wrapper script for early console; will launch /sbin/init
> +	# after having mounted devtmpfs
> +	inst_multiple /init
> +
> +	ln -s ../bin/busybox "${initdir?}"/sbin/init
> +
> +	if [ -e "${dracutsysrootdir?}/lib64" ]; then
> +		ln -sf lib "${initdir?}/lib64"
> +		ln -sf lib "${initdir?}/usr/lib64"
> +	fi
> +
> +	if [ -e "${dracutsysrootdir?}/lib32" ]; then
> +		ln -sf lib "${initdir?}/lib32"
> +		ln -sf lib "${initdir?}/usr/lib32"
> +	fi
> +
> +	install_busybox_links "/bin" "busybox"
> +	install_busybox_links "/sbin" "../bin/busybox"
> +	if [ ! -L /bin ]; then
> +		install_busybox_links "/usr/bin" "../../bin/busybox"
> +		install_busybox_links "/usr/sbin" "../../bin/busybox"
> +	fi
> +
> +	inst_multiple \
> +		/etc/inittab	\
> +		/etc/init.d/rcS \
> +		/etc/init.d/rcK \
> +		/etc/issue	\
> +		/etc/fstab	\
> +		/etc/group	\
> +		/etc/passwd	\
> +		/etc/shadow	\
> +		/etc/hostname
> +}
> +
> diff --git a/package/dracut/dracut.hash b/package/dracut/dracut.hash
> new file mode 100644
> index 0000000000..3cda736856
> --- /dev/null
> +++ b/package/dracut/dracut.hash
> @@ -0,0 +1,3 @@
> +# Locally computed
> +sha256  4baa08206cceeb124dbf1075a0daf774b5a8f144ce2e01d82a144af3020fd65b  dracut-055.tar.xz
> +sha256  8177f97513213526df2cf6184d8ff986c675afb514d4e68a404010521b880643  COPYING
> diff --git a/package/dracut/dracut.mk b/package/dracut/dracut.mk
> new file mode 100644
> index 0000000000..7afec80c0e
> --- /dev/null
> +++ b/package/dracut/dracut.mk
> @@ -0,0 +1,47 @@
> +################################################################################
> +#
> +# dracut
> +#
> +################################################################################
> +
> +DRACUT_VERSION = 055
> +DRACUT_SOURCE = dracut-$(DRACUT_VERSION).tar.xz
> +DRACUT_SITE = $(BR2_KERNEL_MIRROR)/linux/utils/boot/dracut
> +DRACUT_LICENSE = GPL-2.0
> +DRACUT_LICENSE_FILES = COPYING
> +
> +HOST_DRACUT_DEPENDENCIES = host-pkgconf host-kmod host-prelink-cross
> +
> +define HOST_DRACUT_POST_INSTALL_WRAPPER_SCRIPT
> +	mv $(HOST_DIR)/bin/dracut $(HOST_DIR)/bin/dracut.real
> +	install -D -m 0755 $(HOST_DRACUT_PKGDIR)/dracut_wrapper.sh $(HOST_DIR)/bin/dracut
> +endef
> +HOST_DRACUT_POST_INSTALL_HOOKS += HOST_DRACUT_POST_INSTALL_WRAPPER_SCRIPT
> +
> +# When using uClibc or musl, there must be "ls-uClibc.so.1" or
> +# "ld-musl-x.so" symlinks, respectively - else the init process cannot
> +# start
> +define HOST_DRACUT_POST_INSTALL_LIBC_LINKS_MODULE
> +	$(INSTALL) -D -m 0755 package/dracut/libc-links-module-setup.sh \
> +		$(HOST_DIR)/lib/dracut/modules.d/05libc-links/module-setup.sh
> +endef
> +HOST_DRACUT_POST_INSTALL_HOOKS += HOST_DRACUT_POST_INSTALL_LIBC_LINKS_MODULE
> +
> +ifeq ($(BR2_INIT_BUSYBOX),y)
> +# Dracut does not support busybox init (systemd init is assumed to work
> +# out of the box, though). It provides a busybox module, that does not
> +# use the same paths as buildroot, and is not meant to be used as an init
> +# system.
> +# So it is simpler for users to disable the standard 'busybox' module in
> +# the configuration file, and enable the "busybox-init' module instead.
> +# Note that setting the script as executable (0755) is not mandatory,
> +# but this is what dracut does on all its modules, so lets just conform
> +# to it.
> +define HOST_DRACUT_POST_INSTALL_BUSYBOX_INIT_MODULE
> +	$(INSTALL) -D -m 0755 package/dracut/busybox-init-module-setup.sh \
> +		$(HOST_DIR)/lib/dracut/modules.d/05busybox-init/module-setup.sh
> +endef
> +HOST_DRACUT_POST_INSTALL_HOOKS += HOST_DRACUT_POST_INSTALL_BUSYBOX_INIT_MODULE
> +endif
> +
> +$(eval $(host-autotools-package))
> diff --git a/package/dracut/dracut_wrapper.sh b/package/dracut/dracut_wrapper.sh
> new file mode 100644
> index 0000000000..3f58b0907e
> --- /dev/null
> +++ b/package/dracut/dracut_wrapper.sh
> @@ -0,0 +1,33 @@
> +#!/bin/bash
> +set -e
> +
> +# Find the --sysroot argument
> +sysroot=
> +next_arg=
> +for arg; do
> +	if [ "$next_arg" = 1 ]; then
> +		next_arg=
> +		sysroot="$arg"
> +		continue
> +	fi
> +
> +	case "$arg" in
> +	--sysroot=*)
> +		sysroot="${arg#*=}"
> +		;;
> +	--sysroot)
> +		next_arg=1
> +		;;
> +	esac
> +done
> +if [ -z "$sysroot" ]; then
> +	echo "$0: --sysroot argument must be given." 1>&2
> +	exit 1
> +fi
> +
> +topdir="$(dirname "$(realpath "$(dirname "$0")")")"
> +export DRACUT_LDD="$topdir/sbin/prelink-rtld --root='${sysroot}'"
> +export DRACUT_INSTALL="$topdir/lib/dracut/dracut-install"
> +export DRACUT_LDCONFIG=/bin/true
> +export dracutbasedir="$topdir/lib/dracut"
> +exec "$topdir/bin/dracut.real" "$@"
> diff --git a/package/dracut/libc-links-module-setup.sh b/package/dracut/libc-links-module-setup.sh
> new file mode 100755
> index 0000000000..e15b216e6e
> --- /dev/null
> +++ b/package/dracut/libc-links-module-setup.sh
> @@ -0,0 +1,27 @@
> +#!/bin/bash
> +
> +# Adds the missing links for uClibc or musl, if needed
> +
> +check() {
> +	return 0
> +}
> +
> +depends() {
> +	return 0
> +}
> +
> +install() {
> +	# Despite of the fact that the listed dependency (reported by readelf -d)
> +	# is purely /lib/libc.so, the musl symlink is needed anyway.
> +	musl_link="$(find "${dracutsysrootdir?}/lib" -name "ld-musl-*.so*")"
> +	if [ -n "$musl_link" ] ; then
> +		ln -s libc.so "${initdir?}/lib/$(basename "${musl_link}")"
> +	fi
> +
> +	# Same for uClibc, the listed dependency
> +	# is ld-uClibc.so.1, the loader needs the ld-uClibc.so.0, too
> +	uclibc_link="$(find "${dracutsysrootdir?}/lib" -name "ld-uClibc-*.so*")"
> +	if [ -n "$uclibc_link" ] ; then
> +		ln -s ld-uClibc.so.1 "${initdir?s}/lib/ld-uClibc.so.0"
> +	fi
> +}
> -- 
> 2.37.1
> 
> _______________________________________________
> buildroot mailing list
> buildroot@buildroot.org
> https://lists.buildroot.org/mailman/listinfo/buildroot

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 561 099 427 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

      parent reply	other threads:[~2022-08-18 21:09 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-15 11:17 [Buildroot] [PATCH next v5 1/3] package/dracut: new host package Arnout Vandecappelle (Essensium/Mind)
2022-08-15 11:17 ` [Buildroot] [PATCH next v5 2/3] fs/cpio: new option to use dracut tool Arnout Vandecappelle (Essensium/Mind)
2022-08-15 13:05   ` Yann E. MORIN
2022-08-15 16:37     ` Arnout Vandecappelle
2022-08-18 21:09   ` Yann E. MORIN
2022-08-15 11:17 ` [Buildroot] [PATCH next v5 3/3] support/testing/tests/fs/test_cpio.py: new runtime test Arnout Vandecappelle (Essensium/Mind)
2022-08-18 21:10   ` Yann E. MORIN
2022-08-15 12:36 ` [Buildroot] [PATCH next v5 1/3] package/dracut: new host package Yann E. MORIN
2022-08-15 16:27   ` Arnout Vandecappelle via buildroot
2022-08-18 21:09 ` Yann E. MORIN [this message]

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=20220818210915.GV2854108@scaer \
    --to=yann.morin.1998@free.fr \
    --cc=aduskett@gmail.com \
    --cc=arnout@mind.be \
    --cc=buildroot@buildroot.org \
    --cc=thierry.bultel@linatsea.fr \
    /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
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox