Ryotta's Basic

Storage
💿 Storage 검증완료

파일 시스템 개요

개요

파일 시스템은 운영체제가 저장 장치의 데이터를 구조화하여 관리하는 메커니즘이다. 디스크 블록 할당, 메타데이터 관리, 디렉토리 구조, 무결성 보장 등 스토리지 계층의 핵심 기능을 담당하며, 선택에 따라 시스템의 성능·안정성·유지보수성이 크게 달라진다. 현재 리눅스 환경에서는 ext4, XFS, Btrfs, ZFS가 주류를 이루며, 각각 다른 설계 철학과 트레이드오프를 가진다.

최근 NVMe SSD의 대역폭이 14GB/s(PCIe 5.0 x4 기준) 수준까지 높아지면서 파일 시스템의 I/O 처리 방식에도 변화가 일어나고 있다. 기존 HDD 중심 설계에서 벗어나 SSD의 높은 임의 읽기 성능, TRIM 지원, 낮은 레이턴시를 활용하는 방향으로 발전하는 중이다. 또한 데이터 무결성과 보호에 대한 요구가 강화되면서 CoW(Copy-on-Write), 계층적 체크섬, 스냅샷 네이티브 지원 같은 고급 기능의 중요성이 부각되고 있다.

핵심 개념

Inode (Index Node)

파일의 메타데이터를 저장하는 데이터 구조로, 파일 크기, 소유자(UID/GID), 권한, 타임스탬프(ctime, mtime, atime), 디스크 블록 위치 정보를 포함한다. 파일 이름은 inode에 저장되지 않으며, 디렉토리 엔트리에 파일명 → inode 매핑으로 저장된다.

  • ext4: inode당 최대 4개의 direct extent + extent tree로 확장 가능
  • Btrfs: inode 자체가 B-tree 아이템으로 저장되며, 136비트 키(64비트 object ID + 8비트 타입 + 64비트 오프셋)로 식별됨

Journaling (저널링)

파일 시스템 변경 사항을 먼저 순차적 저널 로그에 기록한 후 실제 디스크 블록에 반영하는 메커니즘이다. 시스템 크래ッシュ이나 전원 차단 시 데이터 일관성을 보장한다.

저널링 모드 설명 특징
data=writeback 메타데이터만 저널에 기록 성능 높지만 데이터 손실 위험
data=ordered 메타데이터 기록 전 데이터 먼저 디스크에 기록 안전성과 성능의 균형 (ext4 기본)
data=journal 메타데이터와 데이터 모두 저널에 기록 가장 안전하지만 성능 저하

Copy-on-Write (CoW)

데이터를 수정할 때 기존 블록을 덮어쓰지 않고, 새로운 블록에 변경된 데이터를 기록한 후 메타데이터 포인터를 업데이트하는 방식이다.

  • 장점: 기존 데이터 안전 유지, 쓰기 중 크래ッシュ 시 기존 데이터 손상 방지, 자동 버전 관리
  • 단점: 쓰기마다 새로운 블록 할당으로 인한 디스크 조각화, 쓰기 성능 저하, 쓰기 확산 증가
  • 적용 파일 시스템: Btrfs, ZFS (ext4와 XFS는 기본적으로 In-place 쓰기)

Extent (범위)

인접한 연속 디스크 블록들의 하나 이상의 그룹으로, 개별 블록 할당 정보 대신 범위 단위로 관리하여 메타데이터 효율성을 향상시킨다.

파일 시스템 최대 Extent 크기 특징
ext4 128MiB (4KiB 블록 기준) extent 기반 할당
XFS 가변 길이 B+ tree 할당
Btrfs extent 할당 트리 불필요한 재할당 최소화
ZFS 가변 (기본 128KB) 가변 블록 크기

Subvolume & Snapshot

  • Subvolume: 하나의 파일 시스템 내에서 독립적으로 마운트 가능한 별도의 POSIX 파일 네임스페이스. 물리적 볼륨이 아닌 논리적 구조로, Btrfs와 ZFS에서 네이티브 지원한다.
  • Snapshot: 특정 시점의 파일 시스템 상태를 복제한 읽기 전용 복사본. CoW 파일 시스템에서는 새로운 블록을 할당하지 않고 기존 블록을 공유하므로 즉시 생성 가능하며, 디스크 공간을 최소화 사용한다.

Checksum (체크섬)

데이터 무결성을 검증하기 위해 데이터의 해시 값을 계산하고 저장하는 메커니즘이다.

파일 시스템 범위 알고리즘 저장 방식
ext4 메타데이터 CRC-32C 별도 저장
XFS v5 메타데이터 리버스 매핑 B+tree 기반 별도 저장
Btrfs 데이터 + 메타데이터 CRC-32C, xxHash, SHA256, BLAKE2B checksum 트리 분리 저장
ZFS 데이터 + 메타데이터 (계층적) Fletcher-2, Fletcher-4, SHA-256 부모 블록 포인터에 저장

비교/분석

기능 비교표

기능 ext4 XFS Btrfs ZFS
저널링 메타데이터 메타데이터 CoW (로그 트리) CoW + ZIL
CoW 아니오 리플링(reflink) 선택 지원
체크섬 메타데이터만 메타데이터만 데이터+메타데이터 계층적 체크섬
스냅샷 LVM 필요 LVM 필요 네이티브 네이티브
서브볼륨 미지원 미지원 네이티브 네이티브 (데이터셋)
중복 제거 미지원 실험적 네이티브 네이티브
투명 압축 미지원 미지원 네이티브 네이티브
RAID mdadm 필요 mdadm 필요 네이티브 (0,1,10) 네이티브 (RAID-Z)
온라인 축소 미지원 미지원 지원 지원
커널 통합 완전 완전 완전 별도 모듈

