EROFS (Enhanced Read-Only File System)

EROFS는 Huawei가 주도해 Linux 메인라인에 병합된 읽기 전용(Read-Only) 압축 파일시스템(Filesystem)입니다. 본 문서에서는 pcluster 압축 모델과 in-place 압축 해제, 온디스크 포맷과 읽기 경로, `mkfs.erofs` 이미지 생성 전략, Android 시스템 파티션과 컨테이너(Container) 배포, v6.12 file-backed 마운트(Mount)와 fscache 폐기, v6.11~v6.18 최신 변화까지 상세히 설명합니다.

전제 조건: SquashFSVFS 문서를 먼저 읽으세요. EROFS는 SquashFS와 같은 읽기 전용 압축 파일시스템 계열이므로, SquashFS의 온디스크 구조와 블록 단위 압축 개념을 이해한 뒤 pcluster 모델의 차별점을 파악하면 학습 효율이 높습니다. OverlayFS 결합 예제까지 함께 확인하는 것을 권장합니다.
일상 비유: 이 개념은 미리 포장해 둔 택배 보관소와 비슷합니다. 평소에는 물품을 압축 포장해 두었다가(압축 이미지), 주문이 들어오면 필요한 상자(pcluster)만 열어 물품을 꺼냅니다(랜덤 읽기). 같은 물품을 다시 요청하면 책상 위에 꺼내 둔 것(Page Cache)을 바로 건네주므로, 첫 배달(cold-start)도 빠르게 처리할 수 있습니다.

핵심 요약

  • 읽기 전용 — 런타임 변경 불가, 무결성(Integrity)·재현성 확보
  • pcluster 압축 — logical block과 physical 압축 덩어리를 분리해 랜덤 읽기 비용 최소화
  • in-place 압축 해제 — 임시 버퍼를 최소화하여 cold-start 지연 감소
  • file-backed 마운트 — v6.12부터 루프백 블록 장치(Block Device) 없이 이미지 파일 직접 마운트
  • 주요 활용 — Android 시스템 파티션, 컨테이너 이미지, Live 미디어

단계별 이해

  1. 온디스크 구조 파악
    슈퍼블록(Superblock)과 메타데이터 레이아웃, 압축 단위가 어떻게 배치되는지 이해합니다.
  2. pcluster 매핑 이해
    logical read가 extent 배열을 거쳐 압축 덩어리로 연결되는 경로를 파악합니다.
  3. 이미지 생성
    mkfs.erofs로 압축 알고리즘(LZ4/LZMA/Zstd)과 클러스터링 정책을 선택합니다.
  4. 배포 구성
    dm-verity 무결성 검증과 OverlayFS 읽기-쓰기 레이어를 결합하고, file-backed 마운트 적용 여부를 검토합니다.

개요

EROFS는 2018년 Huawei가 개발을 시작해 2019년 Linux 5.4에 메인라인으로 병합된 읽기 전용 압축 파일시스템입니다. Android 시스템 파티션과 컨테이너 이미지 배포에서 빠른 cold-start와 안정적인 압축 해제를 목표로 설계되었으며, SquashFS와 같은 읽기 전용 압축 파일시스템이지만 pcluster 기반 압축으로 random read 손실을 최소화합니다.

Logical Read folio/page 단위 pcluster Mapping logical → compressed In-place Decompress 낮은 cold-start 지연
EROFS 논리적 읽기 흐름 — logical read가 pcluster 매핑을 거쳐 필요한 압축 덩어리만 in-place로 해제되므로 cold-start 지연을 낮출 수 있습니다.

활용 사례

설계 목표

EROFS는 모바일·임베디드 환경의 저장 장치 특성(느린 랜덤 읽기, 제한된 CPU/메모리)을 전제로 다음 목표에 우선순위를 둡니다.

pcluster 압축 모델

EROFS의 핵심은 logical block과 physical compressed extent(압축 익스텐트)를 분리하는 pcluster(physical cluster) 모델입니다. 파일의 논리적 읽기 단위(lcluster)와 실제 저장된 압축 덩어리(pcluster)를 extent 배열로 매핑하여, 작은 read에도 필요한 압축 덩어리만 해제하도록 메타데이터를 구성합니다.

