내용

 

1. Ext2

1) 리눅스와 Ext2파일 시스템의 발전

- 리눅스가 처음 만들어   사용된 파일시스템인 Minix 파일시스템을 먼저 살펴 보면, 앤드류 타넨비움 교수가 교육용 유닉스 클론으로 만든 오픈 소스 운영체제인데 이때 사용된 파일시스템이 Minix 파일시스템이라 한다.

- Minix 경우 리누즈 토발즈(리눅스의 창시자) Minix에서 리눅스를 교차 개발 하고 있었으며, 새로운 파일시스템을 고안하는거 보다 기존의 Minix 파일시스템을 지원하는 것이 파일 공유에 효율적이고, 안정적이였기 때문에 리눅스에 Minix 파일시스템을 지원하게  것이다.

- Minix 파일 시스템의 경우 제약사항이 있는데 16비트 정수로 블록 주소를 지정하여 최대 64MB까지 저장할  있었고(1024(기본 블록 사이즈) X 65536(16비트) = 64MB), 따라서 최대 파일 크기도 64MB 제한되었고, 파일명의 길이도 최대 14자였으며, 가변 블록이나 타임 스탬프도 지원하지 않았다.

 

- Minix 제약 사항으로 인해 새로운 파일 시스템이 개발되고 위의 문제를 해결한 Ext(Extended FileSystem, 확장 파일 시스템) 구현되어 리눅스 0.96c 버전에 탑재된다.

- Ext 경우 최대 2GB까지 저장가능 하고, 파일길이도 255Byte까지 사용할  있었지만 Inode 수정이 불가능하고, 데이터 수정 타임 스탬프 등의 지원이 없고, 파일시스템의 비어있는 블록이나 Inode 다루는 자료구조로 연결 리스트를 사용하여 성능이 낮은 문제 점등이 있었다. 이렇게 되어 파일시스템을 사용하면서 리스트의 특성상 정렬이 불가능하고,  노드들이 흩어지게 되버리는 문제가 발생한 것이다.

 

- Ext 여러 문제 해결을 위해 Ext2 XIA라는 파일 시스템의 알파버전이 발표되었다.

- XIA 파일 시스템은 Minix 파일시스템의 커널 코드에 크게 의존하고,  가지 사항을 개선하게 되었다.  파일명, 2GB 파일 시스템 사용 가능, 3가지 타임스탬프를 지원 하였다.

- Ext2 경우 Ext 파일시스템에 근거했지만 상당부분 재구성하고, 여러 기능을 추가하게 되었다. 또한 앞으로 있을 기능 개선을 염두에 두었던 디자인들이 추후에 많은 버그 개선과 성능향상에 도움이 되었다.

- Ext2 XIA 파일시스템이 발표되었을  기본 기능은 동일하며, 보다 단순한 디자인으로 인해 XIA  Ext2 보다 안정적으로 동작하였다.

- 파일 시스템이 점점 널리 사용되고 Ext2 파일시스템의 많은 버그들이 수정되고, 여러 기능이 추가되면서 안정적인 파일시스템으로 알려지게 되고, Ext2 저널링이 추가된 Ext3 파일시스템이 나오기 전까지 리눅스의 기본 파일시스템으로 쓰이게 되었다.

 

구분

Minix

Ext

Ext2

XIA

파일 시스템의 최대 크기

64MB

2GB

4TB

2GB

최대 파일 크기

64MB

2GB

2GB

64MB

파일명 최대 길이

16/30

255

255

248

3 타임스탬프 지원

X

X

O

O

확장성

X

X

O

X

가변 Block 크기

X

X

O

X

향후 지원

O

X

O

?

 

 

2) UFS Ext

- Ext 파일시스템은 Unix 파일시스템인 UFS(Unix File System)에서 기본 개념을 가져왔으며, UFS 마찬가지로 빠르고 안정적인 면에서 높은 파일 시스템으로 전체적으로 중요한 데이터 구조들이나 저장공간  저장장치의 활용적인 측면도 UFS에서 대부분 빌려왔기 때문에 기반이 되는 디자인측면에서 이미 검증된 파일 시스템이라   있다.

- UFS에서 많은 부분 가져오긴 했지만, Ext 단순히 UFs 클론이 아니라 UFS에서 사용되지 않는 부분이나 구조적으로 명료하지 않은 부분은 모두 제외하였기 때문에 Ext 파일시스템이 보다 명료하고 심플하게 한데 많은 도임이 되었다.

 

 

2. Ext2 구조

 

 

1) Ext2 파일 시스템 구조

[Ext2 파일시스템의 레이아웃]

 

- Ext2 파일시스템은 크게 부트 섹터(Boot Sector) 블록 그룹(Block Group)으로 이루어진다.

