From: Dorina Kovacs Date: Thu, 8 Aug 2024 15:00:43 +0000 (+0200) Subject: fix(systemd-initrd): add base as dependency X-Git-Tag: 104~122 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=56c84cdece4bff04ed9db213f49d052d994df04d;p=thirdparty%2Fdracut-ng.git fix(systemd-initrd): add base as dependency For systemd to run properly inside initramfs, /etc/initrd-release is required to exist. [1] /etc/initrd-release is only written in the base module. [1]: https://systemd.io/INITRD_INTERFACE/#using-systemd-inside-an-initrd --- diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index b15625eff..16c0bbe86 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -64,6 +64,7 @@ jobs: "02", "03", "04", + "05", "10", "11", "12", diff --git a/modules.d/01systemd-initrd/module-setup.sh b/modules.d/01systemd-initrd/module-setup.sh index 957e7bea7..603868612 100755 --- a/modules.d/01systemd-initrd/module-setup.sh +++ b/modules.d/01systemd-initrd/module-setup.sh @@ -10,7 +10,7 @@ check() { # called by dracut depends() { - echo systemd-udevd systemd-journald systemd-tmpfiles + echo base systemd-udevd systemd-journald systemd-tmpfiles } installkernel() { diff --git a/test/TEST-05-SYSTEMD-INITRD/Makefile b/test/TEST-05-SYSTEMD-INITRD/Makefile new file mode 100644 index 000000000..2dcab8164 --- /dev/null +++ b/test/TEST-05-SYSTEMD-INITRD/Makefile @@ -0,0 +1 @@ +-include ../Makefile.testdir diff --git a/test/TEST-05-SYSTEMD-INITRD/create-root.sh b/test/TEST-05-SYSTEMD-INITRD/create-root.sh new file mode 100755 index 000000000..5f82ac36b --- /dev/null +++ b/test/TEST-05-SYSTEMD-INITRD/create-root.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +trap 'poweroff -f' EXIT + +# don't let udev and this script step on eachother's toes +for x in 64-lvm.rules 70-mdadm.rules 99-mount-rules; do + : > "/etc/udev/rules.d/$x" +done +rm -f -- /etc/lvm/lvm.conf +udevadm control --reload +set -e + +udevadm settle +mkfs.ext4 -q -L dracut /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_root +mkdir -p /root +mount -t ext4 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_root /root +cp -a -t /root /source/* +mkdir -p /root/run +umount /root +echo "dracut-root-block-created" | dd oflag=direct,dsync of=/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_marker status=none +poweroff -f diff --git a/test/TEST-05-SYSTEMD-INITRD/test.sh b/test/TEST-05-SYSTEMD-INITRD/test.sh new file mode 100755 index 000000000..43eee0d94 --- /dev/null +++ b/test/TEST-05-SYSTEMD-INITRD/test.sh @@ -0,0 +1,85 @@ +#!/bin/bash +# shellcheck disable=SC2034 +TEST_DESCRIPTION="root filesystem on a ext4 filesystem" + +test_check() { + command -v systemctl &> /dev/null +} + +# Uncomment this to debug failures +#DEBUGFAIL="rd.shell=1 rd.break=pre-mount" +test_run() { + declare -a disk_args=() + declare -i disk_index=0 + qemu_add_drive disk_index disk_args "$TESTDIR"/marker.img marker + qemu_add_drive disk_index disk_args "$TESTDIR"/root.img root + + test_marker_reset + "$testdir"/run-qemu \ + "${disk_args[@]}" \ + -append "$TEST_KERNEL_CMDLINE root=LABEL=dracut rw systemd.log_target=console rd.retry=3 init=/sbin/init" \ + -initrd "$TESTDIR"/initramfs.testing || return 1 + + test_marker_check || return 1 +} + +test_setup() { + # Create what will eventually be our root filesystem onto an overlay + "$DRACUT" -N -l --keep --tmpdir "$TESTDIR" \ + -m "test-root" \ + -f "$TESTDIR"/initramfs.root "$KVERSION" || return 1 + mkdir -p "$TESTDIR"/overlay/source && mv "$TESTDIR"/dracut.*/initramfs/* "$TESTDIR"/overlay/source && rm -rf "$TESTDIR"/dracut.* + + # second, install the files needed to make the root filesystem + # create an initramfs that will create the target root filesystem. + # We do it this way so that we do not risk trashing the host mdraid + # devices, volume groups, encrypted partitions, etc. + "$DRACUT" -N -l -i "$TESTDIR"/overlay / \ + -m "test-makeroot" \ + -i ./create-root.sh /lib/dracut/hooks/initqueue/01-create-root.sh \ + --nomdadmconf \ + --no-hostonly-cmdline -N \ + -f "$TESTDIR"/initramfs.makeroot "$KVERSION" || return 1 + rm -rf -- "$TESTDIR"/overlay + + declare -a disk_args=() + declare -i disk_index=0 + qemu_add_drive disk_index disk_args "$TESTDIR"/marker.img marker 1 + qemu_add_drive disk_index disk_args "$TESTDIR"/root.img root 80 + + # Invoke KVM and/or QEMU to actually create the target filesystem. + "$testdir"/run-qemu \ + "${disk_args[@]}" \ + -append "root=/dev/fakeroot rw rootfstype=ext4 quiet console=ttyS0,115200n81" \ + -initrd "$TESTDIR"/initramfs.makeroot || return 1 + test_marker_check dracut-root-block-created || return 1 + rm -- "$TESTDIR"/marker.img + + # directory for test configurations + mkdir -p /tmp/dracut.conf.d + + # grab the distro configuration from the host and make it available for the tests + if [ -d /usr/lib/dracut/dracut.conf.d ]; then + cp -a /usr/lib/dracut/dracut.conf.d /tmp/ + fi + + # pick up configuration from /tmp/dracut.conf.d when running the tests + TEST_DRACUT_ARGS+=" --local --confdir /tmp/dracut.conf.d --no-early-microcode --force --kver $KVERSION" + + # include $TESTDIR"/overlay if exists + if [ -d "$TESTDIR"/overlay ]; then + TEST_DRACUT_ARGS+=" --include $TESTDIR/overlay /" + fi + + # shellcheck disable=SC2162 + IFS=' ' read -a TEST_DRACUT_ARGS_ARRAY <<< "$TEST_DRACUT_ARGS" + + "$DRACUT" \ + --kernel-cmdline "rd.retry=10 rd.info rd.shell=0" \ + "${TEST_DRACUT_ARGS_ARRAY[@]}" \ + -m "kernel-modules systemd-initrd qemu test-root" \ + "$TESTDIR"/initramfs.testing +} + +# shellcheck disable=SC1090 +. "$testdir"/test-functions