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。即使 srcdst build 未使用相同的 LZ4 库,也应该只会对 OTA 大小产生轻微的影响。