- 블록의 경우 Ext2 파일시스템에서 기본적으로 데이터를 저장하는 단위이며 한번에 I/O과정에서 읽어 들이는 단위가 되기도 한다. 하드디스크의 물리적인 최소 단위인 LBA 블록과는 개념이 틀리며 Ext2 파일시스템 생성시 크기 설정이 가능하다.

(리눅스에서 mke2fs 프로그램을 이용하면 파일시스템을 생성하는 경우 블록의 크기를 지정할  있는데, 범위가 1KB~4KB까지 가능하다.)

 

1) 블록 그룹(Block Group)

[블록 그룹 레이아웃]

 

- 블록들이 모인 것이 블록 그룹이며, Ext2 파일 시스템에서는 블록들을 여러 개의 그룹으로 나누어 파일시스템의 정보  데이터를 저장한다. 이때 OS 커널에서는 가능하면 파일에 속하는 데이터 블록은 같은 블록에 저장하려 하기 때문에 블록 그룹은 파일 단편화를 줄일  있다.

 

[블록들의 정보]

순서

블록 

Block 

1

Super Block

1Block

2

Group Descriptor Table

n Block

3

Block Bitmap

1 Block

4

Inode Bitmap

1 Block

5

Inode Table

n Block

6

File data Blocks

n Block

 

- Ext2 파일시스템의 전체적인 정보를 저장하는 데이터 구조가 2개가 있는데 각각 슈퍼 블록(Super Block) 그룹 디스크립터 테이블(Group Descriptor Table) 나눠 진다.

- 슈퍼블록의 경우 가장 앞부분에 존재하며 파일 시스템의 크기와 환경 설정 값들을 저장한다. FAT NTFS 부트 레코드와 비슷할 것이다.

- 그룹 디스크립터 테이블은 슈퍼 블록 바로 다음 블록에 자리하며, 주요 데이터가 손상될 경우를 대비해 슈퍼 블록과 그룹 디스크립터 테이블의 사본이 모든 블록 그룹에 걸쳐 곳곳에 저장된다. 만약 슈퍼 블록에 문제가 있다는 것을 감지하면 다른 블록 그룹에 있는 슈퍼 블록의 복사본을 이용할  있다.

- 이런 블록 구조는 주요 데이터와 파일 데이터간의 집약도를 높여 파일을 저장할  단편화를 줄이며, 디스크 I/O 관련된 응답 속도를 줄여주는 계기가 된다.

사실 정상 동작하는 경우 커널은 0 블록 그룹의 정보만을 사용하고 나머지 블록 그룹에 속한 슈퍼 블록과 그룹 디스크립터 테이블은 업데이트 되지 않는다. 실질적으로 나머지 블록 그룹들의 정보가 이용되거나 업데이트될 때는 /sbin/e2fsck 등의 프로그램이 파일시스템의 일관성 검사 수행  블록 그룹 0 저장한 슈퍼 블록과 그룹 디스크립터 테이블을 나머지 블록 그룹에 복사한다.

 

- 블록 그룹의 개수와 크기의 경우 해당 파티션과 블록 크기에 따라 달라지는데 제약 사항이 있을 경우 그룹 내의  블록들이 할당되었는지 비었는지를   있는 블록 비트맵(Block Bitmap) 1Block 내에 저장되어야 하므로 Block Bitmap 표시할  있는 최대 블록 개수는 Ext2 파일시스템을 생성할  설정한 블록 크기를 가지고 계산할  있다.

1Byte ( bit들이 데이터 블록에 해당) X 블록 크기를 4KB 가정한다며  블록의 크기 =Block Bitmap 표시할  있는 최대 블록 개수

8bit X 4096 = 32,768bit (32KB) 이다.

 

- 1Block 4KB 경우 하나의 블록 그룹이 가질  있는 최대 블록 개수

Block Bitmap 표시할  있는 블록개수 X 1Block 최대 블록 개수 = 1블록 그룹이 가질  있는 블록 개수

32KB X 4KB = 128MB

 

- 만약 10GB 파티션에 Ext2 파일시스템을 생성하면 블록 그룹의 개수는

전체 용량 / 1블록 그룹이 가질수 있는 블록 개수 = 최대 블록 그룹 개수  것이다.

1024MB / 128MB = 80

 

 

2) 슈퍼블록(Super Block)

- 슈퍼 블록은 Ext2 파일시스템에서 사용되는 주요 설정 정보들이 기록되는 영역으로 블록 그룹의  번째 블록에 위치하며, 파일시스템에서 설정한 블록의 크기가 1KB, 4KB 실제 위치하는 곳은 같다. , 디폴트 블록 크기인 1KB 경우에 맞춰 4KB 블록일 때도 3KB 패딩되지 않는다.

