EROFS

EROFS 是 Linux 4.19 中引入的唯讀檔案系統。它支援壓縮和重複資料刪除,並針對讀取性能進行了最佳化。

EROFS 與其他壓縮檔案系統之間的主要區別在於它支援就地解壓縮。壓縮資料儲存在區塊的末尾,以便可以將其解壓縮到同一頁中。在 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.

例如:

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 開始,虛擬 A/B 完全支援 EROFS。 OTA 套件產生器能夠透過智慧解壓縮檔案系統中的 LZ4 流來產生增量。只要來源建置和目標建置都使用相同的 LZ4 函式庫,OTA 套件的大小將與基於 EXT4 的 OTA 相當。即使 src/dst 建置不使用相同的 lz4 函式庫,它對 OTA 大小的影響也很小。