diff mbox series

package/dracut: workaround breakage on non-merged-usr hosts

Message ID 20221112133707.1674986-1-yann.morin.1998@free.fr
State Accepted
Headers show
Series package/dracut: workaround breakage on non-merged-usr hosts | expand

Commit Message

Yann E. MORIN Nov. 12, 2022, 1:37 p.m. UTC
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

Comments

Thomas Petazzoni Nov. 13, 2022, 9:11 p.m. UTC | #1
On Sat, 12 Nov 2022 14:37:07 +0100
"Yann E. MORIN" <yann.morin.1998@free.fr> wrote:

> 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

Applied to master, thanks.

Thomas
diff mbox series

Patch

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
+}