- 이렇게 되는 이유는 슈퍼 블록 내에 블록 크기가 정해져 있으므로 블록의 크기에 따라서 슈퍼 블록이 기록되는 물리적 위치가 변경된다면 여러 가지로 신경 써야  부분이 늘어나게  것이다.

- 슈퍼 블록은 반드시 블록 그룹의 시작부터 1024Byte 내에 기록되어야 하며, 1024Byte 크기로 저장되어야 한다.

- 사실상 1024Byte  실제 사용되는 영역 보다 사용되지 않은 영역이  많다.

- 슈퍼 블록에는 파일 시스템의 설정 파일들이 기록되어 있고, 부트 코드가 기록되어 있지는 않으며 슈퍼 블록의 사본은 모든 블록 그룹들의  번째 블록에 저장된다.

 

- 슈퍼블록에 저장되는 주요 데이터

1_ 블록의 크기(1KB, 2KB, 4KB)

2_  블록의 개수

3_ 블록 그룹의 개수

4_ Inode 개수

5_ 그룹 내의 블록/Inode 개수

 

3) 그룹 디스크립터 테이블(Group Descriptor Table)

- 슈퍼 블록의 다음 블록부터 Group Descriptor Table  위치하며,  Table 해당 파일시스템 내의 모든 블록 그룹에 대한 정보를 기록한다.

- 각각의 정보를 Group Descriptor이라고 하며, Group Descriptor Table 슈퍼 블록과 마찬가지로 모든 블록 그룹에 동일하게 중복 기록 되어 있다.

- Group Descriptor Table 저장되는 주요 데이터

1_ Block Bitmap 블록 번호

2_ Inode Bitmap 블록 번호

3_  번째 Inode Table Block 블록 번호

4_ 그룹 안에 있는  블록 

5_ 그룹 안에 있는 Inode 

6_ 그룹 안에 있는  디렉토리 

 

- 블록 그룹의 개수와 크기를 계산 하는 부분을 보고, 그룹 디스크립터 테이블 정보를 알게 되면 그룹의 크기와 그룹 내에 남은 용량  블록 그룹의 전체적인 레이아웃을 그릴  있을 것이다.

- Group Descriptor  크기를 알아보면 32Byte 하나의 Group Descriptor 기록 된다. 기본 크기(1KB)라고 한다면 하나의 블록에  32(32Byte X 32 = 1KB)  Group Descriptor 기록될  있고, 블록 그룹의 개수가 늘어나는 만큼 테이블의 크기도 커지게 되는 것이다.

 

4) 블록 비트맵(Block Bitmap)

- Block Bitmap Group Descriptor Table 다음에 위치하며, 테이블의 크기가 일정치 않기 때문에 Block Bitmap 위치도 상황에 따라 달라진다. 따라서 Group Descriptor 정보에 Block Bitmap 위치가 포함되는 것이다.

 

- Block Bitmap  그대로 블록의 사용 현황을 Bit 표현하여 나타낸 것으로 그룹 내에 존재하는 각각의 블록은 Block Bitmap에서 하나하나의 Bit 해당하게 된다. 그래서 특정 블록이 사용되고 있으면 해당 Block Bitmap 해당 블록의 인덱스가 On(1) 된다.

 

[Block Bitmap 사용 ]

 

- 8개의 블록이 사용되는 예를 나타낸 것으로  블록이 사용되는 곳의 bit 1 표시되어 그룹 내의 블록들의 사용 현황을 알게 되면 추후 새로운 블록 할당시 어느 블록을 할당할지 검색하는 것이 빨라지게  것이다.

- Block Bitmap 하나의 블록 안에 기록되어야 하며, 블록의 크기는 1,2,4 KB 나뉘기 때문에 Block Bitmap 블록의 크기에 따라 8192, 16384, 32768개의 블록 현황을 나타낼  있다.

 

5) Inode

- Ext2 파일시스템에서 파일 객체가 저장되는 곳은 Inode 데이터 구조이며, 모든 Inode 크기는 Super Block 정의되어 있는 크기로 고정된다.

- 모든 파일과 디렉토리들은 각각 1개의 Inode 할당하며, 모든 Inode들은 고유한 주소를 가진다.(Inode 인덱스는 1부터 시작된다.)

- Inode Block Group 내의 Inode Table 저장되고, 앞서 나온 것처럼 Inode Table 위치는 Group Descriptor Table 기록된다.

- 특정 Inode 주소를 안다면 해당 Inode 속한 그룹이 어디인지 계산해   있다.

Blcok Group = (inode – 1)/ INODES_PER_GROUP

n번째 Inode 담겨 있는 Block Group = (n – 1) / INODES_PER_GROUP

 

