File system이란 데이터가 저장장치에 저장되는 방식이다.
각 file system의 구체적인 작동 원리에 대해서 알아보기 보다는 간단하게 특징에 대해서만 정리해보려고 한다.
File Allocation Table의 약자로 Microsoft에서 개발한 file system.
간단한 작동구조 때문에 OS간의 호환성이 좋아 Mac, Linux 등 대부분의 OS에서 읽고 쓰는 것이 가능하다. 따라서 다양한 OS에서 사용되는 USB에서 FAT32를 주로 이용하며 FAT32가 기본 file system인 경우도 많다.
File Allocation Table이라는 이름에서 알 수 있듯이 실제 데이터를 저장하는 데이터 영역과 데이터 영역을 설명하는 FAT entry들의 모여있는 테이블 영역으로 나누어져 있다. FAT의 핵심은 기본적으로 FAT entry를 통해 실제 데이터에 접근한다는 점이다.

sector는 저장장치 하드웨어에 따라 정해져 있는 물리적 최소 저장 단위로 일반적으로 516B이다. 저장장치 하드웨어에 따라 정해져 있는 것이므로 file system에 상관 없이 어떤 file system이건 간에 하드웨어에 따라 sector의 값은 정해져 있다.
cluster는 파일시스템, 포멧 도구에 따라 정해져 있는 논리적 최소 저장 단위로 일반적으로 4KB(8 sectors)이다.
정보량으로 비유하자면, sector는 정보량의 최소 단위인 Byte, cluster는 64bit CPU가 한번에 해결할 수 있는 최소한의 정보 단위인 8Byte인 것이다.

해당 저장장치에 대한 메타데이터를 담고 있고 만약 저장장치에 OS 이미지가 들어있는 경우에는 OS 부팅 코드를 가지고 있고 영역이다.

(Boot Section 중 Boot code를 제외한 layout. Boot code는 뒤에 0x5A부터 존재한다.)
Sector 0에 위치하고 있다.
해당 저장장치의 sector 크기, cluster 크기 등의 메타데이터와 만약 FAT 파일시스템으로 설정되어있는 저장장치에 OS 이미지가 들어있는 경우, 시스템을 처음 실행시켰을 때 BIOS가 읽어서 OS 이미지를 부팅하는 부팅 코드가 들어있는 영역이다.
Boot Section이 Sector 0번에 위치해 있기도 하고, 부팅 코드가 들어있는 영역으로 이동시키는 Jump Instruction이 Boot Section 안에서도 제일 앞에 위치해 있기 때문에 저장장치의 맨 앞에 OS가 들어있다고 하는 것이다.
Sector 1에 위치하고 있다.
저장장치에 남아있는 cluster의 개수, 가장 최근에 할당시킨 cluster의 주소에 대한 정보를 담고 있다.
Sector 2에 위치하고 있다.
Boot Section에 들어있는 부팅 코드의 크기가 커서 부팅 코드를 저장하도록 할당된 공간의 크기보다 크면 Boot Section에 들어가지 못한 코드를 저장하는 영역이다.
Boot Section, FSinfo Section, Boot Strap Section은 저장공간에 문제가 있는 경우를 대비해서 복구를 위해 복사본을 하나씩 가지고 있다.
Sector 6에 Boot Section, Sector 7에 FSinfo Section, Sector 8에 Boot Strap Section의 복사본이 저장되어 있다.
Data 영역의 cluster의 크기는 고작 일반적으로 4KB로 파일을 담기에는 너무 작은 크기이다. 그렇기 때문에 하나의 파일의 내용은 여러 cluster에 나누어져 있고 각 cluster가 linked list 방식으로 연결되어 있다. linked list에는 다음 node에 대한 정보가 필요한데 그 역할을 하는 것이 Data 영역의 cluster에 대한 정보를 담고 있는 FAT Entry이다. 그리고 FAT Entry는 FAT 영역에 저장되어 있다.
FAT 영역에 있는 FAT entry와 그에 대응하는 Data 영역에 있는 cluster는 단순히 위치로 결정된다. 그러니까 만약 어떤 FAT entry가 FAT 영역에서 14번째에 있으면 그에 대응되는 cluster는 Data 영역에서 14번째에 존재한다.
FAT Entry는 Data 영역에서 자신에게 대응되는 cluster에 대한 정보를 담고 있다. 기본적으로 FAT Entry에는 다음 파일 조각 cluster의 index 값이 들어가있다. FAT entry가 0x00000000인 경우에는 해당 FAT entry에 대응되는 Data 영역 cluster가 빈 cluster라는 것을 나타내고, 0x0FFFFFFF인 경우에는 EOF를 나타낸다.
FAT Entry의 크기는 FAT의 버전에 따라 FAT16의 경우 16bit, FAT32의 경우 32bit이다. FAT 뒤에 오는 숫자는 FAT Entry의 크기인 것이다.
FAT 영역은 FAT 영역 중 일부가 손상될 경우를 대비해서 FAT 영역을 FAT1, FAT2 두 개로 나누어서 똑같은 내용을 저장하도록 한다.
실제 파일, 디렉토리 데이터가 저장되어 있는 영역이다.
Data 영역에 저장되어 있는 cluster가 파일인 경우에는 cluster의 시작점에 다른 헤더파일이나 메타데이터 없이 파일 내용을 이루고 있는 byte 코드가 바로 시작된다.
Data 영역에 저장되어 있는 cluster가 디렉토리인 경우에는 해당 디렉토리 안의 하위 파일이나 디렉토리의 이름, 확장자, 생성 날짜 등이 담긴 directory entry가 저장된다.
FAT File System 에서 실제로 파일에 접근하는 예시를 통해 FAT에 대해 더 잘 이해해보자.
/example.txt 에 접근한다고 해보자.

