diff --git a/docs/PORTABLE_SERVICES.md b/docs/PORTABLE_SERVICES.md index 7a9c7f512d..93c55ac5ee 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 fe3de8d58a..d5ce3f8587 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 1de1627850..99436ced59 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 68e8f12eab..97c3ff8da2 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 0d513cf85b..5f04d2017a 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 01eec20745..6e5af32749 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