EROFS は、Linux 4.19 で導入された読み取り専用のファイル システムです。圧縮と重複除去をサポートし、読み取り用にパフォーマンスが最適化されています。
他の圧縮ファイル システムとの主な違いは、インプレース解凍をサポートしている点です。圧縮されたデータがブロックの最後に保存されるため、同じページに解凍できます。EROFS イメージでは、99% を超えるブロックでこの方式を使用できるため、読み取りオペレーション中に追加のページを割り当てる必要がなくなります。
EROFS イメージの圧縮は必須ではありません。ただし、圧縮すると平均で約 25% 小さくなります。上限レベルまで圧縮できると、最大で 45% 小さくなります。
EROFS は、圧縮を使用しているかどうかに関係なく、ランダム アクセス時間とシーケンシャル アクセス時間の両方で他のファイル システムより優れていることがわかっています。
ビルドの変更
EROFS を有効にするには、BoardConfig.mk
でファイルシステム タイプ erofs
を使用します。例:
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
のみです。EXT4 ベースの GSI イメージを引き続きテストできるようにするには、/system.
の 2 つの fstab エントリを使用します。
例:
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
(可変長ブロックサイズ)の上限が 262,144 バイトに設定されます。4096 の倍数を指定する必要があります。値を大きくするほど効果は逓減します。デバイス ハードウェアによっては、値を大きくするほど読み取りパフォーマンスが低下することがあります。
圧縮を無効にする
デフォルトの圧縮方式は lz4hc
です。圧縮を無効にするには次のコマンドを使用します。
BOARD_EROFS_COMPRESSOR := none
次のように、パーティションごとに変更することもできます。
BOARD_SYSTEMIMAGE_EROFS_COMPRESSOR := none
重複除去
EROFS では、次のフラグを使用して重複ブロックを共有できます。
BOARD_EROFS_SHARE_DUP_BLOCKS := true
Android 13 以降でこのフラグを使用するには、圧縮を無効にする必要があります。
OTA への影響
Android 13 以降では、EROFS が仮想 A/B で完全にサポートされています。OTA パッケージ生成ツールは、ファイル システム内の LZ4 ストリームをインテリジェントに解凍することによりデルタを生成できます。ソースビルドとターゲット ビルドで同じ LZ4 ライブラリを使用している限り、OTA パッケージのサイズは EXT4 ベースの OTA と同等になります。src
ビルドと dst
ビルドで同じ LZ4 ライブラリを使用していない場合でも、OTA サイズへの影響はそれほど大きくありません。