OS는 먼저 Reserved 영역의 Boot section에 저장되어 있는 root 디렉토리 cluster 주소를 찾고 FAT entry를 통해 접근할 것이다. root 디렉토리 cluster는 디렉토리에 대한 cluster 이므로 root 아래의 하위 디렉토리와 파일들의 directory entry를 저장하고 있을 것이다. 하위 directory entry 중 example.txt를 가리키는 directory entry를 찾아 entry에 나와있는 example.txt의 cluster 주소를 찾는다.

FAT entry를 통해 접근한 exmaple1.txt cluster에는 example1.txt 파일의 실제 내용이 적혀있을 것이다.
중요한 점은 모든 Data 영역에 대한 접근은 FAT 영역의 FAT entry를 거친다는 것이다.
FAT32에서는 한 파일의 크기가 4GB-1bit로 제한되어있다. 그 이유는 directory entry 안의 파일의 크기를 설정하는 DIR_FileSize 필드가 32bit이기 때문이다.
extended File Allocation Table의 약자로 Microsoft에서 FAT32를 개선해서 개발한 file system.
FAT32와 마찬가지로 OS간의 호환성이 좋아서 Mac, Windows, Linux에서 모두 사용 가능하다.
또한 파일 하나의 크기가 4GB를 넘을 수 있다.
하지만 파일을 담는 가장 작은 단위인 클러스터의 크기가 커서 비효율적이기 때문에 보통 4GB가 넘는 파일을 옮기는 USB에서 주로 사용한다.
New Technology File System의 약자로 Microsoft에서 개발한 file system.
기본적으로 Windows에서만 사용 가능하다.
windows의 저장장치는 기본적으로 NTFS이 적용되어 있다.
파일 크기에 제한이 없다.
Apple File System의 약자로 Apple에서 개발한 file system.
기본적으로 apple에서 개발한 OS에서만 사용 가능하다.
파일 크기에 제한이 없다.
Extended File System의 약자로 Linux에서 사용하는 file system.

Sector는 하드웨어의 최소 저장 단위이니까 file system에 상관없이 sector이다.
하지만, Block은 file system의 논리적 최소 저장 단위로 FAT에서는 이를 cluster로 불렀지만 ext에서는 block이라고 부른다. 일반적으로 4KB(8 sectors)이다.

