]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
image: add support for EROFS rootfs image generation 19244/head
authorGao Xiang <hsiangkao@linux.alibaba.com>
Wed, 25 Jun 2025 17:45:22 +0000 (01:45 +0800)
committerChristian Marangi <ansuelsmth@gmail.com>
Sat, 5 Jul 2025 13:24:54 +0000 (15:24 +0200)
Add support for generating EROFS rootfs images.

The EROFS filesystem can offer competitive I/O performance while
minimizing final image size when using the MicroLZMA compressor.

Target platform: linux-x86_generic (target-i386_pentium4_musl)

Filesystem     Image Size
=============  ==========
root.erofs     4882432
root.ext4      109051904
root.squashfs  4903302

Co-Developed-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://github.com/openwrt/openwrt/pull/19244
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
config/Config-build.in
config/Config-images.in
config/Config-kernel.in
include/image.mk
scripts/target-metadata.pl
target/Config.in
target/linux/generic/config-6.12
target/linux/generic/config-6.6

index 822073d61c2bcd25ce3009f37945e1a4ac498c03..42b353ecf727ae7914c706ce170dc1d74f2838a6 100644 (file)
@@ -384,6 +384,7 @@ menu "Global build settings"
        config TARGET_ROOTFS_SECURITY_LABELS
                bool
                select KERNEL_SQUASHFS_XATTR
+               select KERNEL_EROFS_FS_SECURITY
                select KERNEL_EXT4_FS_SECURITY
                select KERNEL_F2FS_FS_SECURITY
                select KERNEL_UBIFS_FS_SECURITY
index 21ce0b8d28e4f7ff9587835b5afae66bbd56a8c2..05476dac77edb6e239c90daa7af8d61ba07508ba 100644 (file)
@@ -87,6 +87,23 @@ menu "Target Images"
 
        comment "Root filesystem images"
 
+       menuconfig TARGET_ROOTFS_EROFS
+               bool "erofs"
+               default y if USES_EROFS
+               select KERNEL_EROFS_FS
+               help
+                 Build a EROFS root filesystem.
+
+               config TARGET_EROFS_PCLUSTER_SIZE
+                       int "physical cluster size (in KiB)"
+                       depends on TARGET_ROOTFS_EROFS
+                       default 64 if LOW_MEMORY_FOOTPRINT
+                       default 1024 if (SMALL_FLASH && !LOW_MEMORY_FOOTPRINT)
+                       default 256
+                       help
+                         Specify the EROFS physical cluster size (must be equal
+                         to or a multiple of the filesystem block size).
+
        menuconfig TARGET_ROOTFS_EXT4FS
                bool "ext4"
                default y if USES_EXT4
index 57d693ce49b5f23e56c0afe527ddb4ae5a98cb6a..86a7804f96ac911a360591bead82111ab3768d27 100644 (file)
@@ -1278,6 +1278,23 @@ config KERNEL_BTRFS_FS
          Say Y here if you want to make the kernel to be able to boot off a
          BTRFS partition.
 
+config KERNEL_EROFS_FS
+       bool "Compile the kernel with built-in EROFS support"
+       help
+         Say Y here if you want to make the kernel to be able to boot off a
+         EROFS partition.
+
+config KERNEL_EROFS_FS_XATTR
+       bool "EROFS XATTR support"
+
+config KERNEL_EROFS_FS_ZIP
+       bool
+       default y if KERNEL_EROFS_FS
+
+config KERNEL_EROFS_FS_ZIP_LZMA
+       bool
+       default y if KERNEL_EROFS_FS
+
 menu "Filesystem ACL and attr support options"
        config USE_FS_ACL_ATTR
                bool "Use filesystem ACL and attr support by default"
@@ -1298,6 +1315,11 @@ menu "Filesystem ACL and attr support options"
                select KERNEL_FS_POSIX_ACL
                default y if USE_FS_ACL_ATTR
 
+       config KERNEL_EROFS_FS_POSIX_ACL
+               bool "Enable POSIX ACL for EROFS Filesystems"
+               select KERNEL_FS_POSIX_ACL
+               default y if USE_FS_ACL_ATTR
+
        config KERNEL_EXT4_FS_POSIX_ACL
                bool "Enable POSIX ACL for Ext4 Filesystems"
                select KERNEL_FS_POSIX_ACL
@@ -1440,6 +1462,11 @@ config KERNEL_LSM
        default "lockdown,yama,loadpin,safesetid,integrity,selinux"
        depends on KERNEL_SECURITY_SELINUX
 
+config KERNEL_EROFS_FS_SECURITY
+       bool "EROFS Security Labels"
+       default y if !SMALL_FLASH
+       select KERNEL_EROFS_FS_XATTR
+
 config KERNEL_EXT4_FS_SECURITY
        bool "Ext4 Security Labels"
        default y if !SMALL_FLASH
index 2eca62a6643ae66dae227c464c6338edc0a17f0b..262edd79d4eb1d39d80764d39dedaa437453be37 100644 (file)
@@ -99,11 +99,22 @@ endif
 
 JFFS2_BLOCKSIZE ?= 64k 128k
 
