EROFS

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 大小产生轻微的影响。