BIOS Boot code가 들어있는 sector 이다. 만약 해당 저장장치가 OS 이미지를 저장하지 않는 일반적인 저장장치라면 비어있다.
sector의 크기, block의 크기, 전체 inode 갯수, 전체 block 갯수 등 ext 파일 시스템의 메타 데이터를 저장하고 있다.
super block은 데이터가 손상될 경우를 대비해 일부 block group에 백업본이 존재한다.
file descriptor와 비슷하게 block bitmap, inode bitmap, inode table의 시작 주소를 저장하고 있다.
super block과 마찬가지로 데이터가 손상될 경우를 대비해 일부 block group에 백업본이 존재한다.
Super Block(백업용)
Block Group Descriptor(백업용)
Block Bitmap
block group 안에서 어떤 block이 사용되고 있는지를 1bit 0과 1로 나타낸다.
block group 안에서 어떤 inode가 사용되고 있는지를 1bit 0과 1로 나타낸다.
inode를 저장하고 있다. inode란 파일이나 디렉토리에 대한 정보와 data block에 있는 파일이나 디렉토리의 실제 데이터를 가리키는 포인터를 가지고 있는 구조체이다.
FAT에서 여러 cluster에 한 파일이 분산되어 저장되어 있었던 것처럼 etc 에서도 여러 block에 한 파일이 분산되어 저장되어 있다. etc 버전에 따라 이 분산된 파일을 가리키는 방식이 다르다.
etc2, etc3에서는 inode가 해당 파일이나 디렉토리의 데이터가 들어있는 block들을 가리키는 포인터를 저장하고 있다.
하지만, etc4에서는 extend을 사용한다. extend는 단순히 같은 파일이나 디렉토리의 데이터를 분산해서 저장하고 있는 block을 물리적으로 연속된 공간에 저장하는 것이다. inode는 extend가 시작되는 block의 주소와 block의 개수를 저장하고 있다.
조심해야 할 것은 inode는 파일이나 디렉토리의 이름을 담고 있지 않다는 것이다. 파일이나 디렉토리의 이름은 inode가 아니라 directory entry에 저장되어 있을 것이다.
실제 파일이나 디렉토리의 데이터를 저장하고 있는 영역이다.
디렉토리의 경우에는 FAT과 마찬가지로 하위 파일이나 디렉토리의 정보를 담고 있는 directory entry를 저장하고 있다.
ext File System에서 /temp/example.txt에 접근하는 예시를 통해 ext에 대해 더 잘 이해해보자.

root inode를 통해 /temp/ 디렉토리의 directory entry를 찾는다. /temp/ 디렉토리의 directory entry에는 /temp/ 디렉토리 하위 파일들을 가리키는 /temp/ inode가 있다.

root inode와 마찬가지로 /temp/example.txt의 directory entry를 찾는다. /temp/example.txt의 directory entry에는 /temp/example.txt의 실제 데이터를 가리키는 /temp/example.txt의 inode가 있다.

/temp/example.txt의 inode는 실제 /temp/example.txt의 데이터 조각들을 가리키고 있다.
Linux에는 Everything is a File 이라는 설계 철학이 있다. ext 파일 시스템을 공부하면 이 설계 철학이 무슨 말인지 이해할 수 있다.
Linux가 사용하는 ext에서는 파일이건 디렉토리이건 동일한 inode 구조를 가지고 있다. 따라서 디렉토리에 대한 별도의 구분 없이 모두 file로 취급한다고 해서 Everything is a File 이라는 것이다.
물론 파일 시스템만으로 Linux의 "Everything is a File" 철학을 완전히 이해할 수 있는 것은 아니다. 윈도우도 Linux와 마찬가지로 FAT을 확인해보면 파일이건 디렉토리이건 동일한 FAT entry를 사용하지만 윈도우는 모든 것을 파일로 여기는 것이 아닌 객체로 여기는 "Everything is a object" 철학이 있다.
Linux가 모든 것을 파일로 여기는 이유를 확실히 알기 위해서는 각 객체에 대한 동일한 인터페이스를 가진다는 내용을 알아야 하지만 ext 파일 시스템을 통해 Linux의 Everything is a File 철학을 맛볼 수 있다.