성능 비교

워크로드 ext4 XFS Btrfs ZFS
대용량 파일 순차 I/O 양호 우수 양호 우수
병렬 I/O (다중 스레드) 보통 우수 보통 우수
대량 소규모 파일 생성 양호 우수 보통 보통
메타데이터 작업 양호 우수 보통 보통
스냅샷 생성 N/A LVM 오버헤드 즉시/경량 즉시/경량
메모리 사용 최소 최소 보통 높음

동작 원리

ext4 동작 원리

ext4는 extent 기반 할당과 지연 할당(Delayed Allocation)을 핵심으로 한다. 데이터가 실제로 디스크에 기록될 때까지 블록 할당을 연기하여 조각화를 감소시키며, 멀티블록 할당자로 여러 블록을 한번에 할당하여 연속성을 향상시킨다. 유연한 블록 그룹(flex_bg)은 여러 블록 그룹을 논리적으로 그룹화하여 비트맵과 inode 테이블의 확장을 지원한다.

XFS 동작 원리

XFS는 할당 그룹(Allocation Groups) 구조를 사용하여 파일 시스템을 동일한 크기의 선형 영역으로 분할한다. 각 그룹이 독립적으로 inode와 여유 공간을 관리하므로 병렬 I/O 성능이 향상된다. 가변 길이 extent와 B+ tree로 공간을 관리하며, 지연 할당을 통해 버퍼 캐시에 데이터를 저장할 때 블록 예약만 수행하고 실제 할당은 디스크 기록 시 수행한다.

Btrfs 동작 원리

Btrfs는 모든 데이터 구조(메타데이터, 파일 데이터, 할당 트리)가 동일한 CoW B-tree 구현체를 사용한다. B-tree 노드에 리프 연결이 없어 효율적인 CoW 스냅샷이 가능하며, 각 트리 노드에 참조 카운트(refcount)를 유지한다. 할당 트리(Extent Allocation Tree)는 파일 시스템 할당 맵 역할을 하며, 각 extent에 역참조(back-reference)를 포함하여 어떤 트리 노드/파일이 해당 extent를 사용하는지 추적한다.

ZFS 동작 원리

ZFS는 CoW 트랜잭션 모델을 기반으로 부모 블록 포인터에 자식 블록의 체크섬을 저장한다. 계층적 체크섬(Merkle tree 형태의 검증 구조)은 데이터 블록의 체크섬을 상위 블록 포인터로 전파해 루트까지 검증 사슬을 구성하며, 손상된 블록을 미러나 RAID-Z 복제본으로 복구하는 기반이 된다. ZIL/SLOG은 동기 쓰기 성능을 최적화하고, ARC/L2ARC는 RAM 및 SSD 기반 읽기 캐싱을 제공한다.

장단점

ext4

장점 단점
안정성과 성숙도 CoW, 스냅샷, 중복 제거 미지원
높은 호환성 기본 기술 기반의 점진적 개선
낮은 리소스 사용량 디스크 리사이징 불가 (확장만 가능)
대규모 디렉토리 지원

XFS

장점 단점
대용량 파일과 병렬 I/O 성능 In-place 축소 불가
대규모 스케일러빌리티 (8 EiB) 저널링 비활성화 불가
온라인 성장 가능 기본 스냅샷 미지원 (LVM 필요)
리플링(reflink) 지원

Btrfs

장점 단점
스냅샷, 서브볼륨, 복제 네이티브 RAID 5/6 "쓰기 홀" 문제
데이터 + 메타데이터 체크섬 일부 기능 안정화 미흡
투명 압축 및 중복 제거 높은 메모리 사용량
온라인 조각 모음, 볼륨 성장/축소

ZFS

장점 단점
최고 수준의 데이터 무결성 Linux 커널 미통합 (별도 모듈)
파일 시스템 + 볼륨 관리 통합 높은 메모리 요구 사항
스냅샷, 복제, 중복 제거 네이티브 복잡한 관리
자체 치유(self-healing) 풀 수준 조각 모음 부재

관련 기술

참고 문헌

  • The Linux Kernel Documentation: Filesystems
  • ext4 Wiki: https://ext4.wiki.kernel.org
  • XFS Documentation: https://docs.kernel.org/filesystems/xfs.html
  • Btrfs Wiki: https://btrfs.readthedocs.io
  • OpenZFS Documentation: https://openzfs.github.io/openzfs-docs
  • LWN.net: Filesystem articles and analysis

핵심 정리

  1. ext4는 안정성과 호환성을 우선으로 하는 범용 파일 시스템으로, 낮은 리소스 사용과 높은 호환성을 제공하지만 고급 기능이 부족하다.
  2. XFS는 대용량 파일과 병렬 I/O에 특화된 파일 시스템으로, 할당 그룹 구조를 통해 뛰어난 스케일러빌리티를 제공하며 RHEL의 기본 파일 시스템이다.
  3. Btrfs는 CoW 기반으로 스냅샷·서브볼륨·중복 제거·압축을 네이티브 지원하는 기능성 파일 시스템이지만, RAID 5/6 안정성 이슈가 존재한다.
  4. ZFS는 계층적 체크섬과 자체 치유 기능으로 최고 수준의 데이터 무결성을 보장하지만, Linux 커널 미통합과 높은 메모리 요구가 단점이다.
  5. 파일 시스템 선택 시 워크로드, 데이터 보호 수준, 리소스 제약, 관리 복잡도를 종합적으로 고려해야 한다.
파일 시스템 비교 개요

파일 시스템 구조 비교