일반적으로 디스크 드라이브 사용 시에 파티션을 분할하고 포맷작업을 통해 파일 시스템을 생성합니다
이때 디스크 드라이브에 할당된 파티션의 파일 시스템은 다음과 같이 구성됩니다
I-list는 아이노드들이 저장된 연속적인 메모리 공간으로,
각 파일의 메타데이터를 담고 있는 아이노드 구조체들의 목록입니다
여기서 아이노드는 유닉스 계열 파일 시스템에서 사용하는 자료구조로
각 파일당 하나의 아이노드를 할당받아 관리됩니다
아이노드는 다음과 같은 정보를 저장하고 있습니다
파일 시스템을 생성할 때 전체 공간의 약 1%를 아이노드에 할당합니다
아이노드를 위한 공간이 할당되어있는 만큼 파일 시스템에서 생성할 수 있는
파일의 최대 개수도 한정되어 있습니다
실제 저장되는 정보는 해당 영역에 저장됩니다
이 영역은 디렉터리 블록과 데이터 블록이 섞여있습니다
디렉터리도 하나의 파일이며, 아이노드를 가지고 있습니다
디렉터리의 데이터 블록에는 다음 정보들이 저장됩니다
실제 파일의 내용이 저장되는 공간입니다
각 아이노드는 해당 파일이 차지하는 데이터 블록의 위치를 가리키는 포인터를 가지고 있습니다
부트 블록은 파일 시스템의 시작 부분에 위치하며, 부트로더 코드가 저장될 수 있는 공간입니다
리눅스에서는 일반적으로 부트 블록을 사용하지 않지만,
부팅 가능한 파티션에서는 이 공간을 활용할 수 있습니다
슈퍼 블록은 파일 시스템 전체에 대한 전역 정보를 저장합니다
슈퍼 블록은 매우 중요한 영역으로, 여러 블록 그룹에 백업본으로 저장합니다.
덕분에 손상되더라도 복구가 가능합니다
ext2는 과거에 리눅스에서 주로 사용되었던 파일 시스템입니다
저널링 기능이 존재하지 않으며, 현재 주로 사용되는 ext4의 기반이 됩니다
ext2 파일 시스템은 루트 블록과 여러 블록 그룹으로 구성됩니다
블록(Block) 이란?
파일 시스템에서 데이터를 저장하는 기본적인 단위입니다
일반적으로 메모리에서 한번의 입출력 작업마다 읽고 쓰는 단위입니다
루트 블록은 디스크의 첫 부분이며, 부트 블록 및 슈퍼 블록 등이 포함된 영역입니다
여기에는 전체 파일 시스템 구조를 정의하는 정보들이 저장되어있습니다
블록그룹은 다음 구성요소를 가지고 있습니다
첫 번째 블록 그룹에 필수적으로 존재합니다
이후 블록 그룹에는 백업본으로 존재합니다
특정 파일 시스템임을 알리는 정보인 매직넘버가 존재합니다
파일 시스템에 대한 전체적인 정보를 가지고 있습니다
블록 그룹 내의 구성 요소의 위치를 저장합니다
데이터 블록의 사용여부를 1비트로 표현합니다
각 디스크 블록 당 하나의 비트로 할당되어 관리하며 할당되어 있으면 1, 아니면 0으로 표현합니다
아이노드 할당 상태를 비트로 표현합니다
아이노드에 대한 정보가 들어있는 영역입니다
실제 파일 데이터가 저장되는 영역입니다
추가로 데이터 블록은 간접 블록과 홀이 있습니다
파일이 커질수록 아이노드에 포함된 직접 포인터만으로는 모든 데이터를 저장할 수 없습니다
이때 사용하는 것이 간접 블록(Indirection Block)입니다.
간접 블록은 추가 데이터 블록의 주소를 저장하는 포인터 블록으로,
데이터 자체를 저장하지 않고 **데이터 블록의 위치 정보만 저장합니다
간접 블록은 다음과 같이 구성될 수 있습니다
간접블록은 파일 크기에 따라 포인터 구조를 동적으로 확장하여 저장할 수 있습니다
홀은 아이노드 또는 간접 블록이 특정한 데이터 블록 주소 대신 "할당되지 않음"을 나타내는 값을 가지는 경우를 말합니다
즉, 파일 내부에는 존재하지만, 실제 디스크 공간을 차지하지 않는 구간입니다
이런 Hole 영역은 읽을 경우 자동으로 0으로 간주되며,
운영체제 입장에서는 *"0이 가득 찬 영역"처럼 보이지만 실제 블록은 존재하지 않습니다
주로 로그 파일이나 가상 디스크처럼 일부분만 실제 데이터를 가지는 경우에 사용하며,
홀의 존재로 디스크 공간을 절약하고 I/O 성능을 향상시킬 수 있습니다