파일시스템 구조: 부트 블록부터 데이터 블록까지

파일시스템을 구성하는 Boot Block, Super Block, Bitmap, Inode, Data Block의 역할과 파일 생성·읽기·삭제 흐름을 정리합니다.

2026-08-14 · 최초 발행 2025-12-28

디스크 블록을 파일과 디렉토리로 바꾸는 계층

파일시스템은 디스크 같은 보조기억장치에 데이터를 구조화해 저장하고 관리하는 운영체제 모듈이다. 응용 프로그램은 물리 블록 주소를 직접 다루지 않고 파일명과 디렉토리 구조를 사용한다. 이 추상화는 데이터의 영구 저장, 저장 공간 관리, 빠른 검색과 접근, 무결성 및 보안 보장을 위한 기반이 된다.

파일시스템은 파일 생성·읽기·쓰기·삭제와 함께 크기, 권한, 타임스탬프 같은 메타데이터를 관리한다. 디렉토리는 계층 구조를 제공하고 파일명과 실제 데이터를 연결한다. 자유 공간 추적, 단편화 완화, 사용자별 권한, 파일 잠금과 동시성 제어, 오류 복구 역시 이 계층에서 다뤄진다.

저장 영역이 맡는 역할

디스크는 논리적으로 Boot Block, Super Block, Bitmap Block, Inode Block, Data Block 영역으로 나뉜다.

Boot BlockSuper BlockBitmap BlockInode BlockData Block

Boot Block에는 부팅 정보가, Super Block에는 파일시스템 전체의 메타데이터가 들어간다. Bitmap Block은 블록과 inode의 할당 상태를 기록하며, Inode Block은 파일명을 제외한 파일 정보를 관리한다. 실제 파일 내용은 Data Block에 저장된다.

부트 코드를 담는 Boot Block

Boot Block은 파일시스템의 가장 앞부분에 있으며 일반적으로 첫 번째 섹터를 사용한다. 전통적인 크기는 512 bytes이고, 최신 시스템에서는 4KB를 사용하기도 한다. 이 영역에는 부트스트랩 로더, 파티션 테이블 정보, 커널 이미지 위치 정보, 부팅 매개변수가 들어간다.

"Kernel""Boot Loader""Boot Block""BIOS/UEFI""Kernel""Boot Loader""Boot Block""BIOS/UEFI"MBR/GPT 읽기부트스트랩 로더 실행커널 위치 확인 및 로드커널 초기화부팅 완료, 제어권 이전

다중 부팅 환경에서는 각 파티션의 Boot Block을 활용할 수 있다. 변조되면 시스템 부팅이 불가능해질 수 있으므로 Secure Boot 같은 보호 기법이 필요하며, 손상에 대비한 백업도 중요하다.

파일시스템 전체 상태를 기록하는 Super Block

Super Block은 파일시스템 전반의 핵심 메타데이터를 담는다. 손상되면 전체 파일시스템에 접근할 수 없으므로, 일반적으로 Boot Block 다음에 두고 여러 위치에 복사본을 유지한다.

여기에는 파일시스템 타입(ext4, NTFS, XFS 등), 매직 넘버, 버전 정보가 기록된다. 전체·자유 블록 수와 전체·자유 inode 수, 블록 크기(512B, 1KB, 4KB 등), 각 영역의 시작 블록 주소, ext 계열의 블록 그룹 정보도 포함된다. 마운트 상태, 마지막 마운트 시간, 마지막 쓰기 시간, 마운트 횟수, 파일시스템 상태와 자유 블록·inode 리스트 헤드도 관리 대상이다.

Super Block파일시스템 정보크기 정보상태 정보관리 정보Magic Number: 0xEF53Block Size: 4096Inode Size: 256Total Blocks: 1000000Free Blocks: 500000Total Inodes: 250000Free Inodes: 125000Mount Count: 15Last Mount TimeFile System StateFirst Data Block: 1Block Group Number: 0

Bitmap으로 자유 공간을 찾는 방식

