kumquat-buildroot/package/dracut/dracut_wrapper

49 lines
1.0 KiB
Plaintext
Raw Normal View History

package/dracut: new host package 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> [arnout@mind.be: many changes] Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be> Cc: Adam Duskett <aduskett@gmail.com> [yann.morin.1998@free.fr: some additional fixups] Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
2022-08-15 13:17:08 +02:00
#!/bin/bash
set -e
# Find the --sysroot argument
sysroot=
next_arg=false
for arg; do
if ${next_arg}; then
next_arg=false
sysroot="${arg}"
continue # not break, in case there are more than one
fi
case "${arg}" in
(--sysroot|-r)
next_arg=true
continue
;;
(--sysroot=*)
sysroot="${arg#*=}"
continue # not break, in case there are more than one
;;
(-r?*)
sysroot="${arg#-r}"
continue # not break, in case there are more than one
;;
esac
done
if [ -z "${sysroot}" ]; then
echo "${0}: --sysroot argument must be given." 1>&2
exit 1
fi
topdir="$(dirname "$(realpath "$(dirname "${0}")")")"
package/dracut: fix dracut_wrapper As reported by Thierry Bultel [1], dracut doesn't work since the version bump to version 059. Further investigation by Andreas Naumann [2] reported that the issue come from this commit d010fa0 refactor(dracut-install): fork() instead of popen(), sanitise line reading [3]. The issue come from our dracut_wrapper and how DRACUT_LDD is defined. Indeed dracut expect DRACUT_LDD=ldd or a single binary (without arguments) but we are using "prelink-rtld --root='${sysroot}'". With the change introduced by [3], our DRACUT_LDD is used directly by execlp() leading to an error: execlp(ldd, ldd, fullsrcpath, (char *)NULL); Use mktemp to generate a temporary dracut-ldd script using prelink-rtld --root='${sysroot}' ${1} execute dracut.real in a subshell to cleanup the temporary file at the end of the dracut wrapper script. Fixes: https://gitlab.com/buildroot.org/buildroot/-/jobs/6224243423 [tests.fs.test_cpio.TestCpioDracutGlibcMergedUsr] https://gitlab.com/buildroot.org/buildroot/-/jobs/6224243434 [tests.fs.test_cpio.TestCpioDracutMuslMergedUsr] https://gitlab.com/buildroot.org/buildroot/-/jobs/6224243567 [tests.fs.test_cpio.TestCpioDracutUclibcMergedUsr] https://gitlab.com/buildroot.org/buildroot/-/jobs/6224243559 [tests.fs.test_cpio.TestCpioDracutGlibc] https://gitlab.com/buildroot.org/buildroot/-/jobs/6224243504 [tests.fs.test_cpio.TestCpioDracutUclibc] https://gitlab.com/buildroot.org/buildroot/-/jobs/6224243498 [tests.fs.test_cpio.TestCpioDracutMusl] [1] http://lists.busybox.net/pipermail/buildroot/2024-February/684145.html [2] http://lists.busybox.net/pipermail/buildroot/2024-February/684503.html [3] https://github.com/dracutdevs/dracut/commit/d010fa0d7f8ef42ad31729d027d2e4be6dd6e588 Fixes: 145f01ded5 ("package/dracut: bump to version 059") Reported-by: Thierry Bultel <thierry.bultel@linatsea.fr> Signed-off-by: Romain Naour <romain.naour@smile.fr> Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
2024-02-25 23:57:28 +01:00
DRACUT_LDD="$(mktemp /tmp/dracut-ldd.XXXXXX)"
cat >"${DRACUT_LDD}" <<EOL
#!/bin/bash
${topdir}/sbin/prelink-rtld --root='${sysroot}' \${1}
EOL
chmod +x "${DRACUT_LDD}"
export DRACUT_LDD
package/dracut: new host package 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> [arnout@mind.be: many changes] Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be> Cc: Adam Duskett <aduskett@gmail.com> [yann.morin.1998@free.fr: some additional fixups] Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
2022-08-15 13:17:08 +02:00
export DRACUT_INSTALL="${topdir}/lib/dracut/dracut-install"
export DRACUT_LDCONFIG=/bin/true
export dracutbasedir="${topdir}/lib/dracut"
package/dracut: fix dracut_wrapper As reported by Thierry Bultel [1], dracut doesn't work since the version bump to version 059. Further investigation by Andreas Naumann [2] reported that the issue come from this commit d010fa0 refactor(dracut-install): fork() instead of popen(), sanitise line reading [3]. The issue come from our dracut_wrapper and how DRACUT_LDD is defined. Indeed dracut expect DRACUT_LDD=ldd or a single binary (without arguments) but we are using "prelink-rtld --root='${sysroot}'". With the change introduced by [3], our DRACUT_LDD is used directly by execlp() leading to an error: execlp(ldd, ldd, fullsrcpath, (char *)NULL); Use mktemp to generate a temporary dracut-ldd script using prelink-rtld --root='${sysroot}' ${1} execute dracut.real in a subshell to cleanup the temporary file at the end of the dracut wrapper script. Fixes: https://gitlab.com/buildroot.org/buildroot/-/jobs/6224243423 [tests.fs.test_cpio.TestCpioDracutGlibcMergedUsr] https://gitlab.com/buildroot.org/buildroot/-/jobs/6224243434 [tests.fs.test_cpio.TestCpioDracutMuslMergedUsr] https://gitlab.com/buildroot.org/buildroot/-/jobs/6224243567 [tests.fs.test_cpio.TestCpioDracutUclibcMergedUsr] https://gitlab.com/buildroot.org/buildroot/-/jobs/6224243559 [tests.fs.test_cpio.TestCpioDracutGlibc] https://gitlab.com/buildroot.org/buildroot/-/jobs/6224243504 [tests.fs.test_cpio.TestCpioDracutUclibc] https://gitlab.com/buildroot.org/buildroot/-/jobs/6224243498 [tests.fs.test_cpio.TestCpioDracutMusl] [1] http://lists.busybox.net/pipermail/buildroot/2024-February/684145.html [2] http://lists.busybox.net/pipermail/buildroot/2024-February/684503.html [3] https://github.com/dracutdevs/dracut/commit/d010fa0d7f8ef42ad31729d027d2e4be6dd6e588 Fixes: 145f01ded5 ("package/dracut: bump to version 059") Reported-by: Thierry Bultel <thierry.bultel@linatsea.fr> Signed-off-by: Romain Naour <romain.naour@smile.fr> Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
2024-02-25 23:57:28 +01:00
(exec "${topdir}/bin/dracut.real" "${@}")
if [ -n "${DRACUT_LDD}" ]; then
rm -f "${DRACUT_LDD}"
fi