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