From d67e86ed67bd0708379721cd5096d84509de7488 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 21 May 2024 02:54:06 +0900 Subject: [PATCH 1/5] test: stop container when it is not necessary anymore --- test/units/TEST-74-AUX-UTILS.coredump.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/units/TEST-74-AUX-UTILS.coredump.sh b/test/units/TEST-74-AUX-UTILS.coredump.sh index 3f3571639e3..b9c8fde2a33 100755 --- a/test/units/TEST-74-AUX-UTILS.coredump.sh +++ b/test/units/TEST-74-AUX-UTILS.coredump.sh @@ -105,7 +105,9 @@ EOF # Wait a bit for the coredumps to get processed timeout 30 bash -c "while [[ \$(systemd-run -M $CONTAINER -q --wait --pipe coredumpctl list -q --no-legend /usr/bin/sleep | wc -l) -lt 2 ]]; do sleep 1; done" + machinectl stop "$CONTAINER" rm -rf "/var/lib/machines/$CONTAINER" + unset CONTAINER fi coredumpctl From ee213b54ae8141f076c8e43d9c79d604fa679060 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 21 May 2024 07:20:57 +0900 Subject: [PATCH 2/5] test: also run some basic test cases on nspawn --- test/units/TEST-74-AUX-UTILS.mount.sh | 46 +++++++++++++-------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/test/units/TEST-74-AUX-UTILS.mount.sh b/test/units/TEST-74-AUX-UTILS.mount.sh index 933191e5adc..a3b44ee91bc 100755 --- a/test/units/TEST-74-AUX-UTILS.mount.sh +++ b/test/units/TEST-74-AUX-UTILS.mount.sh @@ -6,13 +6,6 @@ set -o pipefail # shellcheck source=test/units/util.sh . "$(dirname "$0")"/util.sh -# We're going to play around with block/loop devices, so bail out early -# if we're running in nspawn -if systemd-detect-virt --container >/dev/null; then - echo "Container detected, skipping the test" - exit 0 -fi - at_exit() { set +e @@ -23,6 +16,7 @@ at_exit() { trap at_exit EXIT WORK_DIR="$(mktemp -d)" +mkdir -p "$WORK_DIR/mnt" systemd-mount --list systemd-mount --list --full @@ -30,6 +24,28 @@ systemd-mount --list --no-legend systemd-mount --list --no-pager systemd-mount --list --quiet +# tmpfs +mkdir -p "$WORK_DIR/mnt/foo/bar" +systemd-mount --tmpfs "$WORK_DIR/mnt/foo" +test ! -d "$WORK_DIR/mnt/foo/bar" +touch "$WORK_DIR/mnt/foo/baz" +systemd-umount "$WORK_DIR/mnt/foo" +test -d "$WORK_DIR/mnt/foo/bar" +test ! -e "$WORK_DIR/mnt/foo/baz" + +# overlay +systemd-mount --type=overlay --options="lowerdir=/etc,upperdir=$WORK_DIR/upper,workdir=$WORK_DIR/work" /etc "$WORK_DIR/overlay" +touch "$WORK_DIR/overlay/foo" +test -e "$WORK_DIR/upper/foo" +systemd-umount "$WORK_DIR/overlay" + +# We're going to play around with block/loop devices, so bail out early +# if we're running in nspawn +if systemd-detect-virt --container >/dev/null; then + echo "Container detected, skipping the test" + exit 0 +fi + # Set up a simple block device for further tests dd if=/dev/zero of="$WORK_DIR/simple.img" bs=1M count=16 mkfs.ext4 -L sd-mount-test "$WORK_DIR/simple.img" @@ -38,7 +54,6 @@ udevadm wait --timeout 60 --settle "$LOOP" # Also wait for the .device unit for the loop device is active. Otherwise, the .device unit activation # that is triggered by the .mount unit introduced by systemd-mount below may time out. timeout 60 bash -c "until systemctl is-active $LOOP; do sleep 1; done" -mkdir "$WORK_DIR/mnt" mount "$LOOP" "$WORK_DIR/mnt" touch "$WORK_DIR/mnt/foo.bar" umount "$LOOP" @@ -148,18 +163,3 @@ systemctl status "$WORK_DIR/mnt" touch "$WORK_DIR/mnt/hello" [[ "$(stat -c "%U:%G" "$WORK_DIR/mnt/hello")" == "testuser:testuser" ]] systemd-umount LABEL=owner-vfat - -# tmpfs -mkdir -p "$WORK_DIR/mnt/foo/bar" -systemd-mount --tmpfs "$WORK_DIR/mnt/foo" -test ! -d "$WORK_DIR/mnt/foo/bar" -touch "$WORK_DIR/mnt/foo/baz" -systemd-umount "$WORK_DIR/mnt/foo" -test -d "$WORK_DIR/mnt/foo/bar" -test ! -e "$WORK_DIR/mnt/foo/baz" - -# overlay -systemd-mount --type=overlay --options="lowerdir=/etc,upperdir=$WORK_DIR/upper,workdir=$WORK_DIR/work" /etc "$WORK_DIR/overlay" -touch "$WORK_DIR/overlay/foo" -test -e "$WORK_DIR/upper/foo" -systemd-umount "$WORK_DIR/overlay" From 4a8ca3c6d595598f64cf532fad2c98ef7481f6a4 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 21 May 2024 04:48:42 +0900 Subject: [PATCH 3/5] test: wait for unit generated from /proc/self/mountinfo to be unloaded Fixes https://github.com/systemd/systemd/issues/32680#issuecomment-2120974685. === May 21 02:45:08 TEST-74-AUX-UTILS.sh[2475]: + mountpoint /tmp/tmp.eaRV7lSbX2/mnt May 21 02:45:08 TEST-74-AUX-UTILS.sh[2476]: /tmp/tmp.eaRV7lSbX2/mnt is not a mountpoint May 21 02:45:08 TEST-74-AUX-UTILS.sh[2449]: + systemd-mount /dev/loop0 /tmp/tmp.eaRV7lSbX2/mnt May 21 02:45:08 systemd-mount[2477]: Failed to start transient mount unit: Unit tmp-tmp.eaRV7lSbX2-mnt.mount was already loaded or has a fragment file. === --- test/units/TEST-74-AUX-UTILS.mount.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/units/TEST-74-AUX-UTILS.mount.sh b/test/units/TEST-74-AUX-UTILS.mount.sh index a3b44ee91bc..5bba5a3ac50 100755 --- a/test/units/TEST-74-AUX-UTILS.mount.sh +++ b/test/units/TEST-74-AUX-UTILS.mount.sh @@ -58,6 +58,9 @@ mount "$LOOP" "$WORK_DIR/mnt" touch "$WORK_DIR/mnt/foo.bar" umount "$LOOP" (! mountpoint "$WORK_DIR/mnt") +# Wait for the mount unit to be unloaded. Otherwise, creation of the transient unit below may fail. +MOUNT_UNIT=$(systemd-escape --path --suffix=mount "$WORK_DIR/mnt") +timeout 60 bash -c "while [[ -n \$(systemctl list-units --all --no-legend $MOUNT_UNIT) ]]; do sleep 1; done" # Mount with both source and destination set systemd-mount "$LOOP" "$WORK_DIR/mnt" From e504f5a33979c896213f2fb53217b14263cfe036 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 21 May 2024 19:10:49 +0900 Subject: [PATCH 4/5] test: wait for loop/backing_file attribute being removed Hopefully fixes issue like https://github.com/systemd/systemd/issues/32680#issuecomment-2120959238 https://github.com/systemd/systemd/issues/32680#issuecomment-2122074805 --- test/units/TEST-74-AUX-UTILS.mount.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/units/TEST-74-AUX-UTILS.mount.sh b/test/units/TEST-74-AUX-UTILS.mount.sh index 5bba5a3ac50..98c388a272c 100755 --- a/test/units/TEST-74-AUX-UTILS.mount.sh +++ b/test/units/TEST-74-AUX-UTILS.mount.sh @@ -145,7 +145,12 @@ test -e /run/media/system/simple.img/foo.bar # systemd-mount --list and systemd-umount require the loopback block device is initialized by udevd. udevadm settle --timeout 30 assert_in "/dev/loop.* ext4 +sd-mount-test" "$(systemd-mount --list --full)" +LOOP_AUTO=$(systemd-mount --list --full --no-legend | awk '$6 == "sd-mount-test" { print $1 }') +LOOP_AUTO_DEVPATH=$(udevadm info --query property --property DEVPATH --value "$LOOP_AUTO") systemd-umount "$WORK_DIR/simple.img" +# Wait for 'change' uevent for the device with DISK_MEDIA_CHANGE=1. +# After the event, the backing_file attribute should be removed. +timeout 60 bash -c "while [[ -e /sys/$LOOP_AUTO_DEVPATH/loop/backing_file ]]; do sleep 1; done" # --owner + vfat # From 07cbd02e9a08cb0f773edb04475586f123675670 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 21 May 2024 05:35:50 +0900 Subject: [PATCH 5/5] test: collect information about loopback device on failure --- test/units/TEST-74-AUX-UTILS.mount.sh | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/test/units/TEST-74-AUX-UTILS.mount.sh b/test/units/TEST-74-AUX-UTILS.mount.sh index 98c388a272c..ba47b5384db 100755 --- a/test/units/TEST-74-AUX-UTILS.mount.sh +++ b/test/units/TEST-74-AUX-UTILS.mount.sh @@ -162,7 +162,15 @@ LOOP="$(losetup --show --find "$WORK_DIR/owner-vfat.img")" udevadm wait --timeout 60 --settle "$LOOP" # Also wait for the .device unit for the loop device is active. Otherwise, the .device unit activation # that is triggered by the .mount unit introduced by systemd-mount below may time out. -timeout 60 bash -c "until systemctl is-active $LOOP; do sleep 1; done" +if ! timeout 60 bash -c "until systemctl is-active $LOOP; do sleep 1; done"; then + # For debugging issue like + # https://github.com/systemd/systemd/issues/32680#issuecomment-2120959238 + # https://github.com/systemd/systemd/issues/32680#issuecomment-2122074805 + udevadm info "$LOOP" + udevadm info --attribute-walk "$LOOP" + cat /sys/"$(udevadm info --query property --property DEVPATH --value "$LOOP")"/loop/backing_file || : + false +fi # Mount it and check the UID/GID [[ "$(stat -c "%U:%G" "$WORK_DIR/mnt")" == "root:root" ]] systemd-mount --owner=testuser "$LOOP" "$WORK_DIR/mnt"