Ext2

역사

리눅스의 초기 개발은 미닉스 운영 체제의 교차 개발로 만들어졌다. 당연히 미닉스 파일 시스템이 리눅스의 첫 번째 파일 시스템이 되었다. 미닉스 파일 시스템은 대부분 버그가 없었으나, 16비트 오프셋을 사용했기 때문에 최대 크기가 64 메가바이트로 제한되었다. 또한 파일명을 14자밖에 쓸 수 없었다. 이런 제한 때문에, 기존 파일 시스템을 리눅스를 위한 파일 시스템으로 대체하는 작업이 시작되었다.
새 파일 시스템의 추가를 완화하고 일반 파일 API를 제공하기 위해 VFS, 즉 가상 파일 시스템 레이어가 리눅스 커널에 추가되었다. 확장 파일 시스템(ext)는, 1992년 4월에 VFS API를 사용한 파일 시스템으로 처음 발표되었고 리눅스 버전 0.96c에 포함되었다. ext 파일 시스템은 미닉스 파일 시스템의 두 가지의 주요 문제(최대 파티션 크기와 파일 이름 14자 제한)를 해결하였으며, 2 기가바이트의 데이터와 255자의 파일명 제한을 허용하였다. 그렇지만 여전히 파일 접근에 대한 타임 스탬프, 아이노드 수정, 그리고 데이터 수정을 지원하지 않는 문제가 있었다.
그 문제의 해결 방법으로, 1993년 1월에 새로운 두 파일 시스템 xiafs와 버클리 고속 파일 시스템으로부터 많은 아이디어를 통합하여 확장 파일 시스템을 재검토하는 이차 확장 파일 시스템(ext2, seconday extended file system)이 개발되었다. ext2는 또한 다음 버전에서 사용할 많은 디스크상 데이터의 남은 공간에 대한 확장성을 염두에 두고 설계되었다.
그 때부터, ext2는 VFS API에 여러 가지 새 확장에 대한 테스트베드를 해 왔다. POSIX 접근 제어 목록과 확장 속성은 보통 ext2에 먼저 구현되었는데, 이는 ext2가 상대적으로 확장이 단순하였고 그 내부 구조가 이해하기 쉽게 되어있었기 때문이다.
2.6.17 이전의 리눅스 커널에서 ext2 파일 시스템에 대한 블록 드라이버 크기 제한이 최대 2 테라바이트였다.
ext2는 여전히 부팅 가능한 USB 플래시 드라이브와 다른 솔리드 스테이트 드라이브에서 저널링 파일 시스템 이상을 권장하고 있다. ext2는 저널링을 쓸 필요가 없기 때문에 ext3보다 적은 쓰기를 수행한다. 플래시 칩이 노화되는 주요 원인은 지우기 사이클의 개수이며, 이는 쓰기를 할 때 빈번히 나타나고, 감소된 쓰기작업은 솔리드 스테이트 디바이스의 수명을 증가시킨다. 같은 이유로, 플래시 장치상의 파일 시스템에 대해서는 noatime 마운트 옵션을 사용하는 것이 좋다.

ext2 데이터 구조

ext2 공간은 블록으로 나뉘어 있다. 이 블록은 블록 그룹으로 나뉘는데, 이는 유닉스 파일 시스템의 실린더 그룹과 비슷하다. 일반적으로 거대한 파일 시스템에 수천개의 블록이 있다. 주어진 파일의 데이터는 가능한 한 하나의 블록 그룹 내에 포함되어 있다. 이것은 외부 단편화를 줄이고 연속된 대량의 데이터를 읽을 때 디스크 탐색을 최소화시킨다.
각각의 블록 그룹은 블록 그룹 서술자 테이블과 슈퍼블록의 복사본을 포함하고 있으며, 모든 블록 그룹은 블록 비트맵, 아이노드 비트맵, 아이노드 테이블을 포함하고 있고, 마지막으로 실제 데이터 블록을 포함한다. 슈퍼블록은 매우 중요한 운영 체제 부팅, 즉 파일 시스템 내 여러 블록 그룹에서 만들어진 백업한 복사본과 같은 중요한 정보를 포함한다. 그러나, 일반적으로 파일 시스템의 첫 번째 블록에서 찾을 수 있는 첫 번째 복사본만 부팅에 쓰인다.
그룹 서술자는 블록 비트맵, 아이노드 비트맵과 모든 블록 그룹의 아이노드 테이블의 시작점의 위치에 저장되며 이들은 차례로 그룹 서술자 테이블에 저장된다.

아이노드

모든 파일이나 디렉터리는 아이노드로 표현된다. 아이노드는 크기, 권한, 소유권, 그리고 파일이나 디렉터리의 디스크의 위치에 대한 데이터를 포함한다.
ext2 아이노드 구조의 예시:
ext2에 대한 커널 문서의 인용문:
"아이노드에서 파일의 데이터를 포함하는 첫 12블록의 포인터가 있다. (블록의 다음 세트에 포인터를 포함하는) 간접 블록에 대한 포인터, (간접 블록에 대한 포인터를 포함하는) 이중 간접 블록에 대한 포인터, 그리고 (이중 간접 블록에 대한 포인터를 포함하는) 삼중-간접 블록에 대한 포인터가 있다."
ext2 내부는 15개의 포인터가 있는 구조며 그 중 처음부터 12번까지는 직접 블록을 위한 것이다. 13번 포인터는 간접 블록을, 14번째 블록은 이중 간접 블록을, 그리고 15번째 포인터는 삼중 간접 블록을 가리킨다.

