diff --git a/test/TEST-74-AUX-UTILS/meson.build b/test/TEST-74-AUX-UTILS/meson.build index ee24cd8f786..698d03b055f 100644 --- a/test/TEST-74-AUX-UTILS/meson.build +++ b/test/TEST-74-AUX-UTILS/meson.build @@ -1,11 +1,9 @@ # SPDX-License-Identifier: LGPL-2.1-or-later +# Container-specific auxiliary tests. VM-based ones go in TEST-87-AUX-UTILS-VM. integration_tests += [ integration_test_template + { 'name' : fs.name(meson.current_source_dir()), - 'storage': 'persistent', - 'vm' : true, - 'coredump-exclude-regex' : '/(test-usr-dump|test-dump|bash)$', }, ] diff --git a/test/TEST-87-AUX-UTILS-VM/meson.build b/test/TEST-87-AUX-UTILS-VM/meson.build new file mode 100644 index 00000000000..84901392047 --- /dev/null +++ b/test/TEST-87-AUX-UTILS-VM/meson.build @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +# VM-specific auxiliary tests. Container-based ones go in TEST-74-AUX-UTILS. + +integration_tests += [ + integration_test_template + { + 'name' : fs.name(meson.current_source_dir()), + 'storage': 'persistent', + 'coredump-exclude-regex' : '/(test-usr-dump|test-dump|bash)$', + 'vm' : true, + }, +] diff --git a/test/meson.build b/test/meson.build index 5545a56c23a..92f184e3f57 100644 --- a/test/meson.build +++ b/test/meson.build @@ -381,6 +381,7 @@ foreach dirname : [ 'TEST-84-STORAGETM', 'TEST-85-NETWORK', 'TEST-86-MULTI-PROFILE-UKI', + 'TEST-87-AUX-UTILS-VM', ] subdir(dirname) endforeach diff --git a/test/units/TEST-74-AUX-UTILS.detect-virt.sh b/test/units/TEST-74-AUX-UTILS.detect-virt.sh index a1539d9b44f..fe1db4d2aa2 100755 --- a/test/units/TEST-74-AUX-UTILS.detect-virt.sh +++ b/test/units/TEST-74-AUX-UTILS.detect-virt.sh @@ -5,7 +5,3 @@ set -o pipefail SYSTEMD_IN_CHROOT=1 systemd-detect-virt --chroot (! SYSTEMD_IN_CHROOT=0 systemd-detect-virt --chroot) - -if ! systemd-detect-virt -c; then - unshare --mount-proc --fork --user --pid systemd-detect-virt --container -fi diff --git a/test/units/TEST-74-AUX-UTILS.mount.sh b/test/units/TEST-74-AUX-UTILS.mount.sh index 89a391d48e1..ecfdb0640fa 100755 --- a/test/units/TEST-74-AUX-UTILS.mount.sh +++ b/test/units/TEST-74-AUX-UTILS.mount.sh @@ -39,149 +39,3 @@ systemd-mount --type=overlay --options="lowerdir=/etc,upperdir=$WORK_DIR/upper,w 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" -LOOP="$(losetup --show --find "$WORK_DIR/simple.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" -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" -systemctl status "$WORK_DIR/mnt" -systemd-mount --list --full -test -e "$WORK_DIR/mnt/foo.bar" -systemd-umount "$WORK_DIR/mnt" -# Same thing, but with explicitly specified filesystem and disabled filesystem check -systemd-mount --type=ext4 --fsck=no --collect "$LOOP" "$WORK_DIR/mnt" -systemctl status "$(systemd-escape --path "$WORK_DIR/mnt").mount" -test -e "$WORK_DIR/mnt/foo.bar" -systemd-mount --umount "$LOOP" -# Discover additional metadata (unit description should now contain filesystem label) -systemd-mount --no-ask-password --discover "$LOOP" "$WORK_DIR/mnt" -test -e "$WORK_DIR/mnt/foo.bar" -systemctl show -P Description "$WORK_DIR/mnt" | grep -q sd-mount-test -systemd-umount "$WORK_DIR/mnt" -# Set a unit description -systemd-mount --description="Very Important Unit" "$LOOP" "$WORK_DIR/mnt" -test -e "$WORK_DIR/mnt/foo.bar" -systemctl show -P Description "$WORK_DIR/mnt" | grep -q "Very Important Unit" -systemd-umount "$WORK_DIR/mnt" -# Set a property -systemd-mount --property="Description=Foo Bar" "$LOOP" "$WORK_DIR/mnt" -test -e "$WORK_DIR/mnt/foo.bar" -systemctl show -P Description "$WORK_DIR/mnt" | grep -q "Foo Bar" -systemd-umount "$WORK_DIR/mnt" -# Set mount options -systemd-mount --options=ro,x-foo-bar "$LOOP" "$WORK_DIR/mnt" -test -e "$WORK_DIR/mnt/foo.bar" -systemctl show -P Options "$WORK_DIR/mnt" | grep -Eq "(^ro|,ro)" -systemctl show -P Options "$WORK_DIR/mnt" | grep -q "x-foo-bar" -systemd-umount "$WORK_DIR/mnt" - -# Mount with only source set -systemd-mount "$LOOP" -systemctl status /run/media/system/sd-mount-test -systemd-mount --list --full -test -e /run/media/system/sd-mount-test/foo.bar -systemd-umount LABEL=sd-mount-test - -# Automount -systemd-mount --automount=yes "$LOOP" "$WORK_DIR/mnt" -systemd-mount --list --full -systemctl status "$(systemd-escape --path "$WORK_DIR/mnt").automount" -[[ "$(systemctl show -P ActiveState "$WORK_DIR/mnt")" == inactive ]] -test -e "$WORK_DIR/mnt/foo.bar" -systemctl status "$WORK_DIR/mnt" -systemd-umount "$WORK_DIR/mnt" -# Automount + automount-specific property -systemd-mount -A --automount-property="Description=Bar Baz" "$LOOP" "$WORK_DIR/mnt" -systemctl show -P Description "$(systemd-escape --path "$WORK_DIR/mnt").automount" | grep -q "Bar Baz" -test -e "$WORK_DIR/mnt/foo.bar" -# Call --umount via --machine=, first with a relative path (bad) and then with -# an absolute one (good) -(! systemd-umount --machine=.host "$(realpath --relative-to=. "$WORK_DIR/mnt")") -systemd-umount --machine=.host "$WORK_DIR/mnt" - -# ext4 doesn't support uid=/gid= -(! systemd-mount -t ext4 --owner=testuser "$LOOP" "$WORK_DIR/mnt") - -# Automount + --bind-device -systemd-mount --automount=yes --bind-device --timeout-idle-sec=1 "$LOOP" "$WORK_DIR/mnt" -systemctl status "$(systemd-escape --path "$WORK_DIR/mnt").automount" -# Trigger the automount -test -e "$WORK_DIR/mnt/foo.bar" -# Wait until it's idle again -sleep 1.5 -# Safety net for slower/overloaded systems -timeout 10s bash -c "while systemctl is-active -q $WORK_DIR/mnt; do sleep .2; done" -systemctl status "$(systemd-escape --path "$WORK_DIR/mnt").automount" -# Disassemble the underlying block device -losetup -d "$LOOP" -unset LOOP -# The automount unit should disappear once the underlying blockdev is gone -timeout 10s bash -c "while systemctl status '$(systemd-escape --path "$WORK_DIR/mnt".automount)'; do sleep .2; done" - -# Mount a disk image -systemd-mount --discover "$WORK_DIR/simple.img" -# We can access files in the image even if the loopback block device is not initialized by udevd. -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 '$7 == "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 -# -# Create a vfat image, as ext4 doesn't support uid=/gid= fixating for all -# files/directories -dd if=/dev/zero of="$WORK_DIR/owner-vfat.img" bs=1M count=16 -mkfs.vfat -n owner-vfat "$WORK_DIR/owner-vfat.img" -LOOP="$(losetup --show --find "$WORK_DIR/owner-vfat.img")" -# If the synthesized uevent triggered by inotify event has been processed earlier than the kernel finishes to -# attach the backing file, then SYSTEMD_READY=0 is set for the device. As a workaround, monitor sysattr -# and re-trigger uevent after that. -LOOP_DEVPATH=$(udevadm info --query property --property DEVPATH --value "$LOOP") -timeout 60 bash -c "until [[ -e /sys/$LOOP_DEVPATH/loop/backing_file ]]; do sleep 1; done" -udevadm trigger --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. -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" -systemctl status "$WORK_DIR/mnt" -[[ "$(stat -c "%U:%G" "$WORK_DIR/mnt")" == "testuser:testuser" ]] -touch "$WORK_DIR/mnt/hello" -[[ "$(stat -c "%U:%G" "$WORK_DIR/mnt/hello")" == "testuser:testuser" ]] -systemd-umount LABEL=owner-vfat diff --git a/test/units/TEST-74-AUX-UTILS.bootctl.sh b/test/units/TEST-87-AUX-UTILS-VM.bootctl.sh similarity index 98% rename from test/units/TEST-74-AUX-UTILS.bootctl.sh rename to test/units/TEST-87-AUX-UTILS-VM.bootctl.sh index 650c289aca6..5a9d8fb27f9 100755 --- a/test/units/TEST-74-AUX-UTILS.bootctl.sh +++ b/test/units/TEST-87-AUX-UTILS-VM.bootctl.sh @@ -3,11 +3,6 @@ set -eux set -o pipefail -if systemd-detect-virt --quiet --container; then - echo "running on container, skipping." - exit 0 -fi - if ! command -v bootctl >/dev/null; then echo "bootctl not found, skipping." exit 0 @@ -24,6 +19,8 @@ fi # shellcheck source=test/units/test-control.sh . "$(dirname "$0")"/test-control.sh +(! systemd-detect-virt -cq) + basic_tests() { bootctl "$@" --help bootctl "$@" --version diff --git a/test/units/TEST-74-AUX-UTILS.coredump.sh b/test/units/TEST-87-AUX-UTILS-VM.coredump.sh similarity index 98% rename from test/units/TEST-74-AUX-UTILS.coredump.sh rename to test/units/TEST-87-AUX-UTILS-VM.coredump.sh index 2c084f54d24..7ab6f29d7d5 100755 --- a/test/units/TEST-74-AUX-UTILS.coredump.sh +++ b/test/units/TEST-87-AUX-UTILS-VM.coredump.sh @@ -19,12 +19,9 @@ at_exit() { rm -fv -- "$CORE_TEST_BIN" "$CORE_TEST_UNPRIV_BIN" "$MAKE_DUMP_SCRIPT" "$MAKE_STACKTRACE_DUMP" } -trap at_exit EXIT +(! systemd-detect-virt -cq) -if systemd-detect-virt -cq; then - echo "Running in a container, skipping the systemd-coredump test..." - exit 0 -fi +trap at_exit EXIT # To make all coredump entries stored in system.journal. journalctl --rotate @@ -81,7 +78,7 @@ timeout 30 bash -c "while [[ \$(coredumpctl list -q --no-legend $CORE_TEST_BIN | if cgroupfs_supports_user_xattrs; then # Make sure we can forward crashes back to containers - CONTAINER="TEST-74-AUX-UTILS-container" + CONTAINER="TEST-87-AUX-UTILS-VM-container" mkdir -p "/var/lib/machines/$CONTAINER" mkdir -p "/run/systemd/system/systemd-nspawn@$CONTAINER.service.d" diff --git a/test/units/TEST-87-AUX-UTILS-VM.detect-virt.sh b/test/units/TEST-87-AUX-UTILS-VM.detect-virt.sh new file mode 100755 index 00000000000..251a0e89102 --- /dev/null +++ b/test/units/TEST-87-AUX-UTILS-VM.detect-virt.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: LGPL-2.1-or-later +set -eux +set -o pipefail + +(! systemd-detect-virt -cq) + +SYSTEMD_IN_CHROOT=1 systemd-detect-virt --chroot +(! SYSTEMD_IN_CHROOT=0 systemd-detect-virt --chroot) + +unshare --mount-proc --fork --user --pid systemd-detect-virt --container diff --git a/test/units/TEST-74-AUX-UTILS.modules-load.sh b/test/units/TEST-87-AUX-UTILS-VM.modules-load.sh similarity index 94% rename from test/units/TEST-74-AUX-UTILS.modules-load.sh rename to test/units/TEST-87-AUX-UTILS-VM.modules-load.sh index ceac8262bfd..140f3d5f957 100755 --- a/test/units/TEST-74-AUX-UTILS.modules-load.sh +++ b/test/units/TEST-87-AUX-UTILS-VM.modules-load.sh @@ -10,12 +10,9 @@ at_exit() { rm -rfv "${CONFIG_FILE:?}" } -trap at_exit EXIT +(! systemd-detect-virt -cq) -if systemd-detect-virt -cq; then - echo "Running in a container, skipping the systemd-modules-load test..." - exit 0 -fi +trap at_exit EXIT ORIG_MODULES_LOAD_CONFIG="$(systemd-analyze cat-config modules-load.d)" diff --git a/test/units/TEST-87-AUX-UTILS-VM.mount.sh b/test/units/TEST-87-AUX-UTILS-VM.mount.sh new file mode 100755 index 00000000000..3075d0fe2eb --- /dev/null +++ b/test/units/TEST-87-AUX-UTILS-VM.mount.sh @@ -0,0 +1,182 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: LGPL-2.1-or-later +set -eux +set -o pipefail + +# shellcheck source=test/units/util.sh +. "$(dirname "$0")"/util.sh + +at_exit() { + set +e + + [[ -n "${LOOP:-}" ]] && losetup -d "$LOOP" + [[ -n "${WORK_DIR:-}" ]] && rm -fr "$WORK_DIR" +} + +(! systemd-detect-virt -cq) + +trap at_exit EXIT + +WORK_DIR="$(mktemp -d)" +mkdir -p "$WORK_DIR/mnt" + +systemd-mount --list +systemd-mount --list --full +systemd-mount --list --no-legend +systemd-mount --list --no-pager +systemd-mount --list --quiet +systemd-mount --list --json=pretty + +# 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" + +# 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" +LOOP="$(losetup --show --find "$WORK_DIR/simple.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" +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" +systemctl status "$WORK_DIR/mnt" +systemd-mount --list --full +test -e "$WORK_DIR/mnt/foo.bar" +systemd-umount "$WORK_DIR/mnt" +# Same thing, but with explicitly specified filesystem and disabled filesystem check +systemd-mount --type=ext4 --fsck=no --collect "$LOOP" "$WORK_DIR/mnt" +systemctl status "$(systemd-escape --path "$WORK_DIR/mnt").mount" +test -e "$WORK_DIR/mnt/foo.bar" +systemd-mount --umount "$LOOP" +# Discover additional metadata (unit description should now contain filesystem label) +systemd-mount --no-ask-password --discover "$LOOP" "$WORK_DIR/mnt" +test -e "$WORK_DIR/mnt/foo.bar" +systemctl show -P Description "$WORK_DIR/mnt" | grep -q sd-mount-test +systemd-umount "$WORK_DIR/mnt" +# Set a unit description +systemd-mount --description="Very Important Unit" "$LOOP" "$WORK_DIR/mnt" +test -e "$WORK_DIR/mnt/foo.bar" +systemctl show -P Description "$WORK_DIR/mnt" | grep -q "Very Important Unit" +systemd-umount "$WORK_DIR/mnt" +# Set a property +systemd-mount --property="Description=Foo Bar" "$LOOP" "$WORK_DIR/mnt" +test -e "$WORK_DIR/mnt/foo.bar" +systemctl show -P Description "$WORK_DIR/mnt" | grep -q "Foo Bar" +systemd-umount "$WORK_DIR/mnt" +# Set mount options +systemd-mount --options=ro,x-foo-bar "$LOOP" "$WORK_DIR/mnt" +test -e "$WORK_DIR/mnt/foo.bar" +systemctl show -P Options "$WORK_DIR/mnt" | grep -Eq "(^ro|,ro)" +systemctl show -P Options "$WORK_DIR/mnt" | grep -q "x-foo-bar" +systemd-umount "$WORK_DIR/mnt" + +# Mount with only source set +systemd-mount "$LOOP" +systemctl status /run/media/system/sd-mount-test +systemd-mount --list --full +test -e /run/media/system/sd-mount-test/foo.bar +systemd-umount LABEL=sd-mount-test + +# Automount +systemd-mount --automount=yes "$LOOP" "$WORK_DIR/mnt" +systemd-mount --list --full +systemctl status "$(systemd-escape --path "$WORK_DIR/mnt").automount" +[[ "$(systemctl show -P ActiveState "$WORK_DIR/mnt")" == inactive ]] +test -e "$WORK_DIR/mnt/foo.bar" +systemctl status "$WORK_DIR/mnt" +systemd-umount "$WORK_DIR/mnt" +# Automount + automount-specific property +systemd-mount -A --automount-property="Description=Bar Baz" "$LOOP" "$WORK_DIR/mnt" +systemctl show -P Description "$(systemd-escape --path "$WORK_DIR/mnt").automount" | grep -q "Bar Baz" +test -e "$WORK_DIR/mnt/foo.bar" +# Call --umount via --machine=, first with a relative path (bad) and then with +# an absolute one (good) +(! systemd-umount --machine=.host "$(realpath --relative-to=. "$WORK_DIR/mnt")") +systemd-umount --machine=.host "$WORK_DIR/mnt" + +# ext4 doesn't support uid=/gid= +(! systemd-mount -t ext4 --owner=testuser "$LOOP" "$WORK_DIR/mnt") + +# Automount + --bind-device +systemd-mount --automount=yes --bind-device --timeout-idle-sec=1 "$LOOP" "$WORK_DIR/mnt" +systemctl status "$(systemd-escape --path "$WORK_DIR/mnt").automount" +# Trigger the automount +test -e "$WORK_DIR/mnt/foo.bar" +# Wait until it's idle again +sleep 1.5 +# Safety net for slower/overloaded systems +timeout 10s bash -c "while systemctl is-active -q $WORK_DIR/mnt; do sleep .2; done" +systemctl status "$(systemd-escape --path "$WORK_DIR/mnt").automount" +# Disassemble the underlying block device +losetup -d "$LOOP" +unset LOOP +# The automount unit should disappear once the underlying blockdev is gone +timeout 10s bash -c "while systemctl status '$(systemd-escape --path "$WORK_DIR/mnt".automount)'; do sleep .2; done" + +# Mount a disk image +systemd-mount --discover "$WORK_DIR/simple.img" +# We can access files in the image even if the loopback block device is not initialized by udevd. +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 '$7 == "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 +# +# Create a vfat image, as ext4 doesn't support uid=/gid= fixating for all +# files/directories +dd if=/dev/zero of="$WORK_DIR/owner-vfat.img" bs=1M count=16 +mkfs.vfat -n owner-vfat "$WORK_DIR/owner-vfat.img" +LOOP="$(losetup --show --find "$WORK_DIR/owner-vfat.img")" +# If the synthesized uevent triggered by inotify event has been processed earlier than the kernel finishes to +# attach the backing file, then SYSTEMD_READY=0 is set for the device. As a workaround, monitor sysattr +# and re-trigger uevent after that. +LOOP_DEVPATH=$(udevadm info --query property --property DEVPATH --value "$LOOP") +timeout 60 bash -c "until [[ -e /sys/$LOOP_DEVPATH/loop/backing_file ]]; do sleep 1; done" +udevadm trigger --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. +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" +systemctl status "$WORK_DIR/mnt" +[[ "$(stat -c "%U:%G" "$WORK_DIR/mnt")" == "testuser:testuser" ]] +touch "$WORK_DIR/mnt/hello" +[[ "$(stat -c "%U:%G" "$WORK_DIR/mnt/hello")" == "testuser:testuser" ]] +systemd-umount LABEL=owner-vfat diff --git a/test/units/TEST-74-AUX-UTILS.pstore.sh b/test/units/TEST-87-AUX-UTILS-VM.pstore.sh similarity index 98% rename from test/units/TEST-74-AUX-UTILS.pstore.sh rename to test/units/TEST-87-AUX-UTILS-VM.pstore.sh index 9be8066e8e2..043d0238565 100755 --- a/test/units/TEST-74-AUX-UTILS.pstore.sh +++ b/test/units/TEST-87-AUX-UTILS-VM.pstore.sh @@ -5,10 +5,7 @@ set -o pipefail systemctl log-level info -if systemd-detect-virt -cq; then - echo "Running in a container, skipping the systemd-pstore test..." - exit 0 -fi +(! systemd-detect-virt -cq) DUMMY_DMESG_0="$(mktemp)" cat >"$DUMMY_DMESG_0" <<\EOF diff --git a/test/units/TEST-87-AUX-UTILS-VM.sh b/test/units/TEST-87-AUX-UTILS-VM.sh new file mode 100755 index 00000000000..9c2a033aa98 --- /dev/null +++ b/test/units/TEST-87-AUX-UTILS-VM.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: LGPL-2.1-or-later +set -eux +set -o pipefail + +# shellcheck source=test/units/test-control.sh +. "$(dirname "$0")"/test-control.sh + +run_subtests + +touch /testok