EROFS is a read-only filesystem introduced in Linux 4.19. It supports compression and deduplication, and is optimized for read performance.
The primary difference between EROFS and other compressed filesystems is that it supports in-place decompression. Compressed data is stored at the end of blocks, so that it can be decompressed into the same page. In an EROFS image, more than 99% of blocks are able to use this scheme, thus eliminating the need to allocate extra pages during read operations.
EROFS images do not have to be compressed. When using compression, however, images are around 25% smaller on average. At the highest levels of compression, images can be up to 45% smaller.
Whether using compression or not, EROFS has been shown to outperform other filesystems in both random and sequential access times.
To enable EROFS, use the filesystem type "erofs" in
BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE := erofs BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE := erofs BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE := erofs BOARD_SYSTEM_EXTIMAGE_FILE_SYSTEM_TYPE := erofs BOARD_VENDOR_DLKMIMAGE_FILE_SYSTEM_TYPE := erofs BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE := erofs
The fstab type is "erofs", and the only mount option needed is "ro". To keep the
ability to test EXT4-based GSI images, you can use two fstab entries for
system /system erofs ro wait,slotselect,avb=vbmeta_system,logical,first_stage_mount system /system ext4 ro,barrier=1 wait,slotselect,avb=vbmeta_system,logical,first_stage_mount
By default, EROFS compresses into fixed-size blocks. Compression efficacy can be increased significantly by enabling variable-length blocks. This can be configured by the following flag:
BOARD_EROFS_PCLUSTER_SIZE := 262144
This sets the maximum "pcluster", or variable length block size, to 262144 bytes. The number must be a multiple of 4096. There are diminishing returns at higher values, and higher values can decrease read performance depending on the device hardware.
By default, the compression scheme is
lz4hc. To disable compression, use:
BOARD_EROFS_COMPRESSOR := none
This can be changed on a per-partition basis as well, for example:
BOARD_SYSTEMIMAGE_EROFS_COMPRESSOR := none
EROFS can share duplicate blocks with the following flag:
BOARD_EROFS_SHARE_DUP_BLOCKS := true
As of Android 13, compression must be disabled to use this flag.
Impact on OTAs
As of Android 13, EROFS is fully supported with Virtual A/B. The OTA package generator is able to generate deltas by intelligently decompressing the LZ4 streams within the filesystem. As long as both the source and target builds use the same LZ4 library, the OTA package will be comparable in size to an EXT4-based OTA. Even if the src/dst builds don't use the same lz4 library, it should only have a minor impact on OTA size.