파일시스템
+ 하드 디스크나 CD-ROM 같은 실제 자료 보관 장치를 사용해 파일의 물리적 소재를 관리하는 것을 가리킨다.
+ 네트워크 프로토콜(NFS, SMB 9P 등)을 수행하는 클라이언트를 통하여 파일 서버 상의 자료로의 접근을 제공하는 방식과 가상의 형태로서 접근 수단만이 존재하는 방식(procfs등)도 파일 시스템의 범위에 포함될 수 있다.
리눅스 파일시스템
+ 리눅스에서 지원하는 파일 시스템은 ext, ext2, minix, xiafs, msdos, hpfs OS/2, isofs CD-ROM, umsdos, nfs, sysv 등이 있다.
+ 본 문서에서는 ext, ext2, ext3, ext4에 대해 살펴보고자 한다.
01 확장 파일 시스템(extended file system)
ext
+ 리눅스 초기에 사용되던 파일 시스템이며 호환성이없다. ext2의 원형이다.
ext2
+ ext3가 개발되기 이전까지 가장 많이 사용된 파일 시스템.
+ 리눅스 파일 시스템 대부분의 기능을 제공하는 파일 시스템이다.
+ ext2는 뛰어난 안정성과 속도로 가장 유명한 파일시스템으로 자리잡았고 ext3또한 ext2에 기반을 두어 개발되었다.
+ 호환이 쉬우며 업그레이드도 쉽게 설계되었다.
ext3
+ ext2 파일시스템에 저널링을 지원하도록 확장된 파일시스템이다. 현재 리눅스에 가장 많이 사용되고 있다.
ext4
+ ext3 파일시스템을 확장한 파일시스템으로 Extend 라는 기능을 제공한다.
+ 파일에 디스크 할당시 물리적으로 연속적인 블록을 할당할 수 있도록 하여, 파일 접근 속도 향상 및 단편화를 줄이도록 설계된 파일시스템이다.
+ 파일 확장자는 필요없으며 파일의 특성을 알리기 위해 확장자 (*.c, *.java)사용이 가능하다
+ ‘.’ 으로 시작하는 파일은 숨겨진 파일 ( ‘ls -a’ 명령으로 보임)
+ ‘.’ 은 현재 디렉토리, ‘..’은 부모 디렉토리
+ 파일 시스템의 크기는 최대 2Tib ~ 16 TiB( 변동 가능)
02 ext2 파일 시스템 구조 (extended file system)
+ ext2 파일 시스템은 비교적 속도가 빠르고 안정적인 UFS(Unix FileSystem)을 기반으로 필요한 기능을 추려서, 보다 단순하게 만들어졌다.
+ 따라서 ext2는 분석, 이해하기가 쉽다. 다음은 ext2 파일시스템의 레이아웃이다.
+ ext2 파일시스템은 부트섹터(Boot Sector) 와 여러 개의 블록 그룹(Block Group)으로 구성된다.
+ 블록이란 파일시스템에서 데이터를 저장하는 단위이며, 메모리에서 I/O 작업을 한 번 거칠때 읽거나 쓰는 단위가 된다.
+ 파일시스템을 생성할 때 1KB ~ 4KB 사이에서 블록의 크기를 지정가능하다.
+ 각 블록 그룹에는 파일시스템을 구성하는 정보들이 담겨져 있다.
+ 가장 마지막의 블록 그룹을 제외하고는 모든 블록 그룹들이 같은 블록 개수를 가지며, 여기에 파일 이름, meta data, 파일 데이터가 기록된다.
블록 그룹 ( Block Group)
+ 블록그룹은 블록들의 모임이며, OS 커널이 같은 파일에 속하는 데이터 블록은 같은 블록 그룹에 저장하려고 노력하기 때문에 파일의 단편화를 줄일 수 있다.
+ 파일 시스템의 전체적인 정보는 슈퍼 블록(Super Block)과 그룹 디스크립터 테이블(Group Descriptor Table)에 저장된다.
+ 슈퍼 블록과 그룹 디스크립터 테이블은 0번 블록 그룹의 정보만을 사용하지만 주요 데이터이기 때문에 손상될 경우를 대비하여 모든 블록 그룹에 사본이 저장되어 있다.
+ 블록 그룹의 개수와 크기는 해당 파티션의 블록의 크기에 따라 달라진다.
+ 그룹 내의 각 블록들이 할당되어 있는지 비어있는 지를 알 수 있는 블록 비트맵이 1Block 안에 저장되어야 한다.
+ 설정한 블록의 크기가 4KB일 때 8bit * 4096 Byte = 32,768개, 각 bit당 하나씩의 데이터 블록에 해당하므로 Block Bitmap이 표현하라 수 있는 블록의 총 개수는 32,768개가 된다.
+ 한 블록이 4KB인 경우, 32KB * 4KB = 128MB, 하나의 블록 그룹은 최대 128MB의 블록을 가질 수 있다.
+ 또한 10GB의 파티션에 Ext2 파일시스템을 생성한다면 10240MB / 128MB = 80개 의 블록 그룹 파티션이 생성된다.
+ 따라서 파티션마다 생성되는 블록 그룹의 개수는 다르며, 블록의 크기가 작을수록 블록 그룹의 개수가 많아지게 된다.
주요 저장 내용
- 슈퍼블록 ( Superblock - 1 Block)
- 그룹 디스크립터 테이블 (Group Descriptor Table- n Block)
- 블록 비트맵 (Block Bitmap - 1 Block)
- I-노드 비트맵 (Inode Bitmap - 1 Block)
- I-노드 테이블( Inode Table - n Block)
- 파일 데이터 블록 ( File Data Blocks - n Block )
슈퍼 블록 (Super Block)
+ 파일 시스템의 블록을 대표하는 블록으로, Ext2 파일시스템에서 사용되는 주요 설정 정보들이 기록되어 있는 영역이다.
+ 블록의 크기에 관계없이 항상 블록그룹의 첫 번째 블록에 위치한다.
+ 슈퍼블록은 반드시 1KB인 경우에 맞춰서 저장된다.
+ 만약 블록의 크기가 4KB라면 슈퍼블록은 한 블록을 모두 차지하며, 1KB만 사용하고 나머지 3KB는 사용하지 않고 비워둔다.
+ 각 Group마다 Super Block의 내용은 동일하며 만약 다르면 파일 시스템이 손상된 것이다.
+ 파일 시스템이 Mount 될 때, 커널은 Group 0에 들어 있는 Super Block을 읽는다.
+ 주요 Data이기 때문에 손상 될 경우를 대비하여 모든 Block Group에 사본이 저장되어 있어 Super Block이 문제가 있을 시 다른 Block Group에 있는 Super Block의 복사본을 이요할 수 있다.
+ 슈퍼 블록에 저장되는 주요 데이터는 블록의 크기(1KB, 2KB, 4KB), 총 블록의 개수, 블록 그룹의 개수, Inode의 개수, 그룹 내의 블록/Inode의 개수이다.
주요 저장내용
- 파일시스템에 의존하는 정보인 파일 시스템의 크기
- 마운트 정보
- 데이터 블록의 총 숫자
- Inode의 총 숫자
- 블록 그룹번호
- 블록의 크기 (1KB, 2KB, 4KB, 8KB)
- 그룹 당 블록 수
- 슈퍼 블록이 수정되었음을 알리는 정보
- 매직 넘버 - Magic Number 는 마운트하는 소프트웨어에게 ext2 파일 시스템의 슈퍼 블록임을 확인하게 하는 값이다. 현재 ext2 파일 시스템에서 매직 넘버값은 0xEF53이다.
- 개정 레벨 - Revision Level은 Major level과 Minor Level로 구성되어 있으며, 개정 레벨의 역할은 마운트 프로그램이 어떤 특정한 버전에서만 지원되는 기능이 이 파일 시스템에서 지원되는지에 대한 확인을 위해 사용된다. 또한 개정 레벨은 기능 호환성 항목을 포함하여 마운트 프로그램이 해당 파일 시스템에서 안정적으로 사용할 수 있는 기능이 무엇인지 판단할 수 있는 기준을 제공한다.
- 마운트 횟수와 최대 마운트 횟수 - 시스템은 Mount Count 와 Maximum Mount Count의 2가지 정보를 이용하여 파일 시스템 전체를 검사할 필요가 있는지 확인할 수 있다. Mount Count는 마운트가 실행될 때 마다 1씩 그 값이 증가하며 만약 Mount Count가 Maximum Mount Count에 도달하게 되면 시스템은 e2fsck를 실행하라는 메시지를 내보낸다.
- 블록 크기 - Block Size는 파일 시스템의 블록 크기를 표시한다. 블록 크기는 byte단위로 표시된다.
- 그룹 당 블록 수 - Blocks Per Group 은 하나의 그룹에 속한 블록의 수를 나타낸다. 이 수는 블록의 크기와 마찬가지로 파일 시스템을 만들 때 결정된다.
- 프리 블록 - 파일 시스템 내부적으로 존재하는 Free Block의 수를 나타낸다
- 프리 아이노드 - 파일 시스템 내부적으로 존재하는 Free Inode의 수를 나타낸다.
- 첫 번째 아이노드번호 - 파일 시스템 내부적으로 존재하는 First Inode의 번호를 나타낸다. 리눅스 시스템에서 ext2 파일 시스템의 첫 번째 아이노드는 ‘/‘ 디렉토리에 대한 디렉토리 엔트리를 나타낸다