mirror of
https://github.com/systemd/systemd
synced 2026-04-07 07:34:50 +02:00
Compare commits
4 Commits
b3c117172f
...
445b7073c7
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
445b7073c7 | ||
|
|
2091caddb8 | ||
|
|
f30a29245d | ||
|
|
adf88771ff |
@ -6785,7 +6785,8 @@ static int context_mkfs(Context *context) {
|
|||||||
* have to populate using the filesystem's mkfs's --root= (or equivalent) option. To do that,
|
* have to populate using the filesystem's mkfs's --root= (or equivalent) option. To do that,
|
||||||
* we need to set up the final directory tree beforehand. */
|
* we need to set up the final directory tree beforehand. */
|
||||||
|
|
||||||
if (partition_needs_populate(p) && (!t->loop || fstype_is_ro(p->format))) {
|
if (partition_needs_populate(p) &&
|
||||||
|
(!t->loop || fstype_is_ro(p->format) || (streq_ptr(p->format, "btrfs") && p->compression))) {
|
||||||
if (!mkfs_supports_root_option(p->format))
|
if (!mkfs_supports_root_option(p->format))
|
||||||
return log_error_errno(SYNTHETIC_ERRNO(ENODEV),
|
return log_error_errno(SYNTHETIC_ERRNO(ENODEV),
|
||||||
"Loop device access is required to populate %s filesystems.",
|
"Loop device access is required to populate %s filesystems.",
|
||||||
@ -8533,7 +8534,7 @@ static int context_minimize(Context *context) {
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!d || fstype_is_ro(p->format)) {
|
if (!d || fstype_is_ro(p->format) || (streq_ptr(p->format, "btrfs") && p->compression)) {
|
||||||
if (!mkfs_supports_root_option(p->format))
|
if (!mkfs_supports_root_option(p->format))
|
||||||
return log_error_errno(SYNTHETIC_ERRNO(ENODEV),
|
return log_error_errno(SYNTHETIC_ERRNO(ENODEV),
|
||||||
"Loop device access is required to populate %s filesystems.",
|
"Loop device access is required to populate %s filesystems.",
|
||||||
|
|||||||
@ -466,6 +466,10 @@ int make_filesystem(
|
|||||||
return log_oom();
|
return log_oom();
|
||||||
|
|
||||||
if (compression) {
|
if (compression) {
|
||||||
|
if (!root)
|
||||||
|
log_warning("Btrfs compression setting ignored because no files are being copied. "
|
||||||
|
"Compression= can only be applied when CopyFiles= is also specified.");
|
||||||
|
else {
|
||||||
_cleanup_free_ char *c = NULL;
|
_cleanup_free_ char *c = NULL;
|
||||||
|
|
||||||
c = strdup(compression);
|
c = strdup(compression);
|
||||||
@ -478,6 +482,7 @@ int make_filesystem(
|
|||||||
if (strv_extend_many(&argv, "--compress", c) < 0)
|
if (strv_extend_many(&argv, "--compress", c) < 0)
|
||||||
return log_oom();
|
return log_oom();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* mkfs.btrfs unconditionally warns about several settings changing from v5.15 onwards which
|
/* mkfs.btrfs unconditionally warns about several settings changing from v5.15 onwards which
|
||||||
* isn't silenced by "-q", so let's redirect stdout to /dev/null as well. */
|
* isn't silenced by "-q", so let's redirect stdout to /dev/null as well. */
|
||||||
|
|||||||
@ -1685,6 +1685,76 @@ EOF
|
|||||||
grep -q 'UUID=[0-9a-f-]* /home btrfs discard,rw,nodev,suid,exec,subvol=@home,zstd:1,noatime,lazytime 0 1' "$root"/etc/fstab
|
grep -q 'UUID=[0-9a-f-]* /home btrfs discard,rw,nodev,suid,exec,subvol=@home,zstd:1,noatime,lazytime 0 1' "$root"/etc/fstab
|
||||||
}
|
}
|
||||||
|
|
||||||
|
testcase_btrfs_compression() {
|
||||||
|
local defs imgs loop output
|
||||||
|
|
||||||
|
if ! systemd-analyze compare-versions "$(btrfs --version | head -n 1 | awk '{ print $2 }')" ge v6.13; then
|
||||||
|
echo "btrfs-progs is not installed or older than v6.13, skipping test."
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
defs="$(mktemp -d)"
|
||||||
|
imgs="$(mktemp -d)"
|
||||||
|
# shellcheck disable=SC2064
|
||||||
|
trap "rm -rf '$defs' '$imgs'" RETURN
|
||||||
|
chmod 0755 "$defs"
|
||||||
|
|
||||||
|
echo "*** testcase for btrfs compression with CopyFiles (OFFLINE=$OFFLINE) ***"
|
||||||
|
|
||||||
|
# Must not be in tmpfs due to exclusions. It also must be large and
|
||||||
|
# compressible so that the compression check succeeds later.
|
||||||
|
src=/etc/test-source-file
|
||||||
|
dd if=/dev/zero of="$src" bs=1M count=1 2>/dev/null
|
||||||
|
|
||||||
|
tee "$defs/btrfs-compressed.conf" <<EOF
|
||||||
|
[Partition]
|
||||||
|
Type=linux-generic
|
||||||
|
Format=btrfs
|
||||||
|
Compression=zstd
|
||||||
|
CopyFiles=$src:/test-file
|
||||||
|
SizeMinBytes=100M
|
||||||
|
SizeMaxBytes=100M
|
||||||
|
EOF
|
||||||
|
|
||||||
|
systemd-repart --offline="$OFFLINE" \
|
||||||
|
--definitions="$defs" \
|
||||||
|
--empty=create \
|
||||||
|
--size=auto \
|
||||||
|
--dry-run=no \
|
||||||
|
--seed="$seed" \
|
||||||
|
"$imgs/btrfs-compressed.img" 2>&1 | tee "$imgs/repart-output.txt"
|
||||||
|
rm "$src"
|
||||||
|
|
||||||
|
output=$(cat "$imgs/repart-output.txt")
|
||||||
|
|
||||||
|
assert_in "Rootdir from:" "$output"
|
||||||
|
assert_in "Compress:" "$output"
|
||||||
|
|
||||||
|
if [[ "$OFFLINE" == "yes" ]] || systemd-detect-virt --quiet --container; then
|
||||||
|
echo "Skipping mount verification (requires loop devices)"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
loop="$(losetup -P --show --find "$imgs/btrfs-compressed.img")"
|
||||||
|
# shellcheck disable=SC2064
|
||||||
|
trap "umount '$imgs/mount' 2>/dev/null || true; losetup -d '$loop' 2>/dev/null || true; rm -rf '$defs' '$imgs'" RETURN
|
||||||
|
echo "Loop device: $loop"
|
||||||
|
udevadm wait --timeout=60 --settle "${loop:?}p1"
|
||||||
|
|
||||||
|
mkdir -p "$imgs/mount"
|
||||||
|
mount -t btrfs "${loop:?}p1" "$imgs/mount"
|
||||||
|
|
||||||
|
[[ -f "$imgs/mount/test-file" ]]
|
||||||
|
[[ "$(stat -c%s "$imgs/mount/test-file")" == "1048576" ]]
|
||||||
|
|
||||||
|
if command -v compsize &>/dev/null; then
|
||||||
|
output=$(compsize "$imgs/mount/test-file" 2>&1)
|
||||||
|
assert_in "zstd" "$output"
|
||||||
|
fi
|
||||||
|
|
||||||
|
umount "$imgs/mount"
|
||||||
|
losetup -d "$loop"
|
||||||
|
}
|
||||||
|
|
||||||
testcase_varlink_list_devices() {
|
testcase_varlink_list_devices() {
|
||||||
REPART="$(which systemd-repart)"
|
REPART="$(which systemd-repart)"
|
||||||
varlinkctl introspect "$REPART"
|
varlinkctl introspect "$REPART"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user