From: Jo Zzsi Date: Thu, 14 Nov 2024 22:48:19 +0000 (-0500) Subject: test(STORAGE): add subtest for encrypted root on LVM X-Git-Tag: 106~175 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a3dc02b928da73e478aeb7ff0ec0ef20b8960898;p=thirdparty%2Fdracut-ng.git test(STORAGE): add subtest for encrypted root on LVM Now TEST 21 is a subtest of this test and can be removed. --- diff --git a/.github/workflows/integration-extra.yml b/.github/workflows/integration-extra.yml index 7082a1f21..a29350f28 100644 --- a/.github/workflows/integration-extra.yml +++ b/.github/workflows/integration-extra.yml @@ -44,7 +44,6 @@ jobs: - "11" - "12" - "20" - - "21" - "22" - "23" - "25" diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 708779421..60ea2b38a 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -84,7 +84,6 @@ jobs: - "11" - "12" - "20" - - "21" - "22" - "23" - "25" diff --git a/test/TEST-20-RAID/Makefile b/test/TEST-20-STORAGE/Makefile similarity index 100% rename from test/TEST-20-RAID/Makefile rename to test/TEST-20-STORAGE/Makefile diff --git a/test/TEST-20-RAID/create-root.sh b/test/TEST-20-STORAGE/create-root.sh similarity index 64% rename from test/TEST-20-RAID/create-root.sh rename to test/TEST-20-STORAGE/create-root.sh index 68249a33c..f7e91bbf6 100755 --- a/test/TEST-20-RAID/create-root.sh +++ b/test/TEST-20-STORAGE/create-root.sh @@ -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 diff --git a/test/TEST-20-RAID/cryptroot-ask.sh b/test/TEST-20-STORAGE/cryptroot-ask.sh similarity index 100% rename from test/TEST-20-RAID/cryptroot-ask.sh rename to test/TEST-20-STORAGE/cryptroot-ask.sh diff --git a/test/TEST-20-RAID/test.sh b/test/TEST-20-STORAGE/test.sh similarity index 55% rename from test/TEST-20-RAID/test.sh rename to test/TEST-20-STORAGE/test.sh index f960f66b1..337c427af 100755 --- a/test/TEST-20-RAID/test.sh +++ b/test/TEST-20-STORAGE/test.sh @@ -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 index 2dcab8164..000000000 --- a/test/TEST-21-LVM/Makefile +++ /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 index ed0ed0501..000000000 --- a/test/TEST-21-LVM/create-root.sh +++ /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 index e88ba78af..000000000 --- a/test/TEST-21-LVM/test.sh +++ /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