EROF

EROFS è un file system di sola lettura introdotto in Linux 4.19. Supporta la compressione e la deduplica ed è ottimizzato per le prestazioni di lettura.

La differenza principale tra EROFS e altri file system compressi è che supporta la decompressione in situ. I dati compressi vengono archiviati alla fine dei blocchi in modo che possano essere decompressi nella stessa pagina. In un'immagine EROFS, più del 99% dei blocchi può utilizzare questo schema, eliminando così la necessità di allocare pagine aggiuntive durante le operazioni di lettura.

Le immagini EROFS non devono essere compresse. Tuttavia, se utilizzi la compressione, le immagini sono in media circa il 25% più piccole. Ai massimi livelli di compressione, le immagini possono essere ridotte fino al 45%.

Indipendentemente dall'utilizzo o meno della compressione, è stato dimostrato che EROFS supera gli altri sistemi di file sia nei tempi di accesso casuali che sequenziali.

Modifiche alla compilazione

Per attivare EROFS, utilizza il tipo di file system erofs in BoardConfig.mk. Ad esempio:

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

Modifiche a fstab

Il tipo fstab è erofs e l'unica opzione di montaggio necessaria è ro. Per mantenere la possibilità di testare le immagini GSI basate su EXT4, puoi utilizzare due voci fstab per /system.

Ad esempio:

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

Ottimizzazione della compressione

Per impostazione predefinita, EROFS si comprime in blocchi di dimensioni fisse. L'efficacia della compressione può essere aumentata in modo significativo abilitando blocchi di lunghezza variabile. Questo può essere configurato tramite il seguente flag:

BOARD_EROFS_PCLUSTER_SIZE := 262144

In questo modo, il valore PCLUSTER massimo, ovvero la dimensione del blocco con lunghezza variabile, viene impostato su 262144 byte. Il numero deve essere un multiplo di 4096. I risultati diminuiscono con valori più elevati e questi valori possono ridurre le prestazioni di lettura a seconda dell'hardware del dispositivo.

Disattiva la compressione

Per impostazione predefinita, lo schema di compressione è lz4hc. Per disattivare la compressione, utilizza:

BOARD_EROFS_COMPRESSOR := none

Questo valore può essere modificato anche in base alla partizione, ad esempio:

BOARD_SYSTEMIMAGE_EROFS_COMPRESSOR := none

Deduplicazione

EROFS può condividere blocchi duplicati con il seguente flag:

BOARD_EROFS_SHARE_DUP_BLOCKS := true

A partire da Android 13, la compressione deve essere disattivata per utilizzare questo flag.

Impatto sulle OTA

A partire da Android 13, EROFS è completamente supportato con il ripristino A/B virtuale. Il generatore di pacchetti OTA può generare delta decomprimendo in modo intelligente gli stream LZ4 all'interno del file system. Purché le build di origine e di destinazione utilizzino la stessa libreria LZ4, le dimensioni del pacchetto OTA sono paragonabili a quelle di un pacchetto OTA basato su EXT4. Anche se le build src o dst non utilizzano la stessa libreria LZ4, l'impatto sulle dimensioni dell'OTA dovrebbe essere minimo.