EROFS

EROFS é um sistema de arquivos somente leitura introduzido no Linux 4.19. Ele oferece suporte compactação e eliminação de duplicação e está otimizado para desempenho de leitura.

A principal diferença entre o EROFS e outros sistemas de arquivos compactados é que oferece suporte à descompactação no local. Os dados compactados são armazenados no fim blocos, para que possa ser descompactado na mesma página. Em uma imagem de EROFS, mais de 99% dos blocos conseguem usar esse esquema, eliminando assim a necessidade para alocar páginas extras durante as operações de leitura.

As imagens EROFS não precisam ser compactadas. No entanto, ao usar a compactação, são cerca de 25% menores, em média. Nos níveis mais altos de compactação, as imagens podem ser até 45% menores.

Seja usando ou não compactação, o EROFS tem um desempenho melhor do que outros sistemas de arquivos em tempos de acesso aleatórios e sequenciais.

Mudanças no build

Para ativar o EROFS, use o sistema de arquivos do tipo erofs em BoardConfig.mk. Exemplo:

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

mudanças fstab

O tipo fstab é erofs, e a única opção de montagem necessária é ro. Para manter teste imagens GSI baseadas em EXT4, é possível usar duas entradas fstab para /system.

Exemplo:

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

Ajuste de compressão

Por padrão, o EROFS é compactado em blocos de tamanho fixo. A eficácia da compressão pode ser aumentou significativamente ativando blocos de tamanho variável. Isso pode ser configurado pela seguinte sinalização:

BOARD_EROFS_PCLUSTER_SIZE := 262144

Isso define o PCLUSTER máximo, ou tamanho de bloco de comprimento variável, como 262.144. bytes. O número precisa ser um múltiplo de 4.096. Há retornos decrescentes valores mais altos e valores mais altos podem diminuir o desempenho de leitura, dependendo ao hardware do dispositivo.

Desativar compactação

Por padrão, o esquema de compactação é lz4hc. Para desativar a compactação, use:

BOARD_EROFS_COMPRESSOR := none

Isso também pode ser alterado por partição, por exemplo:

BOARD_SYSTEMIMAGE_EROFS_COMPRESSOR := none

Eliminação de duplicação

O EROFS pode compartilhar blocos duplicados com a seguinte flag:

BOARD_EROFS_SHARE_DUP_BLOCKS := true

No Android 13 e versões mais recentes, a compactação precisa estar desativada para usar essa flag.

Impacto nas OTAs

No Android 13 e versões mais recentes, o EROFS tem suporte total ao A/B virtual. O pacote OTA pode gerar deltas descompactando de forma inteligente o LZ4 no sistema de arquivos. Contanto que os builds de origem e de destino usem da mesma biblioteca LZ4, o pacote OTA é comparável em tamanho a uma OTA baseado em EXT4. Mesmo que os builds src ou dst não usem o mesmo LZ4 ela só terá um pequeno impacto no tamanho do OTA.