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 相当。即使 src
或 dst
版本未使用相同的 LZ4 库,它也只会对 OTA 大小产生轻微影响。