+EROFS_PCLUSTERSIZE := $(shell echo $$(($(CONFIG_TARGET_EROFS_PCLUSTER_SIZE)*1024)))
+EROFSOPT := -C$(EROFS_PCLUSTERSIZE)
+EROFSOPT += -Efragments,dedupe,ztailpacking -Uclear --all-root
+EROFSOPT += $(if $(SOURCE_DATE_EPOCH),-T$(SOURCE_DATE_EPOCH) --ignore-mtime)
+EROFSOPT += $(if $(CONFIG_SELINUX),,-x-1)
+EROFSCOMP := lz4hc,12
+ifeq ($(CONFIG_EROFS_FS_ZIP_LZMA),y)
+EROFSCOMP := lzma,109
+endif
+
 fs-types-$(CONFIG_TARGET_ROOTFS_SQUASHFS) += squashfs
 fs-types-$(CONFIG_TARGET_ROOTFS_JFFS2) += $(addprefix jffs2-,$(JFFS2_BLOCKSIZE))
 fs-types-$(CONFIG_TARGET_ROOTFS_JFFS2_NAND) += $(addprefix jffs2-nand-,$(NAND_BLOCKSIZE))
 fs-types-$(CONFIG_TARGET_ROOTFS_EXT4FS) += ext4
 fs-types-$(CONFIG_TARGET_ROOTFS_UBIFS) += ubifs
+fs-types-$(CONFIG_TARGET_ROOTFS_EROFS) += erofs
 fs-subtypes-$(CONFIG_TARGET_ROOTFS_JFFS2) += $(addsuffix -raw,$(addprefix jffs2-,$(JFFS2_BLOCKSIZE)))
 
 TARGET_FILESYSTEMS := $(fs-types-y)
@@ -309,6 +320,12 @@ define Image/mkfs/ext4
                $@ $(call mkfs_target_dir,$(1))/
 endef
 
+# Don't use the mkfs.erofs builtin $SOURCE_DATE_EPOCH behavior
+define Image/mkfs/erofs
+       env -u SOURCE_DATE_EPOCH $(STAGING_DIR_HOST)/bin/mkfs.erofs -z$(EROFSCOMP) $(EROFSOPT) \
+               $@ $(call mkfs_target_dir,$(1))
+endef
+
 define Image/Manifest
        $(if $(CONFIG_USE_APK), \
                $(call apk,$(TARGET_DIR_ORIG)) list --quiet --manifest --no-network \
index da42f04a24fee48e466bad23d80b0b4a813d9d87..299dee92a7b6096b96ad52dad1d09342ae9f7cdb 100755 (executable)
@@ -18,6 +18,7 @@ sub target_config_features(@) {
                /^dt$/ and $ret .= "\tselect USES_DEVICETREE\n";
                /^dt-overlay$/ and $ret .= "\tselect HAS_DT_OVERLAY_SUPPORT\n";
                /^emmc$/ and $ret .= "\tselect EMMC_SUPPORT\n";
+               /^erofs$/ and $ret .= "\tselect USES_EROFS\n";
                /^ext4$/ and $ret .= "\tselect USES_EXT4\n";
                /^fpu$/ and $ret .= "\tselect HAS_FPU\n";
                /^gpio$/ and $ret .= "\tselect GPIO_SUPPORT\n";
index c2395923d4d3611f4d4dcd89b6d5da2244ab10ef..c0f3237ca9cfa78aa4f9c5ac56885a47e4c69df5 100644 (file)
@@ -69,6 +69,9 @@ config USES_JFFS2_NAND
 config USES_EXT4
        bool
 
+config USES_EROFS
+       bool
+
 config USES_TARGZ
        bool
 
index ec526e8e1dafda308c49a497a9b6a312558bb8fe..4e2e5ae36eb9efccf0f02ea36a82159fe4fdbc56 100644 (file)
@@ -1901,6 +1901,17 @@ CONFIG_ELFCORE=y
 CONFIG_EPOLL=y
 # CONFIG_EQUALIZER is not set
 # CONFIG_EROFS_FS is not set
+# CONFIG_EROFS_FS_DEBUG is not set
+# CONFIG_EROFS_FS_XATTR is not set
+# CONFIG_EROFS_FS_POSIX_ACL is not set
+# CONFIG_EROFS_FS_SECURITY is not set
+# CONFIG_EROFS_FS_BACKED_BY_FILE is not set
+# CONFIG_EROFS_FS_ZIP is not set
+# CONFIG_EROFS_FS_ZIP_DEFLATE is not set
+# CONFIG_EROFS_FS_ZIP_ZSTD is not set
+# CONFIG_EROFS_FS_ONDEMAND is not set
+CONFIG_EROFS_FS_PCPU_KTHREAD=y
+CONFIG_EROFS_FS_PCPU_KTHREAD_HIPRI=y
 # CONFIG_ET131X is not set
 CONFIG_ETHERNET=y
 # CONFIG_ETHOC is not set
index a8b5cabf88bfeb9dc8949ad4fa452ad914af4333..7bf434ef0ae19467cd1df3a5c64709575f79df94 100644 (file)
@@ -1840,6 +1840,15 @@ CONFIG_ELFCORE=y
 CONFIG_EPOLL=y
 # CONFIG_EQUALIZER is not set
 # CONFIG_EROFS_FS is not set
+# CONFIG_EROFS_FS_DEBUG is not set
+# CONFIG_EROFS_FS_XATTR is not set
+# CONFIG_EROFS_FS_POSIX_ACL is not set
+# CONFIG_EROFS_FS_SECURITY is not set
+# CONFIG_EROFS_FS_ZIP is not set
+# CONFIG_EROFS_FS_ZIP_DEFLATE is not set
+# CONFIG_EROFS_FS_ONDEMAND is not set
+CONFIG_EROFS_FS_PCPU_KTHREAD=y
+CONFIG_EROFS_FS_PCPU_KTHREAD_HIPRI=y
 # CONFIG_ET131X is not set
 CONFIG_ETHERNET=y
 # CONFIG_ETHOC is not set