현장실습

Ext4 파일시스템 구조

Hgrace 2020. 7. 14. 15:15

Ext4 파일 시스템은 크게 부트섹터와 블록 그룹으로 이루어져 있다. 

블록이란 Ext4 파일시스템에서 기본적으로 데이터를 저장하는 단위를 나타내며, 저장장치에서 한 번의 I/O 과정에 읽어 들이는 단위가 되기도 한다. 

 

부트 섹터를 제외하면 모두 블록 그룹들의 나열로 되어 있다. 파일시스템을 구성하는 정보들은 블록 그룹에 있다. 가장 마지막 블록 그룹을 제외한 모든 블록 그룹들은 같은 블록 개수를 가진다. 이 곳에 파일명, 메타데이터, 파일데이터 등이 저장된다. 

 

1. 블록 그룹(Block Group)

블록 그룹은 블록들의 모임이며 블록들을 여러 그룹으로 나누어서 파일시스템의 정보 및 데이터를 저장한다. OS 커널에서 같은 파일에 속하는 데이터 블록은 같은 블록에 저장하려 하므로 블록 그룹은 파일의 단편화를 줄인다.

 

블록그룹은 다음과 같은 구조로 구성된다.

1. Super Block (1 block)

2. Group Descriptor Table (n blocks)

3. Block Bitmap (1 block)

4. Inode Bitmap (1 block)

5. Inode Table (n blocks)

6. File Data Blocks (n blocks)

 

Ext4 파일 시스템의 전체적인 정보를 저장하는 데이터구조는 슈퍼블록과 그룹 디스크립터 테이블이다. 슈퍼블록은 블록 그룹의 가장 앞 부분에 존재하고 파일시스템의 크기와 환경 설정 값들을 저장한다. 맨 블록그룹의 슈퍼블록이 Invalid할 경우 다음 블록그룹의 슈퍼블록의 정보들을 복사한 후 사용한다. 

 

블록 그룹의 개수와 크기는 디스크의 해당 파티션과 블록의 크기에 따라 달라진다. 

 

2. 슈퍼블록(Super block)

Ext4 파일시스템에서 사용되는 주요 설정 정보들이 기록되어 있는 영역이다. 블록 그룹의 첫 번째 블록에 위치하고 있으며 파일시스템에서 설정한 블록의 크기가 달라도 위치는 같다. 

 

주요 데이터는 블록의 크기(1KB, 2KB, 4KB), 총 블록의 개수, 블록 그룹의 개수, Inode 개수, 그룹 내의 블록, Inode 개수

 

3. 그룹 디스크립터 테이블

슈퍼블록 다음 바로 그룹 디스크립터 테이블이 위치한다. 이 테이블은 해당 파일시스템 내의 모든 블록 그룹에 대한 정보들을 기록하고 있으며 각각의 정보들을 그룹 디스크립터라고 한다. 여러 그룹 디스크립터들이 모여 그룹 디스크립터 테이블이라 한다.

 

주요 데이터는 블록 비트맵의 블록번호, 아이노드 비트맵의 블록번호, 첫번째 아이노드 테이블 블록의 블록번호, 그룹 안에 있는 빈 블록 수, 그룹 안에 있는 아이노드 수, 그룹 안에 있는 빈 디렉토리 수이다.

 

4. 블록 비트맵(Block Bitmap)

블록 비트맵은 그룹 디스크립터 테이블 다음에 위치한다. 그룹 디스크립터 테이블의 크기가 가변이므로 블록 비트맵의 위치는 달라진다. 때문에 그룹 디스크립터 테이블에 블록 비트맵의 주소가 들어있다. 

 

블록 비트맵은 블록의 사용 현황을 bit로 표현하여 나타낸 것이다. 1Byte는 8bit로 나타낼 수 있고, Bit를 블록이라고 생각하면 각 블록이 사용되는 곳의 비트는 1이 되어 표시된다. 이를 통해 새로운 블록을 할당할 때 어느 블록에 할당해야 하는지 빠르게 계산할 수 있다.

블록 비트맵은 하나의 블록 안에 기록되어야 한다. 블록의 크기는 1, 2, 4KB로 나뉘기 때문에 블록 비트맵은 8192, 26384, 32768개의 블록 현황을 나타낼 수 있다.

 

5. 아이노드(Inode)

Ext4 파일시스템에서 파일 객체가 저장되는 곳은 Inode 데이터 구조이다. 아이노드 사이즈는 슈퍼블록에 저장되어 있다. 모든 파일들과 디렉토리들은 각각 1개의 아이노드를 할당하고 있으며 모든 아이노드들은 고유한 주소를 가지고 있다. 아이노드는 아이노드 테이블에 저장되어 있으며 아이노드 테이블의 주소는 그룹 디스크립터 테이블을 통해 알 수 있다.

특정 아이노드 번호를 알고 있다면 해당 아이노드가 속한 그룹이 어디 있는지 계산할 수 있다.

No. 아이노드가 속한 Block Group = (InodeNo - 1) / 그룹에 속한 아이노드 수

-1을 하는 이유는 아이노드 인덱스가 1부터 시작하기 때문이다. 

 

6. 아이노드 비트맵(Inode Bitmap)

1개의 아이노드는 1개의 bit로 대응되어 해당 블록 그룹이 관리하는 모든 Inode의 현황을 알 수 있다. 

 

 

참고 : 임베디드 개발자를 위한 파일시스템의 원리와 실습