ЭРОФС

EROFS — файловая система, доступная только для чтения, представленная в Linux 4.19. Она поддерживает сжатие и дедупликацию, а также оптимизирована для чтения.

Основное отличие EROFS от других сжатых файловых систем заключается в поддержке распаковки на месте. Сжатые данные сохраняются в конце блоков, что позволяет распаковать их в ту же страницу. В образе EROFS более 99% блоков могут использовать эту схему, что устраняет необходимость в выделении дополнительных страниц при чтении.

Изображения EROFS не обязательно сжимать. Однако при использовании сжатия изображения в среднем уменьшаются примерно на 25%. При максимальной степени сжатия изображения могут уменьшиться до 45%.

Независимо от того, использует ли EROFS сжатие или нет, она превосходит другие файловые системы по времени как случайного, так и последовательного доступа.

Изменения сборки

Чтобы включить EROFS, используйте тип файловой системы erofs в BoardConfig.mk . Например:

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

Тип файла fstab — erofs , а единственный необходимый параметр монтирования — ro . Чтобы сохранить возможность тестирования образов GSI на базе EXT4, можно использовать две записи fstab для /system.

Например:

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

Настройка сжатия

По умолчанию EROFS сжимает данные в блоки фиксированного размера. Эффективность сжатия можно значительно повысить, включив блоки переменной длины. Это можно настроить с помощью следующего флага:

BOARD_EROFS_PCLUSTER_SIZE := 262144

Это устанавливает максимальный размер блока PCLUSTER (переменной длины) равным 262144 байтам. Число должно быть кратно 4096. При более высоких значениях наблюдается убывающая отдача, и более высокие значения могут снизить производительность чтения в зависимости от аппаратного обеспечения устройства.

Отключить сжатие

По умолчанию используется схема сжатия lz4hc . Чтобы отключить сжатие, используйте:

BOARD_EROFS_COMPRESSOR := none

Это также можно изменить для каждого раздела отдельно, например:

BOARD_SYSTEMIMAGE_EROFS_COMPRESSOR := none

Дедупликация

EROFS может совместно использовать дублирующиеся блоки с помощью следующего флага:

BOARD_EROFS_SHARE_DUP_BLOCKS := true

Начиная с Android 13, для использования этого флага необходимо отключить сжатие.

Влияние на OTA

Начиная с Android 13, EROFS полностью поддерживается Virtual A/B. Генератор OTA-пакетов может генерировать дельта-файлы, интеллектуально распаковывая потоки LZ4 в файловой системе. Если исходная и целевая сборки используют одну и ту же библиотеку LZ4, размер OTA-пакета сопоставим с размером OTA-пакета на базе EXT4. Даже если сборки src или dst не используют одну и ту же библиотеку LZ4, это должно оказать лишь незначительное влияние на размер OTA-пакета.