kumquat-buildroot/package/dracut/merged-usr-module-setup.sh

27 lines
709 B
Bash
Raw Normal View History

package/dracut: workaround breakage on non-merged-usr hosts 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> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
2022-11-12 14:37:07 +01:00
#!/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
}