]> git.ipfire.org Git - thirdparty/dracut-ng.git/commitdiff
test(STORAGE): add subtest for encrypted root on LVM
authorJo Zzsi <jozzsicsataban@gmail.com>
Thu, 14 Nov 2024 22:48:19 +0000 (17:48 -0500)
committerLaszlo <laszlo.gombos@gmail.com>
Sat, 16 Nov 2024 14:15:31 +0000 (09:15 -0500)
Now TEST 21 is a subtest of this test and can be removed.

.github/workflows/integration-extra.yml
.github/workflows/integration.yml
test/TEST-20-STORAGE/Makefile [moved from test/TEST-20-RAID/Makefile with 100% similarity]
test/TEST-20-STORAGE/create-root.sh [moved from test/TEST-20-RAID/create-root.sh with 64% similarity]
test/TEST-20-STORAGE/cryptroot-ask.sh [moved from test/TEST-20-RAID/cryptroot-ask.sh with 100% similarity]
test/TEST-20-STORAGE/test.sh [moved from test/TEST-20-RAID/test.sh with 55% similarity]
test/TEST-21-LVM/Makefile [deleted file]
test/TEST-21-LVM/create-root.sh [deleted file]
test/TEST-21-LVM/test.sh [deleted file]

index 7082a1f21118095f9b3f0fde2328ec62160f0f10..a29350f284419cbf8089781bfa984decd9f632f0 100644 (file)
@@ -44,7 +44,6 @@ jobs:
                     - "11"
                     - "12"
                     - "20"
-                    - "21"
                     - "22"
                     - "23"
                     - "25"
index 7087794211cffe6d06e792dd31e84490111e67f1..60ea2b38a06fea08eaf20b650263a41050ea33bb 100644 (file)
@@ -84,7 +84,6 @@ jobs:
                     - "11"
                     - "12"
                     - "20"
-                    - "21"
                     - "22"
                     - "23"
                     - "25"
similarity index 64%
rename from test/TEST-20-RAID/create-root.sh
rename to test/TEST-20-STORAGE/create-root.sh
index 68249a33c1c9fddd517c290cc5784b4038dec2cc..f7e91bbf6d8cf59a54f782a180fbca51547b6713 100755 (executable)
@@ -7,18 +7,22 @@ set -e
 . /env
 
 if [ "$TEST_FSTYPE" = "zfs" ]; then
-    zpool create dracut /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_raid[12]
+    zpool create dracut /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_disk[12]
     zfs create dracut/root
 elif [ "$TEST_FSTYPE" = "btrfs" ]; then
-    mkfs.btrfs -q -draid0 -mraid0 -L root /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_raid[12]
+    mkfs.btrfs -q -draid0 -mraid0 -L root /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_disk[12]
     udevadm settle
     btrfs device scan
 else
-    mdadm --create /dev/md0 --run --auto=yes --level=0 --raid-devices=2 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_raid[12]
-    # wait for the array to finish initializing, otherwise this sometimes fails randomly.
-    mdadm -W /dev/md0 || :
+    # storage layers (if available)
+    # mdadm (optional) --> crypt (optional) --> lvm --> TEST_FSTYPE (e.g. ext4)
+    if ! grep -qF 'rd.md=0' /proc/cmdline && command -v mdadm > /dev/null; then
+        mdadm --create /dev/md0 --run --auto=yes --level=0 --raid-devices=2 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_disk[12]
+        # wait for the array to finish initializing, otherwise this sometimes fails randomly.
+        mdadm -W /dev/md0 || :
+    fi
 
-    if command -v cryptsetup > /dev/null; then
+    if ! grep -qF 'rd.luks=0' /proc/cmdline && command -v cryptsetup > /dev/null; then
         printf test > keyfile
         cryptsetup -q luksFormat /dev/md0 /keyfile
         echo "The passphrase is test"
@@ -26,8 +30,15 @@ else
         lvm pvcreate -ff -y /dev/mapper/dracut_crypt_test
         lvm vgcreate dracut /dev/mapper/dracut_crypt_test
     else