- INODES_PER_GROUP 값은 Super Block 정의 되어 있고, (Inode-1)  이유는 Inode 인덱스가 1부터 시작하기 때문이다.

- Inode 1전부터 10번까지는 예약되어 있기 때문에 사용할  없으며, 보통 이미 할당되어 있는 상태로 되기 때문에 별도의 작업이 없으면 사용할  없다.

- 1 Inode Super Block 사용하도록 예약되어 있고, 2 Inode 루트 디렉토리로 예약되어 있다.

 

6) Inode Bitmap

- Inode Bitmap Block Bitmap 마찬가지로 1개의 Inode 1개의 Bit 대응되어 해당 블록 그룹이 관리하는 모든 Inode 현황을 나타낼  있다.

- Inode Bitmap 역시 하나의 블록안에 기록되어야 하며, 기능적으로 Block Bitmap 거의 동일하지만, 블록에 대한 정보가 Inode 대한 정보로 바뀔 뿐이다.

- Inode Bitmap Inode 사용되고 있는 현황을 나타내며, 이는 Inode 할당 또는 해제할 때보다 용이하게 쓰여진다.

 

7) Inode Table

- Inode Table 인접한 연속된 블록으로 이루어져 있으며,  블록은 미리 정의된 Inode 개수를 포함한다.

- Inode Table   번째 블록의 번호를 Group Descriptor Table 저장하며, 모든 Inode 크기가 128Byte 동일하다.

- 1024Byte 블록은 Inode 8개를 가지며, 4096Byte 블록은 32개의 Byte 가진다.

 

Count of Inode Table = INODES_PER_GROUP / INODES_PER_BLOCK

 

 

3. 슈퍼블록

1) 슈퍼블록

- Ext2 파일시스템 전체의 레이아웃을 담는 영역으로 1024Byte 내에 있는 작은 영역이지만 Ext2 파일시스템 분석을 위한 중요한 부분이다.

- Ext2 경우 데이터 영역의 기본단위를 블록으로 나타내며 이는 FAT 경우 클러스터와 의미가 비슷하다

- 이때 파일시스템의 블록을 대표하는 블록이 바로 슈퍼 블록이다.

- 블록의 기본 크기(Default Size) 1KB 지정되어 있으며, 파일 시스템 생성시 값을 달리 설정 가능 하다. 그러나 저장장치에서 슈퍼블록이 위치한 곳을 읽기 전까지는 블록 크기를 기본 1KB 보아야 한다.

 

[Block 크기별 Super Block 레이아웃]

 

-  그림과 같이 가장 앞의 1KB Boot Code 사용되는데 이때 블록크기가 1KB 4KB여도 기본적으로 Super Block 읽기 전까지는 1KB 기준이기 때문에 별다른 영향이 없게 된다.

- 블록의 크기는 1024~4096Byte 사이의 값으로 설정 가능하며, 용도에 맞게 블록 크기를 정해야 한다.

- 만약 주로 사용하는 파일들이 1KB 미만이면 블록의 크기를 1KB 해야 단편화를 줄일  있을 것이고, 반대로 주로 사용하는 파일 크기가 4KB 이상이라면 1KB 블록 크기를 설정하면 공간 낭비는 없겠지만 1Block 읽는데 4 이상의 I/O 발생하여 저장장치의 효율이 떨어질 것이다.

 

 그림에서 Boot Code Super Block 바로 옆에 나란히 위치한 것을   있지만 실제 Boot Code Block Group 0 사이에는 예약된 영역이 있게 된다. 따라서 MBR  파티션 테이블에서 파티션 시작 위치를 가져와 1024Byte 오프셋(offset) 두어야 하나 그렇지 않으면 Super Block 아닌 쓰레기 값을 읽어올  있음의 유의해야 한다.

 

2) 슈퍼블록 구조 분석

 

-  1024Byte이며 실제 사용되는 영역은 상위 264Byte 나머지 760 Byte 하위 영역은 예약된 영역이며, 들어있는 것은 쓰레기 값으로 채워져있다.

- 덤프만 가지고  영역이 Super Block 인지 확인 하는 방법은 56번지(0x38) 보게 되면 0xEF53이라고 기록되는데  부분이 Super Block Signature 이다. 다른 데이터 들과 달리 슈퍼 블록의 중간에 위치한 것이 특징이다.

 

[슈퍼 블록 영역을 출력한 ]

 

 

[Super Block 항목]

 

3) 슈퍼 블록의  항목

 

이름

inode count

위치

(Offset)

0

크기

(Size)

4 Byte

일반적인 

(Value)

가변적

설명

