All of lore.kernel.org
 help / color / mirror / Atom feed
* [Buildroot] [PATCH] package/dracut: workaround breakage on non-merged-usr hosts
@ 2022-11-12 13:37 Yann E. MORIN
  2022-11-13 21:11 ` Thomas Petazzoni via buildroot
  0 siblings, 1 reply; 2+ messages in thread
From: Yann E. MORIN @ 2022-11-12 13:37 UTC (permalink / raw)
  To: buildroot; +Cc: Adam Duskett, Yann E. MORIN, Thierry Bultel

dracut is not really ready to be installed with a non-/ prefix, and it
has a lot of hard-coded assumptions that it is going to run on the host
for which it is goign to generate an initramfs; for example, it
hard-codes calls to /lib/dracut/some-file in some of its modules. It
also uses the host system layout to decide whether it needs a
merged-usr or not.

Furthermore, dracut populates the temporary directory which content will
be used to generate the cpio, with a bunch of files, even before calling
any of the dracut modules.

The name for that temporary directory is not predictable (looks like the
output of 'mktemp -d dracut.XXXXXX', with names like dracut.1Vfn9F seen
while debugging).

As a consequence, we can't prepare the temporary directory with the
proper symlinks beforehand.

So, we provide a very-early module of our own, that will (hopefully) run
before any other module, to fixup the messed-up layout prepared by
dracut. This module moves the content of /lib, /bin, and /sbin, out and
into their counterparts in /usr, and creates the usual symlinks.

When we do not require a merged-usr, then we have nothing to do, so the
module checks for /lib being a symlink, as the hint that we want a
merged-usr or not.

Note: currently, we've seen nothing that dracut installed in /bin or
/sbin, but for trying to be future-proof, we also handle them; this
causes a spurious warning:
    mv: cannot stat '..../build/buildroot-fs/cpio/tmp/dracut.YQnzNP/initramfs/bin/*': No such file or directory

Since there are already quite a bunch of similar failures in the
official modules bundled in dracut, an extra such issue or two should
not be too scary...

Fixes:
    https://gitlab.com/buildroot.org/buildroot/-/jobs/3282261241
    https://gitlab.com/buildroot.org/buildroot/-/jobs/3282261239
    https://gitlab.com/buildroot.org/buildroot/-/jobs/3282261236

Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
Cc: Thierry Bultel <thierry.bultel@linatsea.fr>
Cc: Adam Duskett <aduskett@gmail.com>
---
 package/dracut/dracut.mk                  |  2 ++
 package/dracut/merged-usr-module-setup.sh | 26 +++++++++++++++++++++++
 2 files changed, 28 insertions(+)
 create mode 100644 package/dracut/merged-usr-module-setup.sh

diff --git a/package/dracut/dracut.mk b/package/dracut/dracut.mk
index 742a073a36..597492bc5e 100644
--- a/package/dracut/dracut.mk
+++ b/package/dracut/dracut.mk
@@ -22,6 +22,8 @@ HOST_DRACUT_POST_INSTALL_HOOKS += HOST_DRACUT_POST_INSTALL_WRAPPER_SCRIPT
 # "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/merged-usr-module-setup.sh \
+		$(HOST_DIR)/lib/dracut/modules.d/0000-merged-usr/module-setup.sh
 	$(INSTALL) -D -m 0755 package/dracut/libc-links-module-setup.sh \
 		$(HOST_DIR)/lib/dracut/modules.d/05libc-links/module-setup.sh
 endef
diff --git a/package/dracut/merged-usr-module-setup.sh b/package/dracut/merged-usr-module-setup.sh
new file mode 100644
index 0000000000..6dc0e7ca7b
--- /dev/null
+++ b/package/dracut/merged-usr-module-setup.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+check() {
+    [ -L "${dracutsysrootdir?}/lib" ]
+}
+
+depends() {
+    return 0
+}
+
+install() {
+    # dracut pre-installs a set of files before calling any of
+    # the modules, and dracut also messes up host vs. target
+    # system, so on a non-merged-usr host, it will prepare a
+    # non-merged-usr initramfs, even though the current config
+    # is for a merged-usr system.
+    # So undo its borkage.
+    for dir in lib bin sbin; do
+        mkdir -p "${initdir?}/usr/${dir}"
+        if [ -d "${initdir?}/${dir}" ]; then
+            mv "${initdir?}/${dir}/"* "${initdir?}/usr/${dir}"
+            rm -rf "${initdir?}/${dir}"
+            ln -s "usr/${dir}" "${initdir?}/${dir}"
+        fi
+    done
+}
-- 
2.25.1

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-11-13 21:11 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-11-12 13:37 [Buildroot] [PATCH] package/dracut: workaround breakage on non-merged-usr hosts Yann E. MORIN
2022-11-13 21:11 ` Thomas Petazzoni via buildroot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.