From: Lennart Poettering Date: Fri, 9 Dec 2022 15:08:54 +0000 (+0100) Subject: repart: support erofs X-Git-Tag: v253-rc1~323 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=09e917ea4dd6f00aa3cb225072f6991a637227e1;p=thirdparty%2Fsystemd.git repart: support erofs So, i think "erofs" is probably the better, more modern alternative to "squashfs". Many of the benefits don't matter too much to us I guess, but there's one thing that stands out: erofs has a UUID in the superblock, squashfs has not. Having an UUID in the superblock matters if the file systems are used in an overlayfs stack, as overlayfs uses the UUIDs to robustly and persistently reference inodes on layers in case of metadata copy-up. Since we probably want to allow such uses in overlayfs as emplyoed by sysext (and the future syscfg) we probably should ramp up our erofs game early on. Hence let's natively support erofs, test it, and in fact mention it in the docs before squashfs even. --- diff --git a/docs/PORTABLE_SERVICES.md b/docs/PORTABLE_SERVICES.md index 7a9c7f512df..93c55ac5eea 100644 --- a/docs/PORTABLE_SERVICES.md +++ b/docs/PORTABLE_SERVICES.md @@ -223,8 +223,8 @@ images minimal. If the image is writable, and some of the files or directories that are overmounted from the host do not exist yet they will be automatically created. -On read-only, immutable images (e.g. squashfs images) all files and directories -to over-mount must exist already. +On read-only, immutable images (e.g. `erofs` or `squashfs` images) all files +and directories to over-mount must exist already. Note that as no new image format or metadata is defined, it's very straightforward to define images than can be made use of in a number of diff --git a/man/repart.d.xml b/man/repart.d.xml index fe3de8d58a4..d5ce3f8587a 100644 --- a/man/repart.d.xml +++ b/man/repart.d.xml @@ -383,12 +383,13 @@ Format= Takes a file system name, such as ext4, btrfs, - xfs, vfat, squashfs, or the special value - swap. If specified and the partition is newly created it is formatted with the - specified file system (or as swap device). The file system UUID and label are automatically derived - from the partition UUID and label. If this option is used, the size allocation algorithm is slightly - altered: the partition is created as least as big as required for the minimal file system of the - specified type (or 4KiB if the minimal size is not known). + xfs, vfat, erofs, + squashfs or the special value swap. If specified and the partition + is newly created it is formatted with the specified file system (or as swap device). The file system + UUID and label are automatically derived from the partition UUID and label. If this option is used, + the size allocation algorithm is slightly altered: the partition is created as least as big as + required for the minimal file system of the specified type (or 4KiB if the minimal size is not + known). This option has no effect if the partition already exists. diff --git a/man/systemd-sysext.xml b/man/systemd-sysext.xml index 1de1627850a..99436ced59d 100644 --- a/man/systemd-sysext.xml +++ b/man/systemd-sysext.xml @@ -73,7 +73,8 @@ Plain directories or btrfs subvolumes containing the OS tree Disk images with a GPT disk label, following the Discoverable Partitions Specification - Disk images lacking a partition table, with a naked Linux file system (e.g. squashfs or ext4) + Disk images lacking a partition table, with a naked Linux file system (e.g. erofs, + squashfs or ext4) These image formats are the same ones that diff --git a/src/shared/mkfs-util.c b/src/shared/mkfs-util.c index 68e8f12eabb..97c3ff8da21 100644 --- a/src/shared/mkfs-util.c +++ b/src/shared/mkfs-util.c @@ -335,6 +335,14 @@ int make_filesystem( return log_error_errno(SYNTHETIC_ERRNO(EPROTONOSUPPORT), "mksquashfs binary not available."); if (r < 0) return log_error_errno(r, "Failed to determine whether mksquashfs binary exists: %m"); + + } else if (streq(fstype, "erofs")) { + r = find_executable("mkfs.erofs", &mkfs); + if (r == -ENOENT) + return log_error_errno(SYNTHETIC_ERRNO(EPROTONOSUPPORT), "mkfs.erofs binary not available."); + if (r < 0) + return log_error_errno(r, "Failed to determine whether mkfs.erofs binary exists: %m"); + } else if (fstype_is_ro(fstype)) { return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "Don't know how to create read-only file system '%s', refusing.", @@ -501,6 +509,12 @@ int make_filesystem( root, node, "-quiet", "-noappend"); + + else if (streq(fstype, "erofs")) + + argv = strv_new(mkfs, + "-U", vol_id, + node, root); else /* Generic fallback for all other file systems */ argv = strv_new(mkfs, node); @@ -539,6 +553,9 @@ int make_filesystem( if (STR_IN_SET(fstype, "ext2", "ext3", "ext4", "btrfs", "f2fs", "xfs", "vfat", "swap")) log_info("%s successfully formatted as %s (label \"%s\", uuid %s)", node, fstype, label, vol_id); + else if (streq(fstype, "erofs")) + log_info("%s successfully formatted as %s (uuid %s, no label)", + node, fstype, vol_id); else log_info("%s successfully formatted as %s (no label or uuid specified)", node, fstype); diff --git a/test/TEST-58-REPART/test.sh b/test/TEST-58-REPART/test.sh index 0d513cf85bf..5f04d2017a1 100755 --- a/test/TEST-58-REPART/test.sh +++ b/test/TEST-58-REPART/test.sh @@ -13,8 +13,10 @@ test_append_files() { if ! get_bool "${TEST_NO_QEMU:=}"; then install_dmevent instmods dm_verity =md + instmods erofs generate_module_dependencies image_install -o /sbin/mksquashfs + image_install -o /bin/mkfs.erofs fi inst_binary mcopy diff --git a/test/units/testsuite-58.sh b/test/units/testsuite-58.sh index 01eec207459..6e5af327490 100755 --- a/test/units/testsuite-58.sh +++ b/test/units/testsuite-58.sh @@ -901,7 +901,7 @@ test_minimize() { # shellcheck disable=SC2064 trap "rm -rf '$defs' '$imgs'" RETURN - for format in ext4 vfat; do + for format in ext4 vfat erofs; do if ! command -v "mkfs.$format" >/dev/null; then continue fi