EROFS

EROFS ist ein schreibgeschütztes Dateisystem, das in Linux 4.19 eingeführt wurde. Es unterstützt Komprimierung und Deduplizierung und ist für die Leseleistung optimiert.

Der Hauptunterschied zwischen EROFS und anderen komprimierten Dateisystemen besteht darin, dass es die direkte Dekomprimierung unterstützt. Komprimierte Daten werden am Ende der Blöcke gespeichert, sodass sie auf derselben Seite dekomprimiert werden können. In einem EROFS-Image können mehr als 99 % der Blöcke dieses Schema verwenden, sodass bei Lesevorgängen keine zusätzlichen Seiten zugewiesen werden müssen.

EROFS-Bilder müssen nicht komprimiert werden. Bei Verwendung der Komprimierung sind die Bilder jedoch im Durchschnitt etwa 25 % kleiner. Bei der höchsten Komprimierungsstufe können Bilder bis zu 45 % kleiner sein.

Unabhängig davon, ob Komprimierung verwendet wird oder nicht, hat sich gezeigt, dass EROFS andere Dateisysteme sowohl bei den zufälligen als auch bei den sequentiellen Zugriffszeiten übertrifft.

Build-Änderungen

Um EROFS zu aktivieren, verwenden Sie den Dateisystemtyp „erofs“ in BoardConfig.mk . Zum Beispiel:

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-Änderungen

Der fstab-Typ ist „erofs“ und die einzige benötigte Mount-Option ist „ro“. Um weiterhin die Möglichkeit zu haben, EXT4-basierte GSI-Images zu testen, können Sie zwei fstab-Einträge für /system.

Zum Beispiel:

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

Kompressionsabstimmung

Standardmäßig komprimiert EROFS in Blöcke fester Größe. Durch die Aktivierung von Blöcken variabler Länge kann die Wirksamkeit der Kompression erheblich gesteigert werden. Dies kann durch das folgende Flag konfiguriert werden:

BOARD_EROFS_PCLUSTER_SIZE := 262144

Dadurch wird die maximale „PCluster“- oder Blockgröße variabler Länge auf 262144 Bytes festgelegt. Die Zahl muss ein Vielfaches von 4096 sein. Bei höheren Werten sind die Ergebnisse geringer, und je nach Gerätehardware können höhere Werte die Leseleistung verringern.

Komprimierung deaktivieren

Standardmäßig ist das Komprimierungsschema lz4hc . Um die Komprimierung zu deaktivieren, verwenden Sie:

BOARD_EROFS_COMPRESSOR := none

Dies kann auch pro Partition geändert werden, zum Beispiel:

BOARD_SYSTEMIMAGE_EROFS_COMPRESSOR := none

Deduplizierung

EROFS kann doppelte Blöcke mit dem folgenden Flag teilen:

BOARD_EROFS_SHARE_DUP_BLOCKS := true

Ab Android 13 muss die Komprimierung deaktiviert sein, um dieses Flag zu verwenden.

Auswirkungen auf OTAs

Ab Android 13 wird EROFS vollständig mit Virtual A/B unterstützt. Der OTA-Paketgenerator ist in der Lage, Deltas zu generieren, indem er die LZ4-Streams im Dateisystem intelligent dekomprimiert. Solange sowohl der Quell- als auch der Ziel-Build dieselbe LZ4-Bibliothek verwenden, ist das OTA-Paket in seiner Größe mit einem EXT4-basierten OTA vergleichbar. Auch wenn die src/dst-Builds nicht dieselbe lz4-Bibliothek verwenden, sollte dies nur geringe Auswirkungen auf die OTA-Größe haben.