Logical Read folio · page 단위 Extent Array logical → pcluster Compressed pcluster LZ4 · LZMA · Zstd In-place 압축 해제 임시 버퍼 최소화
pcluster 매핑 구조 — extent 배열이 논리적 읽기 단위를 압축 덩어리로 연결하며, 필요한 덩어리만 in-place로 해제합니다.

압축 알고리즘 선택

EROFS vs SquashFS 비교

EROFS와 SquashFS는 모두 읽기 전용 압축 파일시스템이지만, 설계 철학과 최적화 대상이 다릅니다. SquashFS는 범용 읽기 전용 압축 이미지에 초점을 맞추고, EROFS는 모바일/시스템 이미지에서의 cold-start 지연 최소화에 집중합니다.

SquashFS vs EROFS 핵심 설계 차이 SquashFS 블록 단위 압축 파일 → 128KB 블록 분할 → 개별 압축 프래그먼트 패킹 작은 파일 → 프래그먼트 블록에 통합 메타데이터 8KB 압축 inode/dir 테이블도 압축 저장 랜덤 읽기 블록 인덱스 → 해당 블록만 해제 강점: 범용성 · 5개 압축 알고리즘 · 높은 압축률 EROFS pcluster 압축 논리 블록 → pcluster 매핑 → 최소 해제 인라인 데이터 작은 파일 → inode에 직접 저장 (tail-packing) 고정 크기 inode 비압축 메타데이터 → O(1) 조회 In-place 압축 해제 bounce buffer 없이 페이지에 직접 해제 강점: 낮은 지연 · cold-start · 모바일 최적화 VS

상세 기능 비교

비교 항목SquashFSEROFS
메인라인 병합Linux 2.6.29 (2009)Linux 4.19 (2018)
압축 단위고정 블록 (4KB~1MB)가변 pcluster
작은 파일 최적화프래그먼트 패킹인라인 데이터 (tail-packing)
메타데이터 압축예 (8KB 블록)아니오 (고정 크기, 비압축)
압축 알고리즘gzip, lzo, xz, lz4, zstdlz4, lzma, zstd, deflate
inode 조회 복잡도O(log n) — 메타데이터 블록 탐색O(1) — NID 기반 직접 접근
NFS 지원예 (Export Table)예 (NID 기반)
xattr 지원예 (인라인 + 공유 모두)
sparse 파일예 (v4.0+)
FSDAX 지원아니오예 (v5.15+)
멀티 디바이스아니오예 (blob 디바이스)
주요 사용처Live OS, 임베디드, Snap, AppImageAndroid system, 컨테이너 (containerd)
커널 소스 위치fs/squashfs/fs/erofs/
선택 기준: 이미지 크기가 최우선이면 SquashFS(xz/zstd), cold-start 지연이 중요하면 EROFS(lz4hc), 압축률과 성능의 균형이 필요하면 EROFS(zstd)를 선택하세요.

온디스크 포맷

이미지는 슈퍼블록으로 시작하며, inode·디렉터리·익스텐트 등 메타데이터 영역과 압축 데이터 블록 영역이 뒤를 잇습니다. 슈퍼블록이 각 테이블의 위치와 블록 크기 정보를 제공하므로 마운트 초기에 전체 온디스크 구조를 파악할 수 있습니다.

Superblock 구조체(Struct)

struct erofs_super_block {
    __le32 magic;             /* EROFS_SUPER_MAGIC_V1 */
    __le32 checksum;
    __le32 feature_compat;
    __le32 feature_incompat;
    __le64 blocks;
    __le32 blkszbits;
    __le16 root_nid;
};

메타데이터와 익스텐트

EROFS는 데이터 영역을 익스텐트(extent) 단위로 관리합니다. 압축 파일은 논리적 클러스터(lcluster)가 물리적 클러스터(pcluster)로 매핑되는 구조이며, 이 매핑 정보가 extent 배열에 저장됩니다. 압축이 필요 없는 데이터는 비압축 익스텐트로 저장되는 경로도 존재하여, CPU 제약이 큰 환경에서는 온디스크 배치를 단순화할 수 있습니다.

읽기 경로와 in-place 압축 해제

일반 파일 읽기는 Page Cache를 거치며, 압축 파일은 folio 단위로 요청된 뒤 pcluster 매핑을 통해 해당 압축 덩어리만 해제됩니다.

generic_file_read_iter()
  -> erofs_read_folio()
    -> z_erofs_map_blocks_iter()   /* logical -> pcluster 매핑 */
      -> z_erofs_decompressqueue_work()
        -> z_erofs_lz4_decompress() / z_erofs_zstd_decompress()

