[임베디드기사 실기 20부작 12편] ZONE_NORMAL, MTD, JFFS2, Btrfs, MBR로 이해하는 Linux 저장장치와 파일시스템
앞선 연재에서는 SRAM·DRAM과 가상 메모리, Paging, Segmentation, Thrashing, Working Set을 통해 “메모리를 어떻게 관리하는가”를 살펴봤습니다. 이번 편에서는 한 단계 내려가, 임베디드 Linux에서 실제 데이터를 어디에 저장하고 어떻게 나누며, 부팅과 파일시스템이 어떤 구조로 이어지는지를 살펴보겠습니다.
임베디드 Linux 저장 구조는 크게 메모리 관리 영역과 비휘발성 저장장치 영역을 구분해서 이해하면 쉽습니다.
RAM 측: ZONE_DMA / ZONE_NORMAL / ZONE_HIGHMEM 등
Flash 측: Raw NAND/NOR → MTD → Partition → JFFS2·UBIFS 등 파일시스템
Disk/Block 측: MBR 또는 GPT → Partition → ext4·Btrfs 등 파일시스템
즉 ZONE_NORMAL은 RAM을 어떻게 다루는지에 관한 개념이고, MTD·JFFS2·MBR·Btrfs는 저장장치 구조와 관련된 개념입니다. 시험에서는 이들이 한꺼번에 등장하므로 서로의 “계층”을 구분하는 것이 중요합니다.
Linux Kernel은 물리 메모리를 여러 Zone으로 나누어 관리합니다. 그중 ZONE_NORMAL은 커널 가상주소와 물리주소가 선형적으로 매핑되는 핵심 영역입니다.
전통적인 32비트 x86 구조를 기준으로는 ZONE_DMA, ZONE_NORMAL, ZONE_HIGHMEM으로 나눌 수 있으며, ZONE_NORMAL은 커널이 직접 접근하고 kmalloc() 같은 연속 메모리 할당에서 주로 활용되는 영역으로 설명됩니다.
핵심은 “물리 주소와 커널 가상 주소가 일정 오프셋 관계로 선형 매핑되어 있다”는 것입니다. 동적 매핑 과정이 줄어들기 때문에 커널 입장에서 접근이 빠르고 직관적입니다.
시험 암기문장: ZONE_NORMAL은 커널 가상주소와 물리주소가 선형 매핑되는 일반 메모리 영역으로, 커널이 빠르게 접근하고 할당할 수 있다.
MTD(Memory Technology Device)는 Raw NAND/NOR Flash 같은 메모리 기술 장치를 Linux Kernel에서 다루기 위한 서브시스템입니다.
임베디드 시스템에서는 하나의 Flash를 통째로 쓰기보다 보통 다음처럼 영역을 나눕니다.
Bootloader | Kernel | DTB | RootFS | User Data
이때 MTD Partitioning을 사용하면 Flash 전체 공간을 고정 크기의 논리 영역으로 나누어 각 용도별로 사용할 수 있습니다. 부트로더와 Kernel Image, Device Tree, Root File System이 서로의 영역을 침범하지 않도록 관리할 수 있다는 점이 중요합니다.
시험 포인트: “Flash Memory를 용도별로 분할하여 사용하는 Linux 기술”이 나오면 MTD Partitioning을 떠올릴 수 있어야 합니다.
NAND Flash는 HDD나 일반 Block Device와 다른 제약을 가집니다.
① 페이지 단위로 Program하지만 블록 단위로 Erase한다.
② 같은 위치에 바로 덮어쓰는 In-place Update가 어렵다.
③ 각 Block의 Program/Erase Cycle에 수명 제한이 있다.
④ 특정 Block에 소거가 집중되면 수명이 급격히 줄 수 있다.
따라서 Flash 전용 파일시스템은 단순히 “파일을 저장하는 기능”만 제공하는 것이 아니라, 로그 구조, Garbage Collection, Wear Leveling, Bad Block 관리 등을 함께 고려해야 합니다.
JFFS2(Journalling Flash File System version 2)는 Raw Flash 환경에서 사용되어 온 로그 구조 기반 파일시스템입니다.
파일의 생성, 수정, 삭제 정보를 Node 형태로 순차적으로 기록하는 방식이기 때문에 Flash의 “덮어쓰기 어려움”이라는 특성과 잘 맞습니다. 기존 위치를 직접 수정하기보다 새로운 위치에 최신 데이터를 기록하고, 이전 데이터는 더 이상 유효하지 않은 Node로 남겼다가 Garbage Collection 과정에서 정리합니다.
장점은 Flash 특성을 고려한 구조라는 점이지만, 용량이 커질수록 Mount 시 전체 Flash를 Scan하여 Index를 구성해야 하므로 부팅시간과 RAM 사용량이 증가할 수 있다는 한계가 있습니다.
시험 암기문장: JFFS2는 Raw Flash를 위한 로그 구조 파일시스템으로, 데이터를 Node 단위로 순차 기록하며 Garbage Collection을 통해 무효 데이터를 정리한다.
대용량 NAND 환경에서는 JFFS2보다 UBIFS가 더 적합한 경우가 많습니다. UBIFS는 UBI 계층 위에서 동작하며, Bad Block 관리와 Wear Leveling을 UBI와 함께 처리합니다.
시험에서는 JFFS2 자체 정의를 묻기도 하지만, 실무 관점에서는 “소형 Raw Flash 환경의 전통적 선택”과 “대용량 NAND에서의 UBIFS”를 비교해서 이해하면 좋습니다.
Flash Memory는 Block마다 Erase 횟수에 제한이 있습니다. 그래서 특정 영역만 반복적으로 지우면 해당 Block이 먼저 마모됩니다.
Wear Leveling은 Erase가 특정 Block에 집중되지 않도록 사용 빈도를 분산시켜 Flash 전체 수명을 균등하게 사용하는 기법입니다.
이 개념은 JFFS2, UBIFS, FTL, SSD Controller 등 다양한 계층에서 등장합니다. 시험에서는 “플래시 메모리 수명 연장을 위해 삭제 횟수를 균등하게 만드는 기술”로 출제될 수 있습니다.
Flash는 제자리 덮어쓰기가 어렵기 때문에 수정 전 데이터가 곧바로 사라지지 않고 무효 데이터로 남습니다. 시간이 지나면 이러한 Garbage가 쌓여 가용 공간이 줄어듭니다.
Garbage Collector는 유효한 데이터만 새 Block으로 모아 복사한 뒤, 기존 Block을 Erase하여 다시 사용할 수 있는 공간으로 만듭니다.
즉 Log Structured Write → Invalid Data 증가 → Garbage Collection → Erase Block 재사용이라는 순환 구조를 이해하면 Flash 파일시스템의 핵심이 정리됩니다.
MBR(Master Boot Record)은 디스크의 첫 번째 영역에 위치하며, 전통적으로 Boot Code와 Partition Table 정보를 담습니다.
Raw Flash에서 MTD Partition이 직접 Flash 영역을 나누는 방식이라면, HDD·SSD 같은 Block Device에서는 MBR이나 GPT가 파티션 정보를 관리하는 방식으로 이해할 수 있습니다.
시험에서는 MBR의 역할을 “부팅 코드와 파티션 정보를 포함하는 디스크 첫 영역” 정도로 정리해 두면 좋습니다.
Btrfs(B-tree File System)는 Copy-on-Write(CoW), Snapshot, Subvolume, Checksum 등의 고급 기능을 제공하는 현대 Linux 파일시스템입니다.
JFFS2가 Raw Flash를 직접 고려한 파일시스템이라면 Btrfs는 일반적으로 Block Device 계층 위에서 동작하는 고급 파일시스템으로 보는 것이 이해하기 쉽습니다.
따라서 “JFFS2와 Btrfs를 둘 다 파일시스템이라고 해서 같은 계층과 용도로 생각하면 안 된다”는 점이 중요합니다.
| 개념 | 역할 | 주 대상 |
|---|---|---|
| ZONE_NORMAL | Kernel RAM 관리 영역 | 물리 메모리 |
| MTD | Raw Flash 관리 계층 | NAND/NOR |
| JFFS2 | Log Structured Flash FS | Raw Flash |
| MBR | Boot Code + Partition Table | Block Device |
| Btrfs | CoW 기반 고급 FS | HDD/SSD 등 |
문제 1. 물리 주소와 선형 매핑되어 커널이 빠르게 접근할 수 있는 메모리 영역은?
답: ZONE_NORMAL
문제 2. Raw NAND/NOR Flash를 Linux Kernel에서 관리하기 위한 서브시스템은?
답: MTD
문제 3. Raw Flash에 Node를 순차적으로 기록하는 Log Structured File System은?
답: JFFS2
문제 4. Flash의 특정 Block에 Erase가 집중되지 않도록 하여 수명을 늘리는 기술은?
답: Wear Leveling
문제 5. 전통적으로 디스크의 첫 영역에 Boot Code와 Partition Table을 저장하는 구조는?
답: MBR
ZONE_NORMAL = Kernel이 직접 빠르게 접근하는 선형 매핑 RAM 영역
MTD = Raw NAND/NOR 관리 계층
JFFS2 = Raw Flash용 Log Structured File System
Wear Leveling = Flash Erase 횟수 분산
Garbage Collection = 무효 데이터 제거 후 Block 재사용
MBR = Boot Code + Partition Table
Btrfs = CoW, Snapshot, Checksum을 제공하는 현대 Linux FS
이번 편에서 가장 중요한 것은 용어를 따로 외우는 것이 아니라 “어느 계층의 기술인지”를 구분하는 것입니다. ZONE_NORMAL은 RAM, MTD는 Raw Flash 관리 계층, JFFS2는 Flash 파일시스템, MBR은 Disk Partition 구조, Btrfs는 Block Device 기반의 고급 파일시스템입니다. 이 위치 관계를 이해하면 저장장치 관련 문제가 훨씬 단순해집니다.
13편 — Interrupt, IVT, ISR 그리고 DMA: CPU가 외부 사건을 처리하는 방법
#임베디드기사 #임베디드기사실기 #LinuxKernel #ZONE_NORMAL #MTD #JFFS2 #Btrfs #MBR #NANDFlash #NORFlash #WearLeveling #GarbageCollection #파일시스템 #임베디드리눅스 #RawFlash #UBIFS #LinuxMemory #FlashMemory #자격증공부 #임베디드시스템