From ae843182b4d639fbebd2a60a2f0054f606f41d3b Mon Sep 17 00:00:00 2001 From: Zoltán Böszörményi Date: Fri, 7 Jun 2024 12:32:09 +0200 Subject: dracut: Switch to dracut-ng and upgrade to version 102 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous dracut 056 was hopelessly outdated. When creating an initramfs from a systemd based system with a recent systemd version, booting failed with this error: [ 1.906055] systemd[1]: Failed to open executor binary '/usr/lib/systemd/systemd-executor' [ 1.912230] systemd[1]: Failed to allocate manager object: No such file or directory [!!!!!!] Failed to allocate manager object [ 1.912480] systemd[1]: Freezing execution dracut-ng took over after development in the original dracut repository stopped. Switched to the new source repository. Dropped two patches upstreamed in dracut-ng. Added a new patch that partially reverts a change that broke creating an initramfs on the host using the cross-compiled sysroot. Signed-off-by: Zoltán Böszörményi Signed-off-by: Khem Raj --- ...uard-against-__GLIBC_PREREQ-for-musl-libc.patch | 35 --------- ...-install-split-ldd-command-arguments-for-.patch | 91 ++++++++++++++++++++++ ...01-install-Do-not-undef-_FILE_OFFSET_BITS.patch | 32 -------- .../recipes-devtools/dracut/dracut_056.bb | 71 ----------------- .../recipes-devtools/dracut/dracut_102.bb | 70 +++++++++++++++++ 5 files changed, 161 insertions(+), 138 deletions(-) delete mode 100644 meta-initramfs/recipes-devtools/dracut/dracut/0001-Guard-against-__GLIBC_PREREQ-for-musl-libc.patch create mode 100644 meta-initramfs/recipes-devtools/dracut/dracut/0001-feat-dracut-install-split-ldd-command-arguments-for-.patch delete mode 100644 meta-initramfs/recipes-devtools/dracut/dracut/0001-install-Do-not-undef-_FILE_OFFSET_BITS.patch delete mode 100644 meta-initramfs/recipes-devtools/dracut/dracut_056.bb create mode 100644 meta-initramfs/recipes-devtools/dracut/dracut_102.bb diff --git a/meta-initramfs/recipes-devtools/dracut/dracut/0001-Guard-against-__GLIBC_PREREQ-for-musl-libc.patch b/meta-initramfs/recipes-devtools/dracut/dracut/0001-Guard-against-__GLIBC_PREREQ-for-musl-libc.patch deleted file mode 100644 index bd768d00d2..0000000000 --- a/meta-initramfs/recipes-devtools/dracut/dracut/0001-Guard-against-__GLIBC_PREREQ-for-musl-libc.patch +++ /dev/null @@ -1,35 +0,0 @@ -From ff5e1a662ba93ba79e2aeaaaec48a2a8ec4b4701 Mon Sep 17 00:00:00 2001 -From: Yi Zhao -Date: Thu, 31 Mar 2022 22:22:44 +0800 -Subject: [PATCH] Guard against __GLIBC_PREREQ for musl libc - -Upstream-Status: Pending - -Signed-off-by: Yi Zhao ---- - src/install/util.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/src/install/util.c b/src/install/util.c -index 5721de89..784aec48 100644 ---- a/src/install/util.c -+++ b/src/install/util.c -@@ -27,6 +27,7 @@ - - #include "util.h" - -+#if defined(__GLIBC__) - #if __GLIBC_PREREQ(2, 30) == 0 - #include - #ifndef SYS_gettid -@@ -35,6 +36,7 @@ - - #define gettid() ((pid_t) syscall(SYS_gettid)) - #endif /*__GLIBC_PREREQ */ -+#endif /*__GLIBC__*/ - - size_t page_size(void) - { --- -2.25.1 - diff --git a/meta-initramfs/recipes-devtools/dracut/dracut/0001-feat-dracut-install-split-ldd-command-arguments-for-.patch b/meta-initramfs/recipes-devtools/dracut/dracut/0001-feat-dracut-install-split-ldd-command-arguments-for-.patch new file mode 100644 index 0000000000..febdbdbddd --- /dev/null +++ b/meta-initramfs/recipes-devtools/dracut/dracut/0001-feat-dracut-install-split-ldd-command-arguments-for-.patch @@ -0,0 +1,91 @@ +From 38dea7dd671fd621b563377cfbd95e4783568c6e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Zolt=C3=A1n=20B=C3=B6sz=C3=B6rm=C3=A9nyi?= + +Date: Fri, 7 Jun 2024 10:32:40 +0200 +Subject: [PATCH] feat(dracut-install): split ldd command arguments for + execvp() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This restores a not-so-subtle feature of previously executing ldd +via popen(), i.e. the ability to use a cross-compiled sysroot. + +The ldd command may be passed in via the DRACUT_LDD environment +variable, and the command may contain command line arguments. +The number of such arguments are not known in advance. + +Split the command into executable and arguments and run it +via execvp(). + +Fixes: d010fa0d7f8ef42ad31729d027d2e4be6dd6e588 +Signed-off-by: Zoltán Böszörményi +Upstream-Status: Submitted [https://github.com/dracut-ng/dracut-ng/pull/339] +--- + src/install/dracut-install.c | 47 +++++++++++++++++++++++++++++++++++- + 1 file changed, 46 insertions(+), 1 deletion(-) + +diff --git a/src/install/dracut-install.c b/src/install/dracut-install.c +index e9708c45..724b27b5 100644 +--- a/src/install/dracut-install.c ++++ b/src/install/dracut-install.c +@@ -559,10 +559,55 @@ static int resolve_deps(const char *src) + log_debug("%s %s", ldd, fullsrcpath); + pid_t ldd_pid; + if ((ldd_pid = fork()) == 0) { ++ char **cmdline = NULL; ++ int start, pos, idx = 0; ++ /* Account for at least 2 elements plus the terminating NULL in cmdline */ ++ int args = 3; ++ ++ /* Estimate the number of space-separated elements in the "ldd" string */ ++ pos = 0; ++ while (isspace(ldd[pos])) ++ pos++; ++ for (; ldd[pos]; pos++) { ++ if (isspace(ldd[pos])) { ++ if (pos) ++ args++; ++ while (isspace(ldd[pos])) ++ pos++; ++ } ++ } ++ ++ cmdline = malloc(args * sizeof(char *)); ++ memset(cmdline, 0, args * sizeof(char *)); ++ ++ pos = 0; ++ while (isspace(ldd[pos])) ++ pos++; ++ start = pos; ++ for (; ldd[pos]; pos++) { ++ while (ldd[pos] && !isspace(ldd[pos])) ++ pos++; ++ ++ cmdline[idx] = malloc(pos - start + 1); ++ memcpy(cmdline[idx], ldd + start, pos - start); ++ cmdline[idx][pos - start] = 0; ++ idx++; ++ ++ if (!ldd[pos]) ++ break; ++ ++ while (isspace(ldd[pos])) ++ pos++; ++ start = pos; ++ } ++ ++ cmdline[idx++] = fullsrcpath; ++ cmdline[idx] = NULL; ++ + dup2(fds[1], 1); + dup2(fds[1], 2); + putenv("LC_ALL=C"); +- execlp(ldd, ldd, fullsrcpath, (char *)NULL); ++ execvp(cmdline[0], cmdline); + _exit(errno == ENOENT ? 127 : 126); + } + close(fds[1]); +-- +2.45.2 + diff --git a/meta-initramfs/recipes-devtools/dracut/dracut/0001-install-Do-not-undef-_FILE_OFFSET_BITS.patch b/meta-initramfs/recipes-devtools/dracut/dracut/0001-install-Do-not-undef-_FILE_OFFSET_BITS.patch deleted file mode 100644 index 170df7119f..0000000000 --- a/meta-initramfs/recipes-devtools/dracut/dracut/0001-install-Do-not-undef-_FILE_OFFSET_BITS.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 7f8ef553b7c433af153d48c6a16b2943780abf67 Mon Sep 17 00:00:00 2001 -From: Khem Raj -Date: Sat, 31 Dec 2022 14:41:52 -0800 -Subject: [PATCH] install: Do not undef _FILE_OFFSET_BITS - -_FILE_OFFSET_BITS is a feature test macro to determine largefile -support. Usually its set to 64 on systems supporting LFS. Its also -needed to be set to 64 for supporting 64bit time_t on glibc on 32bit -systems. If its undefined explicitly, then 64bit time_t can not be -enabled. - -Upstream-Status: Submitted [https://github.com/dracutdevs/dracut/pull/2157] -Signed-off-by: Khem Raj ---- - src/install/dracut-install.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/src/install/dracut-install.c b/src/install/dracut-install.c -index dda0caca..05a67a03 100644 ---- a/src/install/dracut-install.c -+++ b/src/install/dracut-install.c -@@ -22,7 +22,6 @@ - #ifndef _GNU_SOURCE - #define _GNU_SOURCE - #endif --#undef _FILE_OFFSET_BITS - #include - #include - #include --- -2.39.0 - diff --git a/meta-initramfs/recipes-devtools/dracut/dracut_056.bb b/meta-initramfs/recipes-devtools/dracut/dracut_056.bb deleted file mode 100644 index db08fffe9a..0000000000 --- a/meta-initramfs/recipes-devtools/dracut/dracut_056.bb +++ /dev/null @@ -1,71 +0,0 @@ -SUMMARY = "Initramfs generator using udev" -HOMEPAGE = "https://dracut.wiki.kernel.org/index.php/Main_Page" -DESCRIPTION = "Dracut is an event driven initramfs infrastructure. dracut (the tool) is used to create an initramfs image by copying tools and files from an installed system and combining it with the dracut framework, usually found in /usr/lib/dracut/modules.d." - -LICENSE = "GPL-2.0-only" -LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263" - -PE = "1" - -SRCREV = "631d5f72a223288aa1f48bb8e8d0313e75947400" -SRC_URI = "git://git.kernel.org/pub/scm/boot/dracut/dracut.git;protocol=http;branch=master \ - file://0001-util.h-include-sys-reg.h-when-libc-glibc.patch \ - file://0001-Guard-against-__GLIBC_PREREQ-for-musl-libc.patch \ - file://0001-install-Do-not-undef-_FILE_OFFSET_BITS.patch \ - " - -DEPENDS += "kmod" -DEPENDS:append:libc-musl = " fts" - -inherit bash-completion pkgconfig - -S = "${WORKDIR}/git" - -EXTRA_OECONF = "--prefix=${prefix} \ - --libdir=${prefix}/lib \ - --datadir=${datadir} \ - --sysconfdir=${sysconfdir} \ - --sbindir=${sbindir} \ - --disable-documentation \ - --bindir=${bindir} \ - --includedir=${includedir} \ - --localstatedir=${localstatedir} \ - " - -# RDEPEND on systemd optionally -PACKAGECONFIG ??= "${@bb.utils.filter('DISTRO_FEATURES', 'systemd', d)}" -PACKAGECONFIG[systemd] = "--with-systemdsystemunitdir=${systemd_unitdir}/system/,,,systemd" - -EXTRA_OEMAKE += 'libdir=${prefix}/lib LDLIBS="${LDLIBS}"' - -CFLAGS:append = " -fPIC" -LDLIBS:append:libc-musl = " -lfts" - -do_configure() { - ./configure ${EXTRA_OECONF} -} - -do_install() { - oe_runmake install DESTDIR=${D} - # Its Makefile uses cp -arx to install modules.d, so fix the owner - # to root:root - chown -R root:root ${D}/${prefix}/lib/dracut/modules.d -} - -FILES:${PN} += "${prefix}/lib/kernel \ - ${prefix}/lib/dracut \ - ${systemd_unitdir} \ - " -FILES:${PN}-dbg += "${prefix}/lib/dracut/.debug" - -CONFFILES:${PN} += "${sysconfdir}/dracut.conf" - -RDEPENDS:${PN} = "findutils cpio util-linux-blkid util-linux-getopt util-linux bash ldd" - -# This could be optimized a bit, but let's avoid non-booting systems :) -RRECOMMENDS:${PN} = " \ - kernel-modules \ - coreutils \ - " - -CVE_STATUS[CVE-2010-4176] = "not-applicable-platform: Applies only to Fedora" diff --git a/meta-initramfs/recipes-devtools/dracut/dracut_102.bb b/meta-initramfs/recipes-devtools/dracut/dracut_102.bb new file mode 100644 index 0000000000..496380a0fb --- /dev/null +++ b/meta-initramfs/recipes-devtools/dracut/dracut_102.bb @@ -0,0 +1,70 @@ +SUMMARY = "Initramfs generator using udev" +HOMEPAGE = "https://dracut.wiki.kernel.org/index.php/Main_Page" +DESCRIPTION = "Dracut is an event driven initramfs infrastructure. dracut (the tool) is used to create an initramfs image by copying tools and files from an installed system and combining it with the dracut framework, usually found in /usr/lib/dracut/modules.d." + +LICENSE = "GPL-2.0-only" +LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263" + +PE = "1" + +SRCREV = "1a8ee6e00bbe017717a5ef9e9bcfefb3b88f629e" +SRC_URI = "git://github.com/dracut-ng/dracut-ng.git;protocol=http;branch=main \ + file://0001-util.h-include-sys-reg.h-when-libc-glibc.patch \ + file://0001-feat-dracut-install-split-ldd-command-arguments-for-.patch \ + " + +DEPENDS += "kmod" +DEPENDS:append:libc-musl = " fts" + +inherit bash-completion pkgconfig + +S = "${WORKDIR}/git" + +EXTRA_OECONF = "--prefix=${prefix} \ + --libdir=${prefix}/lib \ + --datadir=${datadir} \ + --sysconfdir=${sysconfdir} \ + --sbindir=${sbindir} \ + --disable-documentation \ + --bindir=${bindir} \ + --includedir=${includedir} \ + --localstatedir=${localstatedir} \ + " + +# RDEPEND on systemd optionally +PACKAGECONFIG ??= "${@bb.utils.filter('DISTRO_FEATURES', 'systemd', d)}" +PACKAGECONFIG[systemd] = "--with-systemdsystemunitdir=${systemd_unitdir}/system/,,,systemd" + +EXTRA_OEMAKE += 'libdir=${prefix}/lib LDLIBS="${LDLIBS}"' + +CFLAGS:append = " -fPIC" +LDLIBS:append:libc-musl = " -lfts" + +do_configure() { + ./configure ${EXTRA_OECONF} +} + +do_install() { + oe_runmake install DESTDIR=${D} + # Its Makefile uses cp -arx to install modules.d, so fix the owner + # to root:root + chown -R root:root ${D}/${prefix}/lib/dracut/modules.d +} + +FILES:${PN} += "${prefix}/lib/kernel \ + ${prefix}/lib/dracut \ + ${systemd_unitdir} \ + " +FILES:${PN}-dbg += "${prefix}/lib/dracut/.debug" + +CONFFILES:${PN} += "${sysconfdir}/dracut.conf" + +RDEPENDS:${PN} = "findutils cpio util-linux-blkid util-linux-getopt util-linux bash ldd" + +# This could be optimized a bit, but let's avoid non-booting systems :) +RRECOMMENDS:${PN} = " \ + kernel-modules \ + coreutils \ + " + +CVE_STATUS[CVE-2010-4176] = "not-applicable-platform: Applies only to Fedora" -- cgit v1.2.3-54-g00ecf