EROFS

EROFS é um sistema de arquivos somente leitura introduzido no Linux 4.19. Ele suporta compactação e desduplicação e é otimizado para desempenho de leitura.

A principal diferença entre o EROFS e outros sistemas de arquivos compactados é que ele oferece suporte à descompactação local. Os dados compactados são armazenados no final dos blocos, para que possam ser descompactados na mesma página. Numa imagem EROFS, mais de 99% dos blocos são capazes de utilizar este esquema, eliminando assim a necessidade de alocar páginas extras durante as operações de leitura.

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

Quer use compactação ou não, o EROFS demonstrou superar outros sistemas de arquivos em tempos de acesso aleatórios e sequenciais.

Construir alterações

Para habilitar o EROFS, use o tipo de sistema de arquivos "erofs" em BoardConfig.mk . Por 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 no fstab

O tipo fstab é “erofs” e a única opção de montagem necessária é “ro”. Para manter a capacidade de testar imagens GSI baseadas em EXT4, você pode usar duas entradas fstab para /system.

Por 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 aumentada significativamente ao permitir blocos de comprimento variável. Isso pode ser configurado pelo seguinte sinalizador:

BOARD_EROFS_PCLUSTER_SIZE := 262144

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

Desativando 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

Desduplicação

EROFS pode compartilhar blocos duplicados com o seguinte sinalizador:

BOARD_EROFS_SHARE_DUP_BLOCKS := true

A partir do Android 13, a compactação deve ser desativada para usar esse sinalizador.

Impacto nas OTAs

A partir do Android 13, o EROFS é totalmente compatível com Virtual A/B. O gerador de pacotes OTA é capaz de gerar deltas descompactando de forma inteligente os fluxos LZ4 dentro do sistema de arquivos. Contanto que as compilações de origem e de destino usem a mesma biblioteca LZ4, o pacote OTA será comparável em tamanho a um OTA baseado em EXT4. Mesmo que as compilações src/dst não usem a mesma biblioteca lz4, isso deverá ter apenas um impacto menor no tamanho do OTA.