파일시스템에서 사용할  있는 최대 inode 개수,  값은 파일시스템 생성  저장장치의 크기에 따라 다르게 설정되며, Block 크기가 4KB 경우 Block  개수를 반으로 나눈 것보다 약간 많다.

 

이름

block count

위치

(Offset)

4

크기

(Size)

4 Byte

일반적인 

(Value)

가변적

설명

파일시스템 내의 전체 블록의 개수로  값은 파티션 테이블에서 섹터의 개수를 '블록크기/512' 값으로 나눈 수와 같다. 1 Block 크기가 4KB라면 섹터의 개수를 8 나눈 값의 소수점을 버린 값이다.

 

이름

reserved block count

위치

(Offset)

8

크기

(Size)

4 Byte

일반적인 

(Value)

가변적

설명

block count 5% 값을 가지며,  값은 아무 대책 없이 파일시스템이  차는 경우를 막기 위해 존재하며, 일종의 예약 영역을 가리키기 위해 있다.

 

이름

free block count

위치

(Offset)

12

크기

(Size)

4 Byte

일반적인 

(Value)

가변적

설명

사용되고 있지 않은(비어 있는) 블록의 개수 이다.

 

이름

free inode count

위치

(Offset)

16

크기

(Size)

4 Byte

일반적인 

(Value)

가변적

설명

사용되고 있지 않은 inode 개수 이다.

 

이름

first data block

위치

(Offset)

20

크기

(Size)

4 Byte

일반적인 

(Value)

0

설명

 번째 블록,  블록 그룹 0 시작되는 블록을 가리킨다.

 

이름

log block size

위치

(Offset)

24

크기

(Size)

4 Byte

일반적인 

(Value)

0 또는 1 또는 2

설명

블록의 크기를 지정하는 값으로

0 : 1KB, 1 : 2KB, 2 : 4KB 의미한다.

블록의 크기는 1,024 좌측으로 log block size 만큼 시프트(shift)해서 구한다.

 

이름

log fragmentation size

위치

(Offset)

28

크기

(Size)

4 Byte

일반적인 

(Value)

0또는 1또는 2

설명

단편화(Fragmentation) 발생  기록되는 크기로서, log block size 같이 0,1,2 표현한다.

 

이름

block per group

위치

(Offset)

32

크기

(Size)

4 Byte

일반적인 

(Value)

가변적

설명

 블록 그룹에 속한 블록 개수

 

이름

fragmentation per group

위치

(Offset)

36

크기

(Size)

4 Byte

일반적인 

(Value)

가변적

설명

 그룹에 속한 단편화된 개수

 

이름

inode per group

위치

(Offset)

40

크기

(Size)

4 Byte

일반적인 

(Value)

가변적

설명

 블록 그룹에 속한 inode 개수

 

이름

mtime

위치

(Offset)

44

크기

(Size)

4 Byte

일반적인 

(Value)

가변적

설명

마지막으로 파일시스템을 마운트한 시간

 

이름

wtime

위치

(Offset)

48

크기

(Size)

4 Byte

일반적인 

(Value)

가변적

설명

마지막으로 슈퍼 블록을 갱신한 시간

 

이름

mount count

위치

(Offset)

52

크기

(Size)

2 Byte

일반적인 

(Value)

가변적

설명

파일시스템을 마운트한 횟수로 이를 기록하는 이유는 사용횟수에 따라 파일시스템을 체크하도록 하기 위해서이다.  시점은 아래 max mount count 가까워지는 경우 체크하며,  count 갱신되는 시점은 e2fsck 실행하는 시점이다.

 

이름

max mount count

위치

(Offset)

54

크기

(Size)

2 Byte

일반적인 

(Value)

가변적

설명

파일 시스템을 마운트할  있는 최대 횟수

 

이름

magic signature

위치

(Offset)

56

크기

(Size)

2 Byte

일반적인 

(Value)

0xEF53

설명

Super Block Magic Signature super Block인지 확인하는 값이다.

 

이름

state

위치

(Offset)

58

크기

(Size)

2 Byte

일반적인 

(Value)

1

설명

파일시스템의 상태를 나타낸다.

 

[파일시스템의 상태 ]

파일시스템 상태

설명

EXT2_VALID_FS

0x0001

정상

EXT2_ERROR_FS

0x0002

에러가 발생한 경우

 

 

이름

error

위치

(Offset)

60

크기

(Size)

2 Byte

일반적인 

(Value)

0

설명

에러 처리를 위한 플래그

 

[Super Block 에러 플래그]

에러 플래그

설명

EXT2_ERRORS_CONTINUE

0

정상

EXT2_ERRORS_RO

1

Read-Only 경우

EXT2_ERRORS_PANIC

2

패닉 상태

EXT2_ERRORS_DEFAULT

