EROFS

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 サイズへの影響はそれほど大きくありません。