O EROFS é um sistema de arquivos somente leitura introduzido no Linux 4.19. Ele oferece suporte à compactação e à eliminação de duplicação e é 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 EROFS, mais de 99% dos blocos podem usar esse esquema, eliminando a necessidade de 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.
Com ou sem compressão, o EROFS tem um desempenho melhor 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 a
capacidade de testar imagens GSI baseadas em EXT4, use 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 compactação
Por padrão, a EROFS compacta 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 com a seguinte flag:
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 em
valores mais altos, e valores mais altos podem diminuir a performance de leitura, dependendo do
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
A partir do Android 13, o EROFS tem suporte total ao A/B virtual. O gerador de pacotes
OTA pode gerar deltas descompactando de forma inteligente os fluxos LZ4
no sistema de arquivos. Contanto que os builds 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 os builds src
ou dst
não usem a mesma biblioteca LZ4,
isso só terá um impacto pequeno no tamanho do OTA.