EXT2_ERRORS_CONTINUE(0)

기본 (정상)

 

 

이름

minor version

위치

(Offset)

62

크기

(Size)

2 Byte

일반적인 

(Value)

가변적

설명

파일시스템의 마이너(minor) 버전

 

이름

last consistency check time

위치

(Offset)

64

크기

(Size)

4 Byte

일반적인 

(Value)

가변적

설명

e2fsck 등의 프로그램이 파일시스템의 영속성을 위해 마지막으로 체크한 시간

 

이름

check interval

위치

(Offset)

68

크기

(Size)

4 Byte

일반적인 

(Value)

0

설명

s_lastcheck 시간을 비교하여 파일시스템의 영속성을 위한 체크가 필요한 시간에 이르면 파일시스템을 마운트   e2fsck 실행을 요구하는 메시지를 화면에 출력

 

이름

creator os

위치

(Offset)

72

크기

(Size)

4 Byte

일반적인 

(Value)

0

설명

파일시스템을 생성한 운영체제를 나타낸다.

 

[파일시스템을 생성한 OS 식별자]

OS 실별자

설명

EXT2_OS_LINUX

0

Linux

EXT2_OS_HURD

1

GUN Hurd

EXT2_OS_MASIX

2

Masix

EXT2_OS_FREEBSD

3

Free BSD

EXT2_OS_LITES

4

Lites

 

 

이름

major version

위치

(Offset)

76

크기

(Size)

4 Byte

일반적인 

(Value)

가변적

설명

파일시스템의 메이저(major)버전

아래 표의 Dynamic Version Inode 크기가 고정되어 있지 않음을 의미하지만 현재 리눅스 커널은 Dynamic Version 지원하지 않으며 앞으로 사용될 여지는 많지 않다.

 

[파일시스템의 메이저 버전]

OS 실별자

설명

Original Version

0

고정된 Inode 크기

Dynamic Version

1

고정되지 않은 Inode 크기

 

 

이름

UID that can use reserved blocks

위치

(Offset)

80

크기

(Size)

2 Byte

일반적인 

(Value)

가변적

설명

예약된 Block 사용할지의 여부와 관련된 사용자 ID

 

이름

GID that can use reserved blocks

위치

(Offset)

82

크기

(Size)

2 Byte

일반적인 

(Value)

가변적

설명

예약된 Block 사용할지의 여부와 관련된 Group ID

 

이름

first non-reserved inode

위치

(Offset)

84

크기

(Size)

4 Byte

일반적인 

(Value)

11

설명

예약되지 않은 inode  번째 인덱스. 일반적으로 Ext2 파일시스템은 10개의 Inode 예약되 있다.

 

이름

inode structure size

위치

(Offset)

88

크기

(Size)

2 Byte

일반적인 

(Value)

128

설명

Inode 구조체의 크기를 나타냄

 

이름

block group number

위치

(Offset)

90

크기

(Size)

2 Byte

일반적인 

(Value)

가변적

설명

현재의 Super Block 포함하고 있는 Block Group 번호, Super Block 모든 Block Group에서 복사본을 가지며, 해당 Block Group 번호를 의미한다.

또한 Super Block 원본인지 복사본인지 파악을 위해 사용된다.

 

이름

compatible feature flags

위치

(Offset)

92

크기

(Size)

4 Byte

일반적인 

(Value)

가변적

설명

파일시스템에서 지원하는 속성 플래그

 

[파일시스템의 확장속성 지원 가능 플래그]

확장 지원 가능 플래그

설명

EXT2_FEATURE_COMPAT_DIR_PREALLOC

0x0001

단편화를 줄이기 위해 미리 할당된 디렉토리 블록 지원 유무

EXT2_FEATURE_COMPAT_IMAGIC_INODES

0x0002

AFS 서버 Inode 지원 유무

EXT2_FEATURE_COMPAT_HAS_JOURNAL

0x0004

Journaling 지원하는지 유무(Ext3 지원 유무)

EXT2_FEATURE_COMPAT_EXT_ATTR

0x0008

Inode 확장 속성을 기록 하는지의 유무

EXT2_FEATURE_COMPAT_RESIZE_INO

0x0010

파일시스템이 파티션의 크기에 따라 크기를 늘릴  있는지의 유무

EXT2_FEATURE_COMPAT_DIR_INDEX

0x0020

디렉토리에 Hash Index 사용하는지의 유무

EXT2_FEATURE_COMPAT_ANY

0xffffffff

확장 속성을 모두 지원하는 경우

 

 

이름

incompatible feature flags

위치

(Offset)

96

크기

(Size)

4 Byte

일반적인 

(Value)

가변적

설명

파일시스템에서 지원하지 않은 속성 플래그

 

