그룹 디스크립터 테이블 (Group Descriptor Table)
+ 블록 그룹 안에서 슈퍼블록 다음에 위치한다.
+ Group Descriptor 라고 불리는 파일 시스템의 블록 그룹들에 대한 정보를 가지고 있다.
+ 그룹 디스크립터 테이블에 저장되는 주요 데이터는 Block Bitmap의 블록 번호, Inode Bitmap의 블록 번호, 첫 번째 Inode Table Block의 블록번호, 그룹 안에 있는 빈 블록 수, 그룹 안에 있는 Inode 수, 그룹 안에 있는 빈 디렉토리 수 등이다.
+ Group Descriptor 의 크기는 32Byte로, 블록 크기가 1KB라면 하나의 블록에 총 32개의 Group Descriptor가 기록될 수 있다.
+ 서로 연결되어 있어서 전체적으로는 하나의 Group Descriptor Table을 형성하며 파일 시스템이 Mount될 때, 커널은 Group 0에 들어있는 Group Descriptor Table을 읽는다.
+ 주요 Data이기 때문에 손상 될 경우를 대비하여 모든 Block Group에 사본이 저장되어 있어 Group Descriptor Table이 문제가 있을 시 다른 Block Group에 있는 Group Descriptor Table의 복사본을 이용할 수 있다.
주요 저장 내용
- Block Bitmap의 블록 번호
- Inode Bitmap의 블록 번호
- 첫 번째 Inode Table Block의 블록 번호
- 그룹 안에 있는 빈 블록 수
- 그룹 안에 있는 Inode 수
- 그룹 안에 있는 빈 디렉토리 수
블록 비트맵 (Block Bitmap)
+ 블록 그룹에서 그룹 디스크립터 테이블 다음으로 위치하지만, 정확한 위치는 정해져있지 않다.
+ 그룹 디스크립터 테이블의 크기가 일정하지 않기 때문이다.
+ 블록 비트맵(Block Bitmap)은 블록의 사용현황을 bit 표현으로 나타낸다.
+ 각 비트에 해당하는 블록이 사용중이면 1, 사용중이지 않으면 0 으로 나타낸다
아이노드 비트맵 (Inode Bitmap)
+ Block Bitmap 처럼 bit 표현을 이용하여 Block Group이 관리하는 모든 Inode의 사용 현황을 나타낸다
아이노드 테이블 (Inode Table)
+ 인접하는 연속된 블록으로 이루어져 있으며, 각 블록은 미리 정의된 Inode 개수를 포함한다.
+ Inode의 첫 번째 블록의 번호를 Group Descriptor Table에 저장한다.
+ 모든 Inode의 크기는 128Byte로 동일하다. 1024Byte의 Inode Table Block은 Inode 8개를 가질 수 있으며 4096byte의 Inode Table Block은 32개의 Inode를 가진다.
아이노드 (Inode)
+ Inode는 파일이나 디렉토리의 모든 정보를 가지고 있는 자료 구조를 말한다.
+ 파일 객체가 저장되는 곳이다.
+ Inode의 크기는 슈퍼 블록에서 정의된 크기로 고정된다.
+ 모든 파일들과 디렉토리들은 각각 1개의 Inode를 가지고 있으며, 모든 Inode들은 고유한 주소를 가지고 있다.
+ inode의 주소를 알고 있다면 해당 Inode가 속한 블록 그룹이 어디인지 계산하여 알아낼 수 있다.
+ 시스템 측면에서는 Inode 번호로 파일을 처리하는데 이는 파일 이름이 Inode 번호와 함께 디렉토리 안에 저장되어 있기 때문이다.
+ Inode 는 파일의 이름을 제외한 해당 파일의 모든 정보를 가지고 있으며, Inode Table 에서 해당 파일이나 디렉터리의 Inode 번호를 찾게 되면 모든 정보를 알 수 있다.
+ File System을 처음 생성(초기화) 하면 지정된 개수만큼 Inode들이 생성되며, 생성된 Inode들의 개수는 그 파일 시스템이 갖고 있을 수 있는 최대 File의 수이다. 이 값은 파일 시스템을 다시 초기화하지 않는 이상 변경할 수 없다.
+ Innode 1번은 Super Block, 2번은 루트 디렉토리이며, 10번까지는 예약되어 있기 때문에 사용할 수 없다.
- Ext2에 대한 커널 문서의 인용에 따르면 다음과 같다. “ 아이노드에서 파일의 데이터를 포함하는 첫 12블록의 포인터가 있다 ( 블록의 다음 세트에 포인터를 포함하는) 간접 블록에 대한 포인터, (간접 블록에 대한 포인터를 포함하는) 이중 간접 블록에 대한 포인터, 그리고 (이중 간접 블록에 대한 포인터를 포함하는) 삼중-간접 블록에 대한 포인터가 있다.
+ Ext2 내부는 15개의 포인터가 있는 구조며 그 중 처음부터 12번까지는 직접 블록을 위한 것이다.
+ 13번 포인터는 간접 블록을, 14번째 블록은 이중 간접 블록을, 그리고 15번째 포인터는 삼중 간접 블록을 가리킨다.
+ 만약 각 데이터 Block의 크기가 8KB이라면, 최대 파일 크기는 약 64TB이다.
+ Direct Block Point = 8KB * 12개 = 96KB
+ Indirect Block Pointer = 8KB * 2048개 = 16,384KB
+ Triple Indirect Pointer = 8KB * 2048개 * 2048개 = 33,554,432KB
+ 그리고 데이터 Block의 크기가 4KB인 경우 최대 파일 크기는 약 4TB이다.
주요 저장내용
- Inode Number
- 파일모드 : 파일과 관계된 접근과 실행 권한을 저장하는 16비트 플래그
12-14비트 : 파일형식
9-11비트 : 실행 플래그(setuid, setgid, stiky bit)
8 : 소유자 읽기 허가
7 : 소유자 쓰기 허가
6 : 소유자 실행 허가
5 : 그룹 읽기 허가
4 : 그룹 쓰기 허가
3 : 그룹 실행 허가
2 : 다른 사용자 읽기 허가
1 : 다른 사용자 쓰기 허가
0 : 다른 사용자 실행 허가
- 하드 링크 수 : 이 아이노드에 대한 디렉터리 참조 수
- 소유자 ID : 파일의 개별 소유자
- 파일 크기 : 파일의 바이트 수
- 마지막 접근 : 마지막으로 파일에 접근한 시각
- 마지막 수정 : 마지막으로 파일을 수정한 시각
- Inode 수정 : 마지막으로 Inode를 수정한 시각
- 데이터 Block 수 : 파일의 실제 데이터가 저장된 위치(Block 주소(번호))를 가리키는 15개의 포인터 배열
디렉토리 블록에서 아이노드 넘버를 통해 데이터를 찾아가는 절차
데이터 블록 ( Data Block )
+ 파일에서 데이터를 저장하는 블록으로 일반 파일이나 디렉터리의 파일의 데이터가 존재한다.
+ Inode에 포함되어 있으며 Inode는 몇 개의 데이터 블록을 포함한다.
디렉토리 블록 ( Directory Block )
+ ext2 파일 시스템에서 디렉토리는 파일 시스템 상에서 파일에 대한 접근 경로를 생성하고 저장하는 특별한 의미의 파일로 취급한다.
+ 각각의 디렉토리는 디렉토리 엔트리의 리스트로 나타낸다.
간접 블록 ( Indirection Block )
+ 추가적인 데이터 블록을 위한 포인터들이 사용할 동적으로 할당되는 공간이다.
+ Inode가 가지고 있는 데이터 블록보다 더 많은 데이터 블록이 필요한 경우 이를 지정하기 위해 포인터를 사용하는데, 그때 사용하기 위한 동적인 블록이다.
홀 ( Hole )
+ Inode 나 간접 블록 안의 데이터 블록의 주소로 특별한 값을 저장한다.
+ 파일 시스템에 의해서 파일 안에 자리하게 되며, 실질적으로 디스크 상에 공간은 할당 되지 않는다.
+ 단지 0byte가 파일 안에서 특정 공간을 차지하고 있다고 가정하는 것이다.