디렉터리

각각의 디렉터리는 디렉터리 엔트리 목록이다. 각 디렉터리 엔트리는 파일명 하나와 아이노드 번호 하나가 연관되어 있으며, 이는 아이노드 번호, 파일명의 길이, 그리고 파일명을 나타내는 실제 텍스트로 구성되어 있다. 파일을 찾기 위해서, 디렉터리 내 관련 파일 이름을 앞에서부터 뒤로 검색한다. 디렉터리 크기가 적당하면 이렇게 해도 괜찮다. 그러나 큰 디렉터리에서는 비효율적이며, ext3는 단순히 파일명을 목록에 올리는 것보다 더욱 효율적으로 디렉터리를 저장하는 두 번째 방법을 제공한다.
루트 디렉터리는 아이노드 번호 2에 항상 저장되며, 마운트를 할 때 파일 시스템 코드가 이를 찾을 수 있다. 서브 디렉터리는 서브 디렉터리의 이름을 이름 필드, 그리고 아이노드 필드에 있는 서브 디렉터리의 아이노드 번호에 저장함으로써 구현된다. 하드 링크는 하나 이상의 파일명과 함께 같은 아이노드 번호를 저장함으로써 구현된다. 이름에 의해 파일에 접근하는 것은 같은 아이노드 번호로 접근하는 결과를 낳으므로, 결국에는 같은 데이터로 접근하게 된다.
"."나 ".."와 같은 특별한 디렉터리는 디렉터리, 현재 아이노드 번호와 아이노드 필드에 있는 상위 디렉터리에 "."과 ".."이라는 이름을 저장하는 것과 마찬가지다. 이 두 엔트리는 새 디렉터리가 생길 때 자동으로 만들어지며, 삭제가 불가능하다.

할당 데이터

새 파일이나 디렉터리가 만들어지면, ext2 파일 시스템은 어디에 데이터를 저장해야 하는지 반드시 결정해야 한다. 만약 디스크가 대부분 비어있다면, 데이터는 거의 어디든지 저장될 수 있다. 그러나 찾는 시간을 최소화하기 위해 데이터가 다른 관련 데이터와 같이 클러스터된 경우 성능이 최대화된다.
ext2 파일 시스템은 상위 디렉터리를 포함하는 그룹에 각각의 새 디렉터리를 할당하려고 시도하는데, 이론상 부모와 자식 디렉터리에 접근하는 것과 밀접하게 관련될 가능성이 있다. ext2 파일 시스템은 또한 그 디렉터리 엔트리와 같은 그룹에서 파일을 배치하려는 시도를 하는데, 이는 디렉터리 접근이 파일 접근으로 자주 이어지기 때문이다. 그러나, 그룹이 가득 차면, 새 파일이나 새 디렉터리는 그렇지 않은 그룹에 배치된다.
디렉터리와 파일을 저장하는 데 필요한 데이터 블록은 데이터 할당 비트맵에서 파일을 찾을 수 있어야 한다. 아이노드 테이블 안에 있는 모든 필요 공간은 아이노드 할당 비트맵에서 찾을 수 있어야 한다.

압축 확장

e2compr은 리눅스 커널에서 사용자 애플리케이션의 어떤 지원도 없이 파일 시스템에서 파일의 온라인 압축과 압축 해제를 지원하는 ext2 파일 시스템 드라이버의 변형이다.
e2compr은 on-the-fly 압축과 압축 해제 기능을 제공하는 ext2 파일 시스템의 작은 패치다. e2compr은 일반 파일만 압축한다. 관리 데이터(슈퍼 블록), 아이노드, 디렉터리 파일 등)는 보안을 이유로 압축되지 않는다. 읽기 및 쓰기 작업을 위해 압축된 블록에 대한 접근이 제공된다. 압축 알고리즘과 클러스터 크기는 파일 단위로 지정된다. 디렉터리 역시 압축을 나타내며, 이 경우 디렉터리에서 새로 생성된 모든 파일이 같은 클러스터 크기와 디렉터리에 지정된 같은 알고리즘으로 자동 압축된다.
e2compr은 새로운 파일 시스템이 아니다. 단지 EXT2_COMPR_FL 플래그를 지원하도록 만들어진 ext2 파일 시스템의 패치 버전일 뿐이다. e2compr은 새로운 파티션을 만들 것을 요구하지 않으며, 이미 존재하는 ext2 파일 시스템의 읽기와 쓰기를 지속할 것이다. 간단히 gzip이나 compress와 비슷한 단순 유틸리티로 만든 파일에 접근할 때 루틴을 읽고 쓰는 방법을 고려할 수도 있다. 압축된 파일과 압축 해제된 파일은 공존할 수 있다.
e2-compr에서 갈라져 나온 최신 판은 현재 리눅스 커널 2.4, 2.6, 3.0에서 사용 가능하다. 커널 3.0대의 최신 패치는 2011년 8월에 나왔으며 멀티 코어와 himem을 지원한다. 2.2와 2.0 이하 버전을 지원하는 더 안정적인 판도 있다.