dracut: Switch to dracut-ng and upgrade to version 102

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 <zboszor@gmail.com>
Signed-off-by: Khem Raj <raj.khem@gmail.com>
This commit is contained in:
Zoltán Böszörményi 2024-06-07 12:32:09 +02:00 committed by Khem Raj
parent da13475f00
commit ae843182b4
No known key found for this signature in database
GPG Key ID: BB053355919D3314
4 changed files with 94 additions and 71 deletions

View File

@ -1,35 +0,0 @@
From ff5e1a662ba93ba79e2aeaaaec48a2a8ec4b4701 Mon Sep 17 00:00:00 2001
From: Yi Zhao <yi.zhao@windriver.com>
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 <yi.zhao@windriver.com>
---
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 <sys/syscall.h>
#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

View File

@ -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?=
<zboszor@gmail.com>
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 <zboszor@gmail.com>
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

View File

@ -1,32 +0,0 @@
From 7f8ef553b7c433af153d48c6a16b2943780abf67 Mon Sep 17 00:00:00 2001
From: Khem Raj <raj.khem@gmail.com>
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 <raj.khem@gmail.com>
---
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 <ctype.h>
#include <errno.h>
#include <fcntl.h>
--
2.39.0

View File

@ -7,11 +7,10 @@ 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 \
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-Guard-against-__GLIBC_PREREQ-for-musl-libc.patch \
file://0001-install-Do-not-undef-_FILE_OFFSET_BITS.patch \
file://0001-feat-dracut-install-split-ldd-command-arguments-for-.patch \
"
DEPENDS += "kmod"