파일 시스템은 컴퓨터에서 파일이나 자료를 쉽게 발견 및 접근할 수 있도록 보관 또는 조직하는 체제를 가리키는 말이다.
데이터는 물리적으로 섹터(sector)라는 공간에 저장된다. 그리고 섹터는 흔히 '하드디스크의 물리적인 최소 단위'로써 정의된다.
다시 말해, 응용 프로그램이 생산한 데이터 집합인 파일은 모두 이 섹터 공간에서 읽기/쓰기/삭제 등의 작업이 이루어진다.
Block은 저장 매체(디스크)의 전체 공간을 고정된 크기(예: 4KB 등)로 나눈 기본 단위이다. 파일 시스템은 이 블록 단위로 데이터를 저장하고 관리한다.
하나의 파일은 크기에 따라 하나 이상의 블록에 걸쳐 저장되며, 블록 단위로 입출력을 처리함으로써 효율적인 공간 관리와 디스크 접근 최적화가 가능하다.
이 개념을 통해 데이터 추가, 삭제, 수정 작업이 발생해도 파일 시스템이 블록 단위로 변경 사항을 처리하여 다른 파일에 미치는 영향을 최소화할 수 있다.
또한, 디스크 입출력 성능을 높이고, 내부 단편화(internal fragmentation)를 통제할 수 있는 장점이 있다.
물리적 최소 단위인 섹터는 논리적 최소 단위인 클러스터(cluster)로 묶여서 사용된다.
섹터는 하드디스크에서 읽기/쓰기의 최소 단위지만, 이 단위는 너무 작아 빈번한 입출력을 처리하기엔 비효율적이다. 이를 보완하기 위해 여러 섹터를 묶어 클러스터 단위로 데이터를 입출력한다.
굳이 비유하자면, 섹터는 실질적으로 데이터를 담는 '그릇', 클러스터는 이 그릇들을 여러 개 모아 운반할 '쟁반'이라고 할 수 있다.
블록과 클러스터의 차이에 대해, ChatGPT는 다음과 같이 답변했다.
File Allocation Table의 줄임말인 Fat File System은 MS-DOS 및 Windows 9x 계열 운영 체제에서 사용되는 파일 시스템이다.
일반적으로 모든 USB 플래시 드라이브에는 FAT32 파일 시스템이 있다. FAT32의 가장 큰 장점은 호환성이며 모든 운영 체제에 적용할 수 있다. 그러나 주요 단점은 최대 단일 파일 크기인 4GB의 전송만 지원한다는 것이다.
FAT 파일 시스템의 기본 개념은 파일과 디렉토리를 데이터 구조체에 할당하는 것이다.
이 구조체를 directory entry라고 부른다.
directory entry는 다음과 같은 내용들을 포함한다.
파일이나 디렉토리가 directory entry 구조체에 할당되면 이 구조체는 클러스터에 저장된다.
FAT는 각 클러스터 번호를 인덱스로 하고, 해당 클러스터가 가리키는 다음 클러스터 번호를 값으로 저장한다. 파일의 끝은 특별한 종료 마커(예: 0xFFFF)로 표시된다.
exFAT(extended file allocation table)은 FAT32를 대체하기 위해 Microsoft에서 만든 새로운 파일 시스템이다.
FAT32와의 주요 차이점은 exFAT이 4GB보다 큰 파일 전송을 지원한다는 것이다.
exFAT은 Windows 및 Mac 컴퓨터 모두에서 잘 작동하며, NTFS 파일 시스템보다 호환성이 높다.
가장 큰 단점은 파일 로그 기능이 없어 디스크 수정 기록을 남길 수 없다는 점이다.
NTFS(New Technology File System)는 FAT을 대체하기 위해 Microsoft에서 만든 파일 시스템으로, 윈도우 NT 계열 운영체제의 파일 시스템으로 사용되고 있다.
윈도우 10, 윈도우 11도 NTFS 파일 시스템을 사용한다.
NTFS의 레이아웃은 다음과 같다.

NTFS는 모든 파일, 디렉터리 데이터들을 파일 형태로 저장한다.
심지어, MFT도 시스템 내에서는 하나의 파일로 취급되어 MFT를 설명하는 엔트리가 MFT 안에 포함되어 있다.
주로 리눅스에서 쓰이는 파일 시스템 중 하나이다.
파일을 저장할 때 Block Mapping 방식을 사용한다. 이 방식은 논리 블록(logical block) 번호를 실제 디스크 상의 물리 블록(physical block) 위치로 변환해주는 메커니즘이다.

inode 구조체 안에는 포인터가 포함되어 있다. 위의 그림처럼 inode 1번부터 12번까지는 각각 디스크 상의 실제 블록을 하나씩 가리킨다.
하지만 파일 수가 너무 많아지면 감당이 안되므로, 13번 inode 부터는 하나의 inode가 여러 개의 블록을 가리킨다. inode가 간접 블록에 대한 포인터를 가지고, 간접 블록 안에 데이터 블록 주소들이 들어 있는 구조이다.
간접 블록을 1단계 거치면(inode -> 블록A -> 데이터 블록) single indirect,
2단계 거치면(inode -> 블록A -> 블록B -> 데이터 블록) double indirect,
3단계 거치면(inode -> 블록A -> 블록B -> 블록C -> 데이터 블록) triple indirect
ext3는 ext2와 거의 유사하지만, 저널링 기능이 생겼다는 특징이 있다. 저널링 기능은 파일 시스템의 변경 사항을 추적하기 위해서 만들어진 기능으로, 삭제된 파일을 복구하는데 사용되기도 한다.
ex2와 마찬가지로 파일을 저장할 때 Block Mapping 방식을 사용한다.
ext4는 ext3와 거의 유사하지만, Block Mapping 방식이 아닌 extents 트리를 이용하여 파일을 관리한다.
2¹⁵개의 블록(= 32,768개)을 커버Block Mapping 방식에서는 inode가 직접 블록 번호를 하나하나 저장했다. 때문에, 파일이 조각나면 블록 포인터가 수십 개, 수백 개 늘어나서 inode 구조가 비대해졌다.
ext4는 extent 기반 매핑(extents mapping)을 도입하여 큰 파일을 보다 효율적으로 저장한다.
작은 파일은 inode에 최대 4개의 extent를 직접 저장하고, 더 큰/복잡한 파일은 B+ Tree 기반의 extent tree를 사용한다.
Extents Tree는 여러 개의 Extent를 트리 구조로 관리하는 방식이다.

Leaf 노드
Index 노드
루트 노드는 inode 내부에 있음