ЭРОФС

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.