]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
repart: support erofs
authorLennart Poettering <lennart@poettering.net>
Fri, 9 Dec 2022 15:08:54 +0000 (16:08 +0100)
committerLuca Boccassi <luca.boccassi@gmail.com>
Sat, 10 Dec 2022 10:26:36 +0000 (11:26 +0100)
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.

docs/PORTABLE_SERVICES.md
man/repart.d.xml
man/systemd-sysext.xml
src/shared/mkfs-util.c
test/TEST-58-REPART/test.sh
test/units/testsuite-58.sh

index 7a9c7f512df24655497cd22bf5b3864f878ee773..93c55ac5eea68c234661a0c07a26fc35e521b83e 100644 (file)
@@ -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
index fe3de8d58a4678bd3be9a5816c735c45b840c497..d5ce3f8587a06d2e43da47f840be2e80476ffcd3 100644 (file)
         <term><varname>Format=</varname></term>
 
         <listitem><para>Takes a file system name, such as <literal>ext4</literal>, <literal>btrfs</literal>,
-        <literal>xfs</literal>, <literal>vfat</literal>, <literal>squashfs</literal>, or the special value
-        <literal>swap</literal>. 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).</para>
+        <literal>xfs</literal>, <literal>vfat</literal>, <literal>erofs</literal>,
+        <literal>squashfs</literal> or the special value <literal>swap</literal>. 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).</para>
 
         <para>This option has no effect if the partition already exists.</para>
 
index 1de1627850aa22b6bcf3128fdaa89d7dc2ef7d36..99436ced59d067a3d3fb721a1b86bd2e5d7eed36 100644 (file)
@@ -73,7 +73,8 @@
       <listitem><para>Plain directories or btrfs subvolumes containing the OS tree</para></listitem>
       <listitem><para>Disk images with a GPT disk label, following the <ulink
       url="https://uapi-group.org/specifications/specs/discoverable_partitions_specification">Discoverable Partitions Specification</ulink></para></listitem>
-      <listitem><para>Disk images lacking a partition table, with a naked Linux file system (e.g. squashfs or ext4)</para></listitem>
+      <listitem><para>Disk images lacking a partition table, with a naked Linux file system (e.g. erofs,
+      squashfs or ext4)</para></listitem>
     </orderedlist>
 
     <para>These image formats are the same ones that
index 68e8f12eabb42176ebd8db5800c50ad1c8ba025f..97c3ff8da21a7fba72efb3f8f109d84e9e4a3ed4 100644 (file)
@@ -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);
index 0d513cf85bf02c1d890865905ed444bacb1b6f62..5f04d2017a1c14866859bb1d5593a20630ef80d8 100755 (executable)
@@ -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
index 01eec207459489838c422ce2dba49cc47dc48d21..6e5af3274903bab3b6c6c8fd76648d6d8b035f9e 100755 (executable)
@@ -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