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