Unix 파일시스템과 i-node 기반 파일 관리 구조
Unix 파일시스템의 Boot Block, Super Block, i-node, 데이터 블록 구조와 계층형 디렉토리 탐색 방식을 정리한다.
2026-08-14 · 최초 발행 2025-12-28
파일명과 파일 정보를 분리한 Unix의 설계
Unix 파일시스템은 1970년대 초 벨 연구소에서 개발된 뒤 현대 운영체제 파일시스템의 기반이 됐다. 이 구조의 중심에는 i-node(index node)가 있다. 파일 이름은 디렉토리에 두고, 파일의 속성과 데이터 위치는 i-node에 분리해 저장한다.
이 분리는 계층형 디렉토리를 따라 파일을 찾고, 속성을 관리하며, 실제 데이터를 읽는 과정을 일관된 방식으로 만들었다.
디스크 위에 배치되는 파일시스템 영역
Unix 파일시스템은 디스크를 논리적으로 Boot Block, Super Block, i-node List, Data Block 영역으로 나눠 관리한다.
Boot Block은 파일시스템의 최선두 영역에 놓인다. 일반적으로 크기는 512 bytes ~ 1 KB이며, 운영체제 부팅에 필요한 부트스트랩 코드를 저장한다. 부트로더 프로그램, 커널 로드 정보, 파티션 정보가 여기에 포함될 수 있다. 모든 파일시스템에 존재하지만 실제로 쓰이는 것은 부팅 파티션의 블록이다.
Super Block은 파일시스템 전체의 상태와 구성을 관리하는 메타데이터 영역이다. 파일시스템의 크기와 상태, i-node 및 데이터 블록의 개수와 위치, 자유 i-node와 자유 데이터 블록 리스트, 마운트 시간, 마지막 수정 시간, 블록 크기 정보를 담는다. 이 영역이 손상되면 파일시스템 전체에 접근할 수 없으므로, 중요도를 이유로 주기적인 복사본을 유지한다.
i-node List는 파일별 메타데이터를 보관하는 i-node 배열이다. 배열의 인덱스인 i-node 번호가 각 파일을 고유하게 식별한다. i-node 슬롯 수는 파일시스템을 만들 때 정해지므로, 데이터 블록이 남아 있어도 i-node가 부족하면 새 파일을 만들 수 없다.
Data Block에는 일반 파일의 실제 데이터, 파일명과 i-node 번호 쌍으로 이루어진 디렉토리 엔트리, 심볼릭 링크 경로가 저장된다. 블록은 파일에 필요할 때 할당되고, 파일을 삭제하면 자유 블록 리스트로 돌아간다.
i-node가 보관하는 파일의 실체
i-node는 고정 크기 자료구조로, 파일명을 제외한 파일 정보를 저장한다. 일반적으로 크기는 128 bytes이며 시스템에 따라 256 bytes일 수 있다. 파일명은 디렉토리에, 파일 속성은 i-node에 둔다는 분리 설계가 이 구조의 핵심이다.
i-node에는 다음 정보가 들어간다.
- 파일 타입: 일반 파일, 디렉토리, 특수 파일 등
- 권한 정보: 소유자, 그룹, 기타 사용자의 읽기·쓰기·실행 권한
- 소유권: UID(사용자 ID), GID(그룹 ID)
- 파일 크기: 바이트 단위의 정확한 크기
- 타임스탬프: atime(마지막 접근 시간), mtime(마지막 내용 수정 시간), ctime(마지막 i-node 변경 시간)
- 링크 수: 해당 파일을 참조하는 하드 링크 개수
- 데이터 블록 주소: 실제 데이터가 저장된 블록 위치(15개 포인터)
작은 파일과 큰 파일을 함께 다루기 위해 i-node는 직접 주소와 단계별 간접 주소를 사용한다.
직접 블록은 12개이며 작은 파일의 데이터를 바로 참조한다. 단일 간접 포인터는 블록 주소를 담은 블록 하나를 가리킨다. 이중 간접 포인터와 삼중 간접 포인터는 각각 2단계, 3단계 간접 참조를 사용한다. 파일 크기는 블록 크기에 따라 수십 TB까지 확장할 수 있다.
경로를 따라 i-node를 찾는 과정
Unix의 계층형 디렉토리는 루트 디렉토리(/)에서 시작한다. 디렉토리는 파일명과 i-node 번호 쌍을 저장하는 파일이며, 절대 경로는 /home/user/document.txt, 상대 경로는 ../user/document.txt처럼 표현한다.
각 디렉토리에는 현재 디렉토리의 i-node를 가리키는 .과 부모 디렉토리의 i-node를 가리키는 .. 엔트리가 있다. 커널은 경로의 각 구성 요소를 차례로 읽으며 다음 디렉토리나 대상 파일의 i-node를 찾아간다.
디렉토리 자체도 i-node와 데이터 블록을 가진다. 데이터 블록에는 (파일명, i-node 번호) 쌍의 배열이 들어간다. 디렉토리 엔트리는 i-node 번호 2-4 bytes, 레코드 길이 2 bytes, 파일명 길이 1-2 bytes, 최대 255 bytes의 가변 길이 파일명으로 구성된다. 이 구조는 수천 개 파일도 효율적으로 관리할 수 있게 한다.
일반 파일부터 프로세스 통신까지
일반 파일은 사용자 데이터를 담는 기본 파일이다. 텍스트 파일은 ASCII 문자열을, 바이너리 파일은 실행 파일·객체 파일·이미지 등을 담는다. 커널은 내부 내용의 형식을 구분하지 않으며, 해석은 응용 프로그램이 맡는다. ls -l 출력에서는 -로 시작한다.
디렉토리는 파일명과 i-node 번호의 매핑을 담은 특수 파일이다. 읽기 권한은 디렉토리 목록 조회, 쓰기 권한은 파일 생성·삭제, 실행 권한은 디렉토리 진입을 허용한다. 사용자가 직접 수정할 수 없고 시스템 콜을 통해 관리되며, ls -l에서는 d로 시작한다.
문자 장치 파일은 문자 단위 I/O를 수행한다. 터미널(/dev/tty), 키보드, 마우스가 예시이며 실제 데이터 블록 대신 장치 드라이버 정보만 저장한다. ls -l 출력의 식별 문자는 c다.
블록 장치 파일은 블록 단위 I/O를 수행한다. 하드디스크(/dev/sda)와 USB 드라이브가 예시이며, 커널 버퍼를 사용해 효율적인 I/O를 수행한다. ls -l에서는 b로 시작한다.
심볼릭 링크는 다른 파일의 경로를 담는 파일이다. 대상 경로명 문자열을 내용으로 가지며 독립적인 i-node를 보유한다. 대상 파일이 삭제되면 깨진 링크(Broken Link)가 되고, 파일시스템 경계를 넘어 링크할 수 있다. ls -l에서는 l로 식별한다.
Named Pipe(FIFO)는 프로세스 간 통신을 위한 특수 파일이다. 선입선출(FIFO) 방식으로 데이터를 전달하며 mkfifo 명령어로 만들 수 있다. ls -l 출력에서는 p로 시작한다.
i-node 구조가 제공하는 운영 특성
파일명과 속성을 분리한 i-node 구조는 파일 속성에 빠르게 접근하게 한다. 직접 블록과 간접 블록을 함께 사용하므로 작은 파일은 빠르게 처리하고 큰 파일은 확장할 수 있다. 슈퍼 블록의 캐시는 자유 블록의 할당과 해제를 빠르게 처리한다.
하드 링크로 하나의 파일에 여러 이름을 부여할 수 있고, 심볼릭 링크는 파일시스템 간 링크를 지원한다. 장치도 파일로 다루는 “모든 것은 파일” 방식은 인터페이스를 통일한다.
계층 구조는 무제한 깊이의 디렉토리 트리를 지원한다. 간접 블록은 TB급 파일을 지원하며, i-node 기반 구조는 파일 개수를 유연하게 관리한다. 슈퍼 블록 백업은 파일시스템 복구를 가능하게 하고, 최신 Unix 시스템의 저널링은 일관성을 보장한다. 구조가 명확하므로 파일시스템 검사와 복구 도구를 개발하기도 용이하다.
전통적 구조를 확장한 파일시스템
전통적인 Unix 파일시스템에는 파일시스템 생성 시 결정되어 변경할 수 없는 고정 i-node 수, 장기 사용에 따른 단편화, 초기의 14자 파일명 길이 제한이 있었다.
Linux의 ext2/ext3/ext4는 동적 i-node 할당, 저널링 지원, 확장된 속성(Extended Attributes)을 제공한다. FreeBSD의 UFS2는 64비트 블록 주소와 소프트 업데이트(Soft Updates)를 지원한다. ZFS와 Btrfs는 스냅샷 및 복제, 통합 볼륨 관리, 데이터 무결성 검증을 제공한다.
Unix 파일시스템의 i-node 기반 설계는 50년 이상 이어진 구조다. Boot Block, Super Block, i-node List, Data Block을 분리하고 계층형 디렉토리와 여러 파일 타입을 결합한 방식은 오늘날 Unix 계열 운영체제의 파일 관리 원리를 이해하는 출발점이 된다.