EROFS 是在 Linux 4.19 中引入的只读文件系统。它支持压缩和去重,并针对读取性能进行了优化。
EROFS 与其他压缩文件系统之间的主要区别在于,它支持就地解压缩。压缩的数据存储在块末尾,以便能够解压缩到同一页面中。在 EROFS 映像中,超过 99% 的块能够使用此方案,因此无需在读取操作期间分配额外的页面。
EROFS 映像不必压缩。但是,使用压缩功能时,映像的大小平均缩小约 25%。在最高压缩级别下,映像可缩小多达 45%。
事实证明,无论是否压缩,EROFS 在随机和依序访问时间内都优于其他文件系统。
build 变更
如需启用 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 开始,虚拟 A/B 完全支持 EROFS。OTA 软件包生成器可以通过智能解压缩文件系统中的 LZ4 流来生成增量。只要源 build 和目标 build 使用相同的 LZ4 库,OTA 软件包的大小就相当于基于 EXT4 的 OTA。即使 src
或 dst
build 未使用相同的 LZ4 库,也应该只会对 OTA 大小产生轻微的影响。