in-place 압축 해제

in-place 압축 해제는 해제 결과를 별도 임시 페이지에 받은 뒤 Page Cache로 다시 복사하는 이중 복사를 피하고, 대상 folio 안에서 직접 해제하는 방식입니다. 임시 버퍼(Buffer) 사용량이 줄어들어 메모리 압박이 큰 모바일 환경에서 cold-start 지연과 메모리 사용량을 동시에 낮춥니다.

커널 설정

CONFIG_EROFS_FS=y
CONFIG_EROFS_FS_ZIP=y
CONFIG_EROFS_FS_ZIP_LZ4=y
CONFIG_EROFS_FS_ZIP_ZSTD=y
CONFIG_EROFS_FS_PCPU_KTHREAD=y

압축 해제 성능이 중요한 환경에서는 Per-CPU 커널 스레드 옵션(CONFIG_EROFS_FS_PCPU_KTHREAD)을 함께 활성화하여 디코드 워커(Worker)의 컨텍스트 스위치 비용을 줄일 수 있습니다.

mkfs.erofs 이미지 생성

erofs-utils가 제공하는 mkfs.erofs로 디렉터리를 EROFS 이미지로 변환합니다. 압축 알고리즘(-z)과 레벨, 클러스터링 정책 선택으로 용량과 성능을 조율할 수 있습니다.

# 이미지 생성
$ mkfs.erofs system.erofs ./rootfs

# 압축 알고리즘 지정
$ mkfs.erofs -z lz4hc system.erofs ./rootfs

# 마운트
$ sudo mount -t erofs system.erofs /mnt/erofs

성능 튜닝

튜닝 항목선택지권장 시나리오
압축 알고리즘LZ4 / LZ4HC / Zstd부팅 속도 우선은 LZ4, 용량 우선은 Zstd
클러스터링 정책random-friendly / compact앱 cold-start가 중요하면 random-friendly
CPU/IO 균형압축률 vs 해제비용저사양 CPU는 과도한 고압축 피하기

file-backed 마운트 (v6.12)

과거 nydus와 같은 컨테이너 lazy-loading 솔루션은 EROFS + fscache 백엔드 조합을 많이 사용했으나, 해당 경로는 deprecated 방향으로 선언되었습니다. 커널 6.12에서 EROFS는 루프백 블록 장치 없이 이미지 파일을 직접 마운트하는 file-backed 마운트를 정식 지원하며, -o fsid= 기반으로 재편되었습니다. 이 기능은 컨테이너 이미지 수천 개를 단일 호스트에서 실행하는 환경에서 루프백 장치의 복잡한 생명주기 관리를 제거합니다.

컨테이너 런타임 containerd · nerdctl · nydus-snapshotter fscache 백엔드 (기존 경로) deprecated — 신규 배포에서는 사용 금지 file-backed 마운트 (v6.12+) -o fsid= — 루프백 장치 불필요 EROFS 파일시스템 마운트 커널 EROFS 직접 마운트
EROFS 컨테이너 마운트 경로 — 기존 fscache 백엔드는 폐기 방향이며, v6.12+ file-backed 마운트(루프백 장치 불필요)가 대체 수단입니다.
# EROFS file-backed 마운트 예시 (커널 6.12 이상)
mount -t erofs -o loop image.erofs /mnt/erofs   # 루프 없이도 가능
# 또는 직접 파일 경로 지정 방식 (컨테이너 런타임에서 활용)

커널 6.12부터: EROFS file-backed 마운트 정식 지원. EROFS-over-fscache는 더 이상 권장되지 않습니다.

Android·컨테이너 배포 파이프라인

Android dynamic partition과 컨테이너 배포에서 EROFS는 dm-verity 무결성 검증과 OverlayFS 읽기-쓰기 레이어와 함께 구성됩니다.

# 1) rootfs 준비 및 EROFS 이미지 생성
$ mkfs.erofs -z lz4hc system.erofs ./out/rootfs

# 2) dm-verity 서명 단계 결합
$ veritysetup format system.erofs system.hash

# 3) 부팅 시 read-only 마운트 + OverlayFS 결합
$ sudo mount -t erofs /dev/block/system /mnt/lower
$ sudo mount -t overlay overlay \
    -o lowerdir=/mnt/lower,upperdir=/data/upper,workdir=/data/work \
    /mnt/rootfs