-        lvm pvcreate -ff -y /dev/md0
-        lvm vgcreate dracut /dev/md0
+        if [ -e /dev/md0 ]; then
+            lvm pvcreate -ff -y /dev/md0
+            lvm vgcreate dracut /dev/md0
+        else
+            for dev in /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_disk[12]; do
+                lvm pvcreate -ff -y "$dev"
+            done
+            lvm vgcreate dracut /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_disk[12]
+        fi
     fi
 
     lvm lvcreate --yes -l 100%FREE -n root dracut
@@ -43,7 +54,7 @@ if [ "$TEST_FSTYPE" = "zfs" ]; then
     zfs set mountpoint=/sysroot dracut/root
     zfs get mounted dracut/root
 elif [ "$TEST_FSTYPE" = "btrfs" ]; then
-    mount -t "$TEST_FSTYPE" /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_raid1 /sysroot
+    mount -t "$TEST_FSTYPE" /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_disk1 /sysroot
 else
     mount -t "$TEST_FSTYPE" /dev/dracut/root /sysroot
 fi
similarity index 55%
rename from test/TEST-20-RAID/test.sh
rename to test/TEST-20-STORAGE/test.sh
index f960f66b11476905b1f5355b8877afe61d0d76db..337c427af7656c5409ae7f1cc097e8338475b628 100755 (executable)
@@ -3,35 +3,88 @@
 [ -z "$TEST_FSTYPE" ] && TEST_FSTYPE="ext4"
 
 # shellcheck disable=SC2034
-TEST_DESCRIPTION="root filesystem on multiple device $TEST_FSTYPE"
+TEST_DESCRIPTION="root filesystem on multiple device $TEST_FSTYPE (on top of RAID and LUKS)"
 
 test_check() {
-    (command -v zfs || (command -v mdadm && command -v "mkfs.$TEST_FSTYPE")) &> /dev/null
+    (command -v zfs || (command -v lvm && command -v "mkfs.$TEST_FSTYPE")) &> /dev/null
 }
 
+if [ "$TEST_FSTYPE" = "zfs" ]; then
+    TEST_KERNEL_CMDLINE+=" root=ZFS=dracut/root "
+elif [ "$TEST_FSTYPE" = "btrfs" ]; then
+    TEST_KERNEL_CMDLINE+=" root=LABEL=root "
+else
+    TEST_KERNEL_CMDLINE+=" root=/dev/dracut/root rd.auto=1"
+    command -v mdadm > /dev/null && export HAVE_RAID=1
+    command -v cryptsetup > /dev/null && export HAVE_CRYPT=1
+fi
+
 # Uncomment this to debug failures
 #DEBUGFAIL="rd.shell"
