EROFS

EROFS 是一种在 Linux 4.19 中引入的只读文件系统。它支持压缩和重复数据删除,并针对读取性能进行了优化。

EROFS 与其他压缩文件系统之间的主要区别在于,它支持就地解压缩。压缩数据存储在块的末尾,以便可以将其解压缩到同一页面中。在 EROFS 映像中,超过 99% 的块能够使用此方案,从而无需在读取操作期间分配额外的页面。

EROFS 映像不必压缩。但是,使用压缩时,映像平均会小 25% 左右。在最高压缩级别下,映像最多可以小 45%。

无论是否使用压缩,EROFS 在随机和顺序访问时间方面都优于其他文件系统。

构建变更

要启用 EROFS,请在 BoardConfig.mk 中使用文件系统类型 erofs。例如

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

fstab 变更

fstab 类型为 erofs,唯一需要的挂载选项是 ro。为了保持测试基于 EXT4 的 GSI 映像的能力,您可以为 /system. 使用两个 fstab 条目。

例如

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

压缩调整

默认情况下,EROFS 将压缩为固定大小的块。通过启用可变长度块,可以显着提高压缩效率。可以通过以下标志进行配置

BOARD_EROFS_PCLUSTER_SIZE := 262144

这会将最大 PCLUSTER 或可变长度块大小设置为 262144 字节。该数字必须是 4096 的倍数。在更高的值时,收益递减,并且更高的值可能会降低读取性能,具体取决于设备硬件。

禁用压缩

默认情况下,压缩方案为 lz4hc。要禁用压缩,请使用

BOARD_EROFS_COMPRESSOR := none

也可以按分区更改此设置,例如

BOARD_SYSTEMIMAGE_EROFS_COMPRESSOR := none

重复数据删除

EROFS 可以使用以下标志共享重复块

BOARD_EROFS_SHARE_DUP_BLOCKS := true

从 Android 13 开始,必须禁用压缩才能使用此标志。

对 OTA 的影响

从 Android 13 开始,Virtual A/B 完全支持 EROFS。OTA 软件包生成器可以通过智能地解压缩文件系统中的 LZ4 流来生成增量。只要源版本和目标版本都使用相同的 LZ4 库,OTA 软件包的大小就与基于 EXT4 的 OTA 相当。即使 srcdst 版本未使用相同的 LZ4 库,它也只会对 OTA 大小产生轻微影响。