Enabling EROFS Support for an Android ROM with Kernel 4.9

Enabling EROFS Support for an Android ROM with Kernel 4.9

KaguraiYoRoy
25-12-2024 / 0 Comments / 308 Views / Checking if indexed by search engines...

Foreword

As everyone knows, I'm a long-standing Mi 8 Pro (Under-Screen Fingerprint Edition) holdout
I've always wanted to port erofs to this device (please search online for what erofs is). But after some research, I found out that erofs was merged into the Linux kernel in version 5.10, which means I have to manually integrate it into our 4.9 kernel.

Materials Needed

Let's Start

Setting up the Android ROM build environment won't be covered here, as there are plenty of guides online. Download the ROM source, device tree, and kernel source, and place them in the correct locations.

Adding EROFS Support to the Kernel

The code changes were picked from ReallySnow's msm-4.9 kernel (Thanks to ReallySnow for the support!). You can refer to these branches:

Before picking the commits, you need to resolve conflicts in the lz4 compression code. For the detailed relation chain, refer to:

I tried to submit these changes to LineageOS official, but obviously, they weren't merged x

After picking the changes, enable erofs support in the kernel's defconfig file:
Open $KERNEL_SOURCE/arch/arm64/configs/vendor/xiaomi/mi845_defconfig and add: CONFIG_EROFS_FS=y:

commit 7ae5caab2c15982b3d3821c97e2f2e6126ca1281 (HEAD -> erofs, refs/published/erofs)
Author: KaguraiYoRoy <neko@yori.moe>
Date:   Tue Dec 24 22:49:07 2024 +0800

    arch: arm64: configs: mi845: Enable CONFIG_EROFS_FS

    Change-Id: Ie387b03bde54700d73ccf19f0baf4db62526cc8f

diff --git a/arch/arm64/configs/vendor/xiaomi/mi845_defconfig b/arch/arm64/configs/vendor/xiaomi/mi845_defconfig
index 7684be360d98..69ea580fdb11 100644
--- a/arch/arm64/configs/vendor/xiaomi/mi845_defconfig
+++ b/arch/arm64/configs/vendor/xiaomi/mi845_defconfig
@@ -651,3 +651,4 @@ CONFIG_SOUNDWIRE_WCD_CTRL=y
 CONFIG_WCD9XXX_CODEC_CORE=y
 CONFIG_WCD_DSP_GLINK=y
 CONFIG_WCD_SPI_AC=y
+CONFIG_EROFS_FS=y
\ No newline at end of file

Modifying Partition Filesystems and Fstab

Open the board configuration file in the device tree and change the filesystem type for the partitions you want to convert to erofs. The example configuration file is located at $WORKING_DIR/device/xiaomi/sdm845-common/BoardConfigCommon.mk:

commit 0fce86fb40ca637a8563bef6192afaea1658c881 (HEAD -> erofs, refs/published/erofs)
Author: KaguraiYoRoy <neko@yori.moe>
Date:   Tue Dec 24 23:37:50 2024 +0800

    sdm845-common: Switch to erofs

    Change-Id: I9a8d6de4dcb79cd6bc177451ce3cbc4682748501

diff --git a/BoardConfigCommon.mk b/BoardConfigCommon.mk
index cf73d39..700592f 100644
--- a/BoardConfigCommon.mk
+++ b/BoardConfigCommon.mk
@@ -78,11 +78,11 @@ BOARD_CACHEIMAGE_PARTITION_SIZE := 268435456
 BOARD_USERDATAIMAGE_PARTITION_SIZE := 57453555712

 BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := ext4
-BOARD_ODMIMAGE_FILE_SYSTEM_TYPE := ext4
+BOARD_ODMIMAGE_FILE_SYSTEM_TYPE := erofs
 BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE := ext4
 BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE := ext4
 BOARD_SYSTEM_EXTIMAGE_FILE_SYSTEM_TYPE := ext4
-BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE := ext4
+BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE := erofs

 BOARD_FLASH_BLOCK_SIZE := 262144 # (BOARD_KERNEL_PAGESIZE * 64)

Modify the device's fstab file, located here at $WORKING_DIR/device/xiaomi/equuleus/rootdir/fstab.qcom. Change the filesystem type for the relevant partitions to erofs, and reduce the mount parameters to just ro:

commit d66bfc8fe722f7368ef56835d35fb88b904e10fb (HEAD -> erofs, refs/published/erofs)
Author: KaguraiYoRoy <neko@yori.moe>
Date:   Tue Dec 24 23:40:08 2024 +0800

    equuleus: Update fstab for erofs

    Change-Id: I814eab1dd77cf2c184ebd398cc4914785bc37ad6

diff --git a/rootdir/etc/fstab.qcom b/rootdir/etc/fstab.qcom
index 7aca90a..685ec84 100644
--- a/rootdir/etc/fstab.qcom
+++ b/rootdir/etc/fstab.qcom
@@ -6,8 +6,8 @@
 system                                       /system                 ext4    ro,barrier=1,discard                                                                              wait,logical,first_stage_mount
 system_ext                                   /system_ext             ext4    ro,barrier=1,discard                                                                              wait,logical,first_stage_mount
 product                                      /product                ext4    ro,barrier=1,discard                                                                              wait,logical,first_stage_mount
-vendor                                       /vendor                 ext4    ro,barrier=1,discard                                                                              wait,logical,first_stage_mount
-odm                                          /odm                    ext4    ro,barrier=1,discard                                                                              wait,logical,first_stage_mount
+vendor                                       /vendor                 erofs   ro                                                                                                wait,logical,first_stage_mount
+odm                                          /odm                    erofs   ro                                                                                                wait,logical,first_stage_mount
 /dev/block/bootdevice/by-name/userdata       /data                   ext4    noatime,nosuid,nodev,barrier=0,noauto_da_alloc                                                    latemount,wait,check,fileencryption=ice,quota
 /dev/block/bootdevice/by-name/modem          /vendor/firmware_mnt    vfat    ro,shortname=lower,uid=0,gid=1000,dmask=227,fmask=337,context=u:object_r:firmware_file:s0         wait
 /dev/block/bootdevice/by-name/dsp            /vendor/dsp             ext4    ro,nosuid,nodev,barrier=1                                                                         wait

Finally, build and flash the ROM. If all goes well, it should boot into the system.

Important Notes

  • LineageOS official has implemented Dynamic Partition for my device model. The device tree modifications described above might not be suitable for your device.
  • erofs is a read-only filesystem. If you plan to flash Gapps later, DO NOT convert the system, system_ext, and product partitions.

Frequently Asked Questions

  • Booting into Fastboot mode: Check if the fstab modifications are correct.
0

Comments (0)

Cancel