-test_run() {
+client_run() {
+    local test_name="$1"
+    shift
+    local disk="$1"
+    shift
+    local client_opts="$*"
+
+    echo "CLIENT TEST START: $test_name"
+
     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"/raid-1.img raid1
-    qemu_add_drive disk_index disk_args "$TESTDIR"/raid-2.img raid2
-
-    if [ "$TEST_FSTYPE" = "zfs" ]; then
-        TEST_KERNEL_CMDLINE+=" root=ZFS=dracut/root "
-    elif [ "$TEST_FSTYPE" = "btrfs" ]; then
-        TEST_KERNEL_CMDLINE+=" root=LABEL=root "
-    else
-        TEST_KERNEL_CMDLINE+=" root=/dev/dracut/root rd.auto"
-    fi
+    qemu_add_drive disk_index disk_args "$TESTDIR/${disk}-1.img" disk1
+    qemu_add_drive disk_index disk_args "$TESTDIR/${disk}-2.img" disk2
 
     test_marker_reset
     "$testdir"/run-qemu \
         "${disk_args[@]}" \
-        -append "$TEST_KERNEL_CMDLINE ro" \
+        -append "$TEST_KERNEL_CMDLINE ro $client_opts " \
         -initrd "$TESTDIR"/initramfs.testing || return 1
     test_marker_check || return 1
+
+    echo "CLIENT TEST END: $test_name [OK]"
+}
+
+test_run() {
+    # ignore crypttab with rd.luks.crypttab=0 and RAID with rd.md=0
+    client_run "$TEST_FSTYPE" "disk" "rd.luks.crypttab=0 rd.md=0" || return 1
+
+    # ignore crypttab with rd.luks.crypttab=0
+    if [ -n "$HAVE_RAID" ]; then
+        client_run "raid" "raid" "rd.luks.crypttab=0" || return 1
+    fi
+
+    # for encrypted test run - use raid-crypt.img drives instead of raid.img drives
+    if [ -n "$HAVE_CRYPT" ]; then
+        client_run "raid-crypt" "raid-crypt" " " || return 1
+    fi
+}
+
+test_makeroot() {
+    local test_name="$1"
+    shift
+    local disk="$1"
+    shift
+    local client_opts="$*"
+
+    echo "MAKEROOT START: $test_name"
+
+    # Create the blank files to use as a root filesystem
+    declare -a disk_args=()
+    # shellcheck disable=SC2034
+    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/${disk}-1.img" disk1 1
+    qemu_add_drive disk_index disk_args "$TESTDIR/${disk}-2.img" disk2 1
+
+    "$testdir"/run-qemu \
+        "${disk_args[@]}" \
+        -append "root=/dev/fakeroot quiet console=ttyS0,115200n81 $client_opts " \
+        -initrd "$TESTDIR"/initramfs.makeroot || return 1
+    test_marker_check dracut-root-block-created || return 1
+
+    echo "MAKEROOT END: $test_name [OK]"
 }
 
 test_setup() {
@@ -52,29 +105,24 @@ test_setup() {
     # shellcheck disable=SC2046
     "$DRACUT" -N -i "$TESTDIR"/overlay / \
         --add-confdir test-makeroot \
-        -a "lvm mdraid" \
+        -a "lvm" \
         -I "grep" \
+        $(if command -v mdadm > /dev/null; then echo "-a mdraid"; fi) \
         $(if command -v cryptsetup > /dev/null; then echo "-a crypt -I cryptsetup"; fi) \
         $(if [ "$TEST_FSTYPE" = "zfs" ]; then echo "-a zfs"; else echo "-I mkfs.${TEST_FSTYPE}"; fi) \
         -i ./create-root.sh /lib/dracut/hooks/initqueue/01-create-root.sh \
         -f "$TESTDIR"/initramfs.makeroot "$KVERSION" || return 1
 
-    # Create the blank files to use as a root filesystem
-    declare -a disk_args=()
-    # shellcheck disable=SC2034
-    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"/raid-1.img raid1 1
-    qemu_add_drive disk_index disk_args "$TESTDIR"/raid-2.img raid2 1
+    test_makeroot "$TEST_FSTYPE" "disk" "rd.md=0 rd.luks=0" || return 1
 
-    "$testdir"/run-qemu \
-        "${disk_args[@]}" \
-        -append "root=/dev/fakeroot quiet console=ttyS0,115200n81" \
-        -initrd "$TESTDIR"/initramfs.makeroot || return 1
+    if [ -n "$HAVE_RAID" ]; then
+        test_makeroot "raid" "raid" "rd.luks=0" || return 1
+    fi
 
-    test_marker_check dracut-root-block-created || return 1
+    # for encrypted test run - use raid-crypt.img drives instead of raid.img drives
+    if [ -n "$HAVE_CRYPT" ]; then
+        test_makeroot "raid-crypt" "raid-crypt" " " || return 1
 
-    if command -v cryptsetup > /dev/null; then
         eval "$(grep -F -a -m 1 ID_FS_UUID "$TESTDIR"/marker.img)"
         echo "testluks UUID=$ID_FS_UUID /etc/key" > /tmp/crypttab
         echo -n "test" > /tmp/key
@@ -82,7 +130,8 @@ test_setup() {
 
     # shellcheck disable=SC2046
     test_dracut \
-        -a "lvm mdraid" \
+        -a "lvm" \
+        $(if command -v mdadm > /dev/null; then echo "-a mdraid"; fi) \
         $(if command -v cryptsetup > /dev/null; then echo "-a crypt"; fi) \
         $(if [ "$TEST_FSTYPE" = "zfs" ]; then echo "-a zfs"; fi) \
         -i "./cryptroot-ask.sh" "/sbin/cryptroot-ask" \
diff --git a/test/TEST-21-LVM/Makefile b/test/TEST-21-LVM/Makefile
deleted file mode 100644 (file)
index 2dcab81..0000000
+++ /dev/null
@@ -1 +0,0 @@
--include ../Makefile.testdir
diff --git a/test/TEST-21-LVM/create-root.sh b/test/TEST-21-LVM/create-root.sh
deleted file mode 100755 (executable)
index ed0ed05..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/sh
-
-trap 'poweroff -f' EXIT
-set -ex
-for dev in /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_disk[123]; do
-    lvm pvcreate -ff -y "$dev"
-done
-
-lvm vgcreate dracut /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_disk[123]
-lvm lvcreate --yes -l 100%FREE -n root dracut
-lvm vgchange -ay
-mkfs.ext4 -q /dev/dracut/root
-mkdir -p /sysroot
-mount -t ext4 /dev/dracut/root /sysroot
-cp -a -t /sysroot /source/*
-umount /sysroot
-lvm lvchange -a n /dev/dracut/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-21-LVM/test.sh b/test/TEST-21-LVM/test.sh
deleted file mode 100755 (executable)
index e88ba78..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-#!/usr/bin/env bash
-
-# shellcheck disable=SC2034
-TEST_DESCRIPTION="root filesystem on LVM PV"
-
-# Uncomment this to debug failures
-#DEBUGFAIL="rd.break rd.shell"
-
-test_check() {
-    if ! type -p lvm &> /dev/null; then
-        echo "Test needs lvm for lvm module... Skipping"
-        return 1
-    fi
-
-    if ! type -p mdadm &> /dev/null; then
-        echo "Test needs mdadm for mdraid module ... Skipping"
-        return 1
-    fi
-}
-
-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"/disk-1.img disk1
-    qemu_add_drive disk_index disk_args "$TESTDIR"/disk-2.img disk2
-    qemu_add_drive disk_index disk_args "$TESTDIR"/disk-3.img disk3
-
-    test_marker_reset
-    "$testdir"/run-qemu \
-        "${disk_args[@]}" \
-        -append "$TEST_KERNEL_CMDLINE root=/dev/dracut/root rd.auto=1" \
-        -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 --keep --tmpdir "$TESTDIR" \
-        --add-confdir 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 -i "$TESTDIR"/overlay / \
-        --add-confdir test-makeroot \
-        -a "bash lvm mdraid" \
-        -i ./create-root.sh /lib/dracut/hooks/initqueue/01-create-root.sh \
-        -f "$TESTDIR"/initramfs.makeroot "$KVERSION" || return 1
-
-    # Create the blank files to use as a root filesystem
-    declare -a disk_args=()
-    # shellcheck disable=SC2034
-    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"/disk-1.img disk1 1
-    qemu_add_drive disk_index disk_args "$TESTDIR"/disk-2.img disk2 1
-    qemu_add_drive disk_index disk_args "$TESTDIR"/disk-3.img disk3 1
-
-    "$testdir"/run-qemu \
-        "${disk_args[@]}" \
-        -append "root=/dev/fakeroot quiet console=ttyS0,115200n81" \
-        -initrd "$TESTDIR"/initramfs.makeroot || return 1
-    test_marker_check dracut-root-block-created || return 1
-
-    test_dracut \
-        -a "lvm" \
-        "$TESTDIR"/initramfs.testing
-}
-
-# shellcheck disable=SC1090
-. "$testdir"/test-functions