실사용 채택 — Fedora 42 라이브 미디어 전환

Fedora 42(커널 6.14 기반, 2025년 출시)는 라이브 미디어의 루트 파일시스템을 SquashFS에서 EROFS로 전환했습니다. KDE Desktop, Xfce, LXQt, COSMIC, Budgie 등 주요 데스크톱 배포판과 Fedora CoreOS 라이브 미디어가 모두 포함됩니다.

최신 변화 (v6.11~v6.18)

Large Folio & 압축 파일 (v6.11)

v6.11에서 EROFS는 압축 파일 경로에도 large folio를 본격적으로 적용하여, pcluster(physical cluster) 단위 디코드 병렬성과 in-place 압축 해제 효율을 모두 끌어올렸습니다.

압축 알고리즘 확장 (zstd·deflate)

EROFS는 zstd를 v5.16부터 안정적으로 지원하며, v6.13에서 deflate(zlib) 병렬 압축/해제 경로가 정리되었습니다. 이미지 제작 시 mkfs.erofs 옵션으로 알고리즘과 레벨을 선택할 수 있습니다.

/* 이미지 생성 예시 (userspace 명령) */
mkfs.erofs -z zstd,19 image.erofs rootfs/
mkfs.erofs -z deflate,9 image.erofs rootfs/

48비트 블록 주소 및 AI 데이터셋 지원 (v6.15)

커널 6.15에서 EROFS는 대규모 AI 모델 훈련 데이터셋과 같은 대용량 이미지 처리를 위한 48비트 블록 주소(48-bit block addressing)가 도입되었습니다. 기존 32비트 블록 주소(최대 약 4TB)의 한계를 넘어 훨씬 큰 이미지를 지원합니다.

커널 6.15부터: mkfs.erofs의 48비트 블록 주소 옵션으로 4TB 이상의 대용량 EROFS 이미지 생성이 가능합니다.

Intel QAT 하드웨어 가속 및 fsoffset 마운트 옵션 (v6.16)

커널 6.16에서는 성능과 유연성을 위한 두 가지 주요 기능이 추가되었습니다.

# fsoffset 마운트 옵션 예시 (커널 6.16 이상)
# EROFS 이미지가 파일의 오프셋 4096에서 시작하는 경우
mount -t erofs -o fsoffset=4096 image.bin /mnt/erofs

커널 6.16부터: Intel QAT 가속 DEFLATE 해제 및 fsoffset 마운트 옵션 지원.

메타데이터 압축 (v6.17)

커널 6.17에서 EROFS는 선택적 메타데이터 압축을 지원합니다. 이 기능은 이미 압축된 데이터 블록뿐 아니라 inode/디렉터리/인덱스 테이블 등 메타데이터 영역도 압축하여 이미지 전체 크기를 더욱 줄입니다.

커널 6.17부터: 선택적 메타데이터 압축 지원. 이미지 크기 추가 절감 가능.

보안 강화 (v6.18)

커널 6.18에서는 악의적으로 조작된 EROFS 이미지를 마운트할 때 발생할 수 있는 시스템 크래시(crash)나 무한 루프(infinite loop)를 방지하는 하드닝(hardening) 개선이 병합되었습니다.

트러블슈팅

마운트 실패: unknown filesystem type 'erofs'가 나오면 커널 설정(CONFIG_EROFS_FS)과 모듈 로드 여부를 먼저 확인하세요.
$ grep EROFS /boot/config-$(uname -r)
$ sudo modprobe erofs
$ dmesg | grep -i erofs

참고자료

공식 문서 및 커널 소스

LWN.net 기술 기사

다음 학습:
  • SquashFS — 같은 읽기 전용 압축 파일시스템 계열의 비교 대상
  • OverlayFS — EROFS + RW 레이어
  • VFS — 파일시스템 인터페이스
  • Block I/O — 블록 장치 관리
필수 관련 문서:
  • SquashFS 파일시스템 — 동일 계열의 읽기 전용 압축 파일시스템으로, EROFS vs SquashFS 비교 기준이 되는 문서
  • VFS (Virtual Filesystem Switch) — 파일시스템 인터페이스와 마운트 경로의 기반
  • OverlayFS — EROFS 하위 레이어 위에 읽기-쓰기 레이어를 제공하는 결합 방식
참고 문서: