EROFS

EROFS to system plików tylko do odczytu wprowadzony w Linuksie 4.19. Obsługuje kompresję i deduplikację oraz jest zoptymalizowany pod kątem wydajności odczytu.

Podstawowa różnica między EROFS a innymi skompresowanymi systemami plików polega na tym, że obsługuje dekompresję w miejscu. Skompresowane dane są przechowywane na końcach bloków, dzięki czemu można je zdekompresować na tej samej stronie. W obrazie EROFS ponad 99% bloków może korzystać z tego schematu, eliminując w ten sposób potrzebę przydzielania dodatkowych stron podczas operacji odczytu.

Obrazy EROFS nie muszą być kompresowane. Jednak przy zastosowaniu kompresji obrazy są średnio o około 25% mniejsze. Przy najwyższym poziomie kompresji obrazy mogą być nawet o 45% mniejsze.

Niezależnie od tego, czy stosuje się kompresję, czy nie, wykazano, że EROFS przewyższa inne systemy plików zarówno pod względem czasu dostępu losowego, jak i sekwencyjnego.

Budowanie zmian

Aby włączyć EROFS, użyj typu systemu plików "erofs" w BoardConfig.mk . Na przykład:

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

Zmiany w fstabie

Typ fstab to „erofs”, a jedyną potrzebną opcją montowania jest „ro”. Aby zachować możliwość testowania obrazów GSI opartych na EXT4, możesz użyć dwóch wpisów fstab dla /system.

Na przykład:

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

Strojenie kompresji

Domyślnie EROFS kompresuje do bloków o stałym rozmiarze. Skuteczność kompresji można znacznie zwiększyć, włączając bloki o zmiennej długości. Można to skonfigurować za pomocą następującej flagi:

BOARD_EROFS_PCLUSTER_SIZE := 262144

Ustawia to maksymalny „pcluster”, czyli rozmiar bloku o zmiennej długości, na 262144 bajty. Liczba musi być wielokrotnością liczby 4096. Przy wyższych wartościach zwroty maleją, a wyższe wartości mogą zmniejszyć wydajność odczytu w zależności od sprzętu urządzenia.

Wyłączanie kompresji

Domyślny schemat kompresji to lz4hc . Aby wyłączyć kompresję, użyj:

BOARD_EROFS_COMPRESSOR := none

Można to zmienić również dla poszczególnych partycji, na przykład:

BOARD_SYSTEMIMAGE_EROFS_COMPRESSOR := none

Deduplikacja

EROFS może udostępniać zduplikowane bloki z następującą flagą:

BOARD_EROFS_SHARE_DUP_BLOCKS := true

Począwszy od Androida 13, aby móc korzystać z tej flagi, należy wyłączyć kompresję.

Wpływ na OTA

Począwszy od Androida 13, EROFS jest w pełni obsługiwany przez Virtual A/B. Generator pakietów OTA jest w stanie generować delty poprzez inteligentną dekompresję strumieni LZ4 w systemie plików. Dopóki zarówno kompilacja źródłowa, jak i docelowa korzystają z tej samej biblioteki LZ4, pakiet OTA będzie porównywalny pod względem rozmiaru z OTA opartym na EXT4. Nawet jeśli kompilacje src/dst nie używają tej samej biblioteki lz4, powinno to mieć jedynie niewielki wpływ na rozmiar OTA.