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