[파일시스템의 확장속성 지원 불가능 플래그]

확장 지원 가능 플래그

설명

EXT2_FEATURE_INCOMPAT_COMPARESSON

0x0001

압축을 지원하지 않는지의 유무

EXT2_FEATURE_INCOMPAT_FILETYPE

0x0002

디렉토리 엔트리가 파일 타입 속성을 포함하지 않는지의 유무

EXT2_FEATURE_INCOMPAT_RECOVER

0x0004

파일시스템의 복구가 필요하지 않은지의 유무

EXT2_FEATURE_INCOMPAT_JOURNAL_DEV

0x0008

파일시스템이 journaling 지원하지 않는 장치를 사용하는지의 유무

EXT2_FEATURE_INCOMPAT_META_BG

0x0010

파일시스템이 메타 Block Group 지원하지 않는지의 유무

EXT2_FEATURE_INCOMPAT_ANY

0x0020

위의 모든 속성을 지원하지 않는지의 유무

 

 

이름

read-only feature flags

위치

(Offset)

100

크기

(Size)

4 Byte

일반적인 

(Value)

가변적

설명

Super Block에서 읽기전용(Read Only) 속성인 플래그

 

[파일시스템의 읽기 전용 플래그]

확장 지원 가능 플래그

설명

EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER

0x0001

Super Block Group Descriptor Table 산재해 있는지 관련 플래그

EXT2_FEATURE_RO_COMPAT_LARGE_FILE

0x0002

대용량 파일 지원 유무와 관련된 플래그

EXT2_FEATURE_RO_COMPAT_BTREE_DIR

0x0004

디렉토리 구조가 B-TREE 구조로 되어 있는지와 관련된 플래그

EXT2_FEATURE_RO_COMPAT_ANY

0xffffffff

 모든 속성을 포함하는 플래그

 

이름

UUID(FileSystem ID)

위치

(Offset)

104

크기

(Size)

16 Byte

일반적인 

(Value)

가변적

설명

파일시스템의 식별자

 

이름

volume name

위치

(Offset)

120

크기

(Size)

16 Byte

일반적인 

(Value)

가변적

설명

볼륨명

 

이름

last mounted path

위치

(Offset)

136

크기

(Size)

64 Byte

일반적인 

(Value)

가변적

설명

마지막으로 마운트되었던 지점의 경로

 

이름

algorithm usage bitmap

위치

(Offset)

200

크기

(Size)

4 Byte

일반적인 

(Value)

가변적

설명

비트맵 저장과 관련된 알고리즘, 압축과 관련된 알고리즘을 의미

 

이름

preallocated blocks count

위치

(Offset)

204

크기

(Size)

1 Byte

일반적인 

(Value)

가변적

설명

파일을 기록하기 위해 미리 할당된 블록의 개수

 

이름

preallocated dir blocks count

위치

(Offset)

205

크기

(Size)

1 Byte

일반적인 

(Value)

가변적

설명

디렉토리를을 기록하기 위해 미리 할당된 블록의 개수

 

이름

padding

위치

(Offset)

206

크기

(Size)

2Byte

일반적인 

(Value)

가변적

설명

4Byte 정렬(alignment) 위한 패딩

 

이름

journal UUID

위치

(Offset)

208

크기

(Size)

16 Byte

일반적인 

(Value)

가변적

설명

Journal ID

 

이름

journal inode number

위치

(Offset)

224

크기

(Size)

4 Byte

일반적인 

(Value)

가변적

설명

Journal Inode 번호

 

이름

journal device

위치

(Offset)

228

크기

(Size)

4 Byte

일반적인 

(Value)

가변적

설명

Journalling 가능 장치

 

이름

orphan inode list

위치

(Offset)

232

크기

(Size)

4 Byte

일반적인 

(Value)

가변적

설명

부모 inode 잃어버린 inode 리스의 head 포인터

 

이름

hash seed

위치

(Offset)

236

크기

(Size)

16 Byte

일반적인 

(Value)

가변적

설명

해싱 알고리즘을 위해 사용되는 기본 해시 코드

 

이름

defined hash version

위치

(Offset)

252

크기

(Size)

1 Byte

일반적인 

(Value)

가변적

설명

해시 코드 버전

 

이름

padding

위치

(Offset)

253

크기

(Size)

1 Byte

일반적인 

(Value)

가변적

설명

1Byte 패딩 영역

 

이름

padding

위치

(Offset)

254

크기

(Size)

2 Byte

일반적인 

(Value)

가변적

설명

2Byte 패딩 영역

 

이름

default mount option

위치

(Offset)

256

크기

(Size)

4 Byte

일반적인 

(Value)

가변적

설명

마운트 옵션

 

이름

first meta block

위치