Bitmap Block은 각 블록과 inode가 할당되었는지를 비트로 나타내는 영역이다. 관리할 블록 또는 inode 수에 비례해 크기가 정해지며, 1은 할당됨(Allocated), 0은 자유(Free)를 뜻한다. 비트 단위 표현은 공간 사용을 최소화한다.

Block Bitmap은 데이터 블록의 할당 상태를 추적한다. 파일 생성 때 자유 블록을 찾고, 파일 삭제 때 해제 상태를 표시하며, 파일 확장 때 추가 블록을 할당하는 데 사용된다. Inode Bitmap은 새 파일이나 디렉토리를 만들 때 자유 inode를 찾고, 삭제된 파일의 inode를 해제하는 역할을 맡는다.

해석Block Bitmap (32 blocks)11111111111100001010101000000000블록 0-7: 모두 사용블록 8-11: 사용 중, 12-15:자유블록 16-23: 교차 할당블록 24-31: 모두 자유

할당 정책으로는 첫 번째 자유 블록을 찾는 First Fit, 요청 크기에 맞는 연속 블록을 찾는 Best Fit, 가장 큰 자유 공간에 할당하는 Worst Fit, 마지막 할당 위치부터 탐색하는 Next Fit이 있다. 비트맵 연산에는 할당 상태를 확인하는 &(AND), 할당을 표시하는 |(OR), 자유 블록 탐색에 쓰는 ~(NOT), 상태 전환에 쓰는 ^(XOR)를 활용할 수 있다. 자주 접근하는 비트맵은 메모리에 캐시하고, 블록 그룹 단위로 나누어 관리하기도 한다.

파일명 밖의 정보를 보관하는 Inode

Inode는 파일 메타데이터를 저장하는 고정 크기 자료구조다. 일반적인 크기는 128 bytes 또는 256 bytes이며, 개수는 파일시스템을 만들 때 결정된다. 일부 파일시스템은 동적으로 관리한다. 파일명 외의 파일 정보는 inode가 담당한다.

inode에는 일반 파일·디렉토리·심볼릭 링크 같은 파일 타입, rwxrwxrwx 권한 비트, UID와 GID가 저장된다. 파일 크기와 할당 블록 수, 최근 접근 시간(atime), 최근 내용 수정 시간(mtime), 최근 inode 변경 시간(ctime), 하드 링크 카운트도 포함된다.

데이터 위치는 직접 블록 포인터와 단일·이중·삼중 간접 블록 포인터로 가리킨다. 직접 블록 포인터는 일반적으로 10-12개를 사용한다.

Inode직접 블록 0직접 블록 1...직접 블록 11단일 간접이중 간접삼중 간접DataDataData블록 주소 1블록 주소 2...Data간접 블록 1블록 주소Data간접 블록 1간접 블록 2블록 주소Data

블록 크기가 4KB일 때 직접 블록 12개는 48 KB를 다룬다. 단일 간접 블록은 1024 포인터로 4 MB, 이중 간접 블록은 1024 × 1024로 4 GB, 삼중 간접 블록은 1024 × 1024 × 1024로 4 TB까지 확장한다. 최대 파일 크기는 약 4 TB다. 작은 파일은 직접 블록만 사용해 빠르게 접근하고, 큰 파일은 간접 블록으로 확장성을 확보한다.

실제 내용을 담는 Data Block

Data Block은 실제 파일 내용이 들어가는 영역이다. 크기는 파일시스템 블록 크기와 같고 일반적으로 4KB다. 파일을 생성하거나 확장할 때 동적으로 할당하며, 삭제할 때는 비트맵에서 자유 상태로 표시한다.

이 블록에는 텍스트, 바이너리, 이미지 같은 일반 파일 데이터뿐 아니라 파일명과 inode 번호를 연결하는 디렉토리 엔트리, 심볼릭 링크의 대상 경로 문자열, 다른 데이터 블록 주소를 저장하는 간접 블록도 들어갈 수 있다.

