파일시스템 구조: 부트 블록부터 데이터 블록까지
파일시스템을 구성하는 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 Block에는 부팅 정보가, Super Block에는 파일시스템 전체의 메타데이터가 들어간다. Bitmap Block은 블록과 inode의 할당 상태를 기록하며, Inode Block은 파일명을 제외한 파일 정보를 관리한다. 실제 파일 내용은 Data Block에 저장된다.
부트 코드를 담는 Boot Block
Boot Block은 파일시스템의 가장 앞부분에 있으며 일반적으로 첫 번째 섹터를 사용한다. 전통적인 크기는 512 bytes이고, 최신 시스템에서는 4KB를 사용하기도 한다. 이 영역에는 부트스트랩 로더, 파티션 테이블 정보, 커널 이미지 위치 정보, 부팅 매개변수가 들어간다.
다중 부팅 환경에서는 각 파티션의 Boot Block을 활용할 수 있다. 변조되면 시스템 부팅이 불가능해질 수 있으므로 Secure Boot 같은 보호 기법이 필요하며, 손상에 대비한 백업도 중요하다.
파일시스템 전체 상태를 기록하는 Super Block
Super Block은 파일시스템 전반의 핵심 메타데이터를 담는다. 손상되면 전체 파일시스템에 접근할 수 없으므로, 일반적으로 Boot Block 다음에 두고 여러 위치에 복사본을 유지한다.
여기에는 파일시스템 타입(ext4, NTFS, XFS 등), 매직 넘버, 버전 정보가 기록된다. 전체·자유 블록 수와 전체·자유 inode 수, 블록 크기(512B, 1KB, 4KB 등), 각 영역의 시작 블록 주소, ext 계열의 블록 그룹 정보도 포함된다. 마운트 상태, 마지막 마운트 시간, 마지막 쓰기 시간, 마운트 횟수, 파일시스템 상태와 자유 블록·inode 리스트 헤드도 관리 대상이다.
Bitmap으로 자유 공간을 찾는 방식
Bitmap Block은 각 블록과 inode가 할당되었는지를 비트로 나타내는 영역이다. 관리할 블록 또는 inode 수에 비례해 크기가 정해지며, 1은 할당됨(Allocated), 0은 자유(Free)를 뜻한다. 비트 단위 표현은 공간 사용을 최소화한다.
Block Bitmap은 데이터 블록의 할당 상태를 추적한다. 파일 생성 때 자유 블록을 찾고, 파일 삭제 때 해제 상태를 표시하며, 파일 확장 때 추가 블록을 할당하는 데 사용된다. Inode Bitmap은 새 파일이나 디렉토리를 만들 때 자유 inode를 찾고, 삭제된 파일의 inode를 해제하는 역할을 맡는다.
할당 정책으로는 첫 번째 자유 블록을 찾는 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개를 사용한다.
블록 크기가 4KB일 때 직접 블록 12개는 48 KB를 다룬다. 단일 간접 블록은 1024 포인터로 4 MB, 이중 간접 블록은 1024 × 1024로 4 GB, 삼중 간접 블록은 1024 × 1024 × 1024로 4 TB까지 확장한다. 최대 파일 크기는 약 4 TB다. 작은 파일은 직접 블록만 사용해 빠르게 접근하고, 큰 파일은 간접 블록으로 확장성을 확보한다.
실제 내용을 담는 Data Block
Data Block은 실제 파일 내용이 들어가는 영역이다. 크기는 파일시스템 블록 크기와 같고 일반적으로 4KB다. 파일을 생성하거나 확장할 때 동적으로 할당하며, 삭제할 때는 비트맵에서 자유 상태로 표시한다.
이 블록에는 텍스트, 바이너리, 이미지 같은 일반 파일 데이터뿐 아니라 파일명과 inode 번호를 연결하는 디렉토리 엔트리, 심볼릭 링크의 대상 경로 문자열, 다른 데이터 블록 주소를 저장하는 간접 블록도 들어갈 수 있다.
블록 할당에는 연속, 연결, 색인 방식이 있다. 연속 할당은 순차 접근이 빠르지만 외부 단편화와 파일 크기 예측 문제가 있다. 연결 할당은 단편화 없이 동적으로 확장할 수 있으나 순차 접근만 효율적이고 포인터 오버헤드가 있다. 색인 할당은 임의 접근에 유리하고 단편화가 적지만 색인 블록 오버헤드를 갖는다. Unix 방식은 직접 블록과 간접 블록을 조합해 작은 파일에 유리하도록 구성한다.
파일 생성·읽기·삭제에서 일어나는 일
새 파일을 만들면 운영체제는 Inode Bitmap에서 자유 inode를 찾고 초기화한다. 이어 Block Bitmap에서 자유 블록을 찾아 inode에 주소를 기록한 뒤 데이터를 쓴다.
읽기 요청에서는 디렉토리에서 파일명으로 inode 번호를 조회하고, inode가 반환한 블록 주소를 따라 Data Block을 읽는다.
삭제는 디렉토리 엔트리를 제거하고 inode의 링크 카운트를 낮추는 순서로 진행한다. 링크 카운트가 0이면 데이터 블록과 inode를 비트맵에서 자유 상태로 바꾼다.
지역성과 복구를 위한 관리 기법
블록 그룹화는 디스크를 여러 그룹으로 나눠 관리하는 방식이다. 각 그룹은 자체 Super Block, 비트맵, inode, 데이터 블록을 가진다. 관련 데이터를 가까이 배치해 지역성을 높이고 단편화를 줄이며 병렬 처리를 가능하게 한다.
inode 캐시는 자주 쓰는 inode를 메모리에 유지하고, Block 캐시는 최근 읽은 블록을 캐시한다. 쓰기 버퍼는 여러 쓰기 작업을 모아 배치 처리한다. 읽기 선행(Read-ahead)은 순차 접근 패턴을 감지했을 때 미리 데이터를 읽는다.
저널링은 파일시스템 일관성과 빠른 복구를 위한 방식이다. 변경 사항을 저널에 먼저 기록하고 실제 파일시스템 구조를 업데이트한 다음 저널 엔트리를 제거한다. 시스템 충돌이 발생하면 저널 재생으로 빠르게 복구할 수 있다. 메타데이터 저널링은 빠르고, 전체 데이터 저널링은 안전하다.