(Offset)

260

크기

(Size)

4 Byte

일반적인 

(Value)

가변적

설명

 번째 데이터 블록 번호

 

이름

reserved

위치

(Offset)

264

크기

(Size)

760 Byte

일반적인 

(Value)

가변적

설명

1024Byte 채우기 위한 패딩 영역

 

 

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

 

1) 그룹 디스크립터 테이블

- Super Block 바로 다음에 위치한 데이터 구조로, 모든 블록 그룹에 대한 Descriptor 가지고 있기 때문에 Descriptor Table 또는 Descriptor List 부른다.

- Super Block 마찬가지로 파일시스템 내의 모든 블록 그룹들이 Group Descriptor Table 복사본을 가지고 있다.

 

2) 그룹 디스크립터 테이블 구조 분석

[Group Descriptor Table 영역을 출력한 ]

 

-  덤프한 그림은, Super Block 바로 다음 블록에서부터 위치한 Group Descriptor Table 덤프 영역을 출력한 것으로 512Byte 덤프 하였지만 실제 Group Descriptor 개수는 정해져 있지 않다. 따라서 Super Block에서 간단한 연산을 통해 파티션 내에 존재하는 Block Group 개수를 파악한   만큼의 데이터를 파일시스템에서 읽어와야 한다.

 

[Group Descriptor 항목]

 

3) 그룹 디스크립터 테이블의  항목

 

이름

starting block address of block bitmap

위치

(Offset)

0

크기

(Size)

4 Byte

일반적인 

(Value)

가변적

설명

Block Bitmap 블록 번호로  값이 필요한 이유는 Group Descriptor Table 크기가 고정되어 있지 않고 바로 다음에 위치하는 Block Bitmap 위치를 나타내기 위함이다.

만약 Group Descriptor Table 1Block 안에 모드 들어간다면  항목의 값은 2 된다.

 

이름

starting block address of inode bitmap

위치

(Offset)

4

크기

(Size)

4 Byte

일반적인 

(Value)

가변적

설명

Inode Bitmap 블록 번호로 bg_inode_bitmap 항목도 bg_block_bitmap 항목과 마찬가지로 블록의 위치를 나타내기 위한 값으로, Block Bitmap 고정적으로 1Block 사용하므로  항목의 값은 보통 "block bitmap 번호 +1" 된다.

위의 덤프를 출력한 것을 보게 되면  번째 항목과 2번째 항목간에 1 차이를   있다.

 

이름

starting block address of inode table

위치

(Offset)

8

크기

(Size)

4 Byte

일반적인 

(Value)

가변적

설명

Inode Table 블록 번호로 실제 Inode 데이터가 다민 블록이 시작되는 블록의 번호이다.

 

이름

free blocks count

위치

(Offset)

12

크기

(Size)

2 Byte

일반적인 

(Value)

가변적

설명

Block Group 내의 비어있는 블록 수로 블록은 실질적으로 데이터가 저장되는 기본 단위이기 때문에  값은 데이터가 저장될 그룹을 결정하는  중요한 요소가 된다.

(가능하면 비어있는 블록이 많은 블록 그룹이 우선순위로 결정된다.)

 

이름

free inode count

위치

(Offset)

14

크기

(Size)

2 Byte

일반적인 

(Value)

가변적

설명

블록 그룹 내의 비어있는 Inode . 사용 가능한 Inode 개수가 정해져 있으므로 비어있는 Inode 개수도 따로 존재한다. 그러나 데이터가 저장되는 기본 단위가 블록이므로 Inode 부족할만한 상황은 걱정하지 않아도 되는 것이다.

 

이름

directories count

위치

(Offset)

16

크기

(Size)

2 Byte

일반적인 

(Value)

가변적

설명

Block Group 내에 생성된 디렉토리 . 디렉토리 수는 데이터를 저장할  저장할 그룹을 결정하는 주요 요소  하나이다.

일반적으로 특정 디렉토리 하위 파일들을 부모 디렉토리와 같은 그룹에 위치하도록 알고리즘이 짜여지기 때문에 디렉토리가 있다는 것은 그만한 여유 공간을 필요로 하나는 것이다. 이러한 이유로 디렉토리가 많을수록 우선 순위가 낮아지게 되는 것이다.

 

이름

padding

위치

(Offset)

18

크기

(Size)

2 Byte

일반적인 

(Value)

가변적

설명

4Byte 단위 정렬(alignment) 위한 패딩(padding) 영역이다.

 

이름

reserved

위치

(Offset)

20

크기

(Size)

12 Byte

일반적인 

(Value)

가변적

설명

예약된 영역. 32 Byte 맞추기 위해 12Byte 패딩하기 위한 영역이다.

+ Recent posts