디렉토리의 Data Blockinode: 1234, name: '.', len:1inode: 5678, name: '..', len:2inode: 9012, name:'file1.txt', len: 9inode: 3456, name:'file2.txt', len: 9inode: 7890, name: 'subdir',len: 6Inode 9012Inode 3456Directory Inode 7890file1.txt의 Data Blockfile2.txt의 Data Blocksubdir의 Data Block

블록 할당에는 연속, 연결, 색인 방식이 있다. 연속 할당은 순차 접근이 빠르지만 외부 단편화와 파일 크기 예측 문제가 있다. 연결 할당은 단편화 없이 동적으로 확장할 수 있으나 순차 접근만 효율적이고 포인터 오버헤드가 있다. 색인 할당은 임의 접근에 유리하고 단편화가 적지만 색인 블록 오버헤드를 갖는다. Unix 방식은 직접 블록과 간접 블록을 조합해 작은 파일에 유리하도록 구성한다.

파일 생성·읽기·삭제에서 일어나는 일

새 파일을 만들면 운영체제는 Inode Bitmap에서 자유 inode를 찾고 초기화한다. 이어 Block Bitmap에서 자유 블록을 찾아 inode에 주소를 기록한 뒤 데이터를 쓴다.

"Data Block""Block Bitmap""Inode Block""Inode Bitmap""OS""사용자""Data Block""Block Bitmap""Inode Block""Inode Bitmap""OS""사용자"create("file.txt")자유 inode 검색inode 번호 반환inode 초기화자유 블록 검색블록 번호 반환블록 주소를 inode에 저장데이터 쓰기파일 디스크립터 반환

읽기 요청에서는 디렉토리에서 파일명으로 inode 번호를 조회하고, inode가 반환한 블록 주소를 따라 Data Block을 읽는다.

"Data Block""Inode""디렉토리""OS""사용자""Data Block""Inode""디렉토리""OS""사용자"open("file.txt")파일명으로 inode 번호 조회inode 번호 반환inode 읽기파일 메타데이터 및 블록 주소 반환read()inode의 블록 주소로 데이터 읽기데이터 반환데이터 전달

삭제는 디렉토리 엔트리를 제거하고 inode의 링크 카운트를 낮추는 순서로 진행한다. 링크 카운트가 0이면 데이터 블록과 inode를 비트맵에서 자유 상태로 바꾼다.

"Block Bitmap""Inode Bitmap""Inode""디렉토리""OS""사용자""Block Bitmap""Inode Bitmap""Inode""디렉토리""OS""사용자"alt[링크 카운트 == 0]unlink("file.txt")파일 엔트리 제거링크 카운트 감소링크 카운트 확인모든 데이터 블록을 자유로 표시inode를 자유로 표시삭제 완료

지역성과 복구를 위한 관리 기법

블록 그룹화는 디스크를 여러 그룹으로 나눠 관리하는 방식이다. 각 그룹은 자체 Super Block, 비트맵, inode, 데이터 블록을 가진다. 관련 데이터를 가까이 배치해 지역성을 높이고 단편화를 줄이며 병렬 처리를 가능하게 한다.

inode 캐시는 자주 쓰는 inode를 메모리에 유지하고, Block 캐시는 최근 읽은 블록을 캐시한다. 쓰기 버퍼는 여러 쓰기 작업을 모아 배치 처리한다. 읽기 선행(Read-ahead)은 순차 접근 패턴을 감지했을 때 미리 데이터를 읽는다.

저널링은 파일시스템 일관성과 빠른 복구를 위한 방식이다. 변경 사항을 저널에 먼저 기록하고 실제 파일시스템 구조를 업데이트한 다음 저널 엔트리를 제거한다. 시스템 충돌이 발생하면 저널 재생으로 빠르게 복구할 수 있다. 메타데이터 저널링은 빠르고, 전체 데이터 저널링은 안전하다.

파일시스템운영체제아이노드저장장치디스크 관리