
파일 시스템이란 컴퓨터에서 파일이나 자료를 쉽게 발견 및 접근할 수 있도록 보관 또는 조직하는 체제
파일시스템은 소프트웨어뿐만 아니라 하드웨어 적으로도 밀접하게 관련있는 프로그램이다.
섹터 단위로 파일을 읽고 쓰기엔 너무 느려서
섹터들을 묶어 한번에 읽는 기술이 도입됐다.
이 때, 섹터들을 묶은 단위를 클러스터 || 블록이라고 한다.
이 때 마지막에는 빈 공간이 생길 수 있는데, 이걸 Slack space라고 한다.
보통 클러스터는 윈도우에서 많이 사용하고, 블록은 유닉스 계열에서 많이 사용하는데 둘의 개념적인 차이는 없다.
또한 블록을 몇 개의 섹터로 계산하는지는 파일시스템마다 다르다.
블록은 논리적인 개념이고 물리적으로는 섹터밖에 존재하지 않으므로 파일 시스템이 소프트웨어적으로 계산해줘서 운영체제가 사용할 수 있게 된다.
FCB(File Control Block)들에서 나오는 Block이 이 Block이다.
파일시스템이 하는 역할은 다음과 같다.
이 세 가지를 어떤 방식으로 구현하냐에 따라 파일시스템의 종류가 달라진다.
파일시스템은 블록을 어떤 원리로 구현할까?
이것을 알기 위해선 먼저 Addressing에 대해 알아야 한다.
파일 시스템이 블록을 계산하려면 섹터에 주소가 지정되어 있어야 하는데, 제일 먼저 나온 Addressing 방법이 CHS(Cylinder Head Sector)이다.
말 그대로 실린더-헤드-섹터의 위치로 주소를 지정한다는 뜻으로
(2,3,2)라고 한다면 2번째 실린더의 3번 헤드의 2번 섹터라는 뜻이다.
이 방식의 단점은 플래터 중앙으로 갈 수록 한 트랙 내의 섹터 수가 적어지니, 주소지정에서의 혼돈을 막기 위해, 내부 섹터의 수를 기준으로 통일해서 실제 디스크 용량보다 적게 사용하게 된다는 점이다.
그래서 이런 문제를 해결하기 위해 나온 방식이
LBA(Logical Block Addressing)이다.
LBA는 모든 디스크의 섹터를 논리적으로 순서를 매겨 주소를 지정하는 방식이다. (0번부터 ~)
그렇다면 실제 디스크의 섹터와 논리적 주소간의 매핑은 누가 해줄까?
이러한 작업을 해주는 애가 BIOS(Basic I/O System)이다.
BIOS에 의해 섹터에 주소가 부여된 뒤, 파일시스템이 이 정보를 어떻게 저장하고 사용할지 등의 관리를 한다.
대부분의 파일시스템은 데이터를 저장할 때, Meta area와 Data area로 나눠 저장한다.

Data area는 user data라고도 하며, 대부분의 데이터들을 저장하는 곳이다.
Meta area에는 Meta data가 저장되는데, 간단하게 I-node가 저장된다고 보면 된다.
I-node는 파일의 모든 정보를 가지고 있고, 이 I-node를 보고 파일이 저장된 위치를 찾아 사용한다.
흔히 접하는 파일시스템으로는
USB에 자주 사용되는 FAT,
윈도우에서 사용되는 NTFS, HPFS,
리눅스에서 사용되는 ext2, ext3, ext4, xfs등이 있다.
ext는 extended file system의 줄임말로 VFS(Virtual File System)을 도입했다.
VFS란 각 파일 시스템들의 정보들을 일관되게 가상화해서 같은 정보처럼 만들어서 운영체제에서 같이 사용할 수 있게 한 기술이다.
하지만 ext는 디스크에 단편화가 일어나는 단점이 있었고, 이를 보완한게 ext2이다.
ext에 비해 지원 용량 크기도 2TB로 커지고, 이때부터 i-node 기능을 지원하기 시작했다.
또한 block group을 도입했는데, block group이란 block을 group으로 묶은 것이다.
디스크 공간을 맨 앞에 부팅을 위한 boot sector와 block group로 나눈다.
블록 그룹 안에 들어있는 블록의 수는 맨 마지막 블록 그룹 빼곤 다 일정하다.(맨 마지막 블록 그룹은 나머지 블록 수)

ext2 파일시스템의 디스크는 맨 앞이 부트섹터이고 나머진 블록 그룹으로 이루어져 있다.
왜 맨 앞은 블록이 아닌 섹터일까? 그건 블록 크기까지는 필요가 없고 섹터로도 충분하기 때문이다.
그리고 각 블록 그룹의 구성은 다음과 같다.
super block
블록의 크기, 블럭의 개수, 블록 그룹의 개수, 블록 그룹 내 블록과 아이노드의 개수 등 모든 블록에 공통적으로 해당되는 정보가 들어있다.
파일시스템에서 제일 중요한 블록으로써 첫 번째 블록 그룹의 맨 앞에 위치한다. 또한 다른 모든 블록 그룹의 맨 앞에도 복사본을 둔다.
Block Bitmap의 위치, I-node Bitmap의 위치, 블록 그룹 안에 있는 빈 블럭 및 디렉토리의 수, I-node 수, I-node 테이블 번호 등 블록 그룹들의 데이터들이 어떻게 저장되었는지 알려주는 데이터들이 들어있다.
이 블록도 중요하기 때문에 모든 블록 그룹에 복사본이 있다.
각각 사용되고 있는 블록과 아이노드의 수를 나타낸다.
블록 비트맵과 아이노드 비트맵은 섹터크기와 블록 크기에 따라 크기가 변할 수 있기 때문에 블록 그룹내에 고정적으로 위치하지 않는다.
따라서 group Descripter table에 블록 비트맵과 아이노드 비트맵의 위치가 저장되어 있는 것이다.
I-node들이 기록된 테이블로, 이곳에 적힌 아이노드를 보고서 파일을 찾고 분류한다.
일반적으로 생각하는 데이터들이 이곳에 저장된다.
ext2부턴 블록그룹을 통해 연관된 데이터들끼리 더욱 분류할 수 있기 때문에 단편화 현상이 줄었다.
하지만 여전히 단편화 문제가 남아있고, 디스크에 데이터를 저장하는 동안 전원이 끊기면 심각한 손상이 일어난다는 큰 문제가 있었다. (복구 불가)
ext3 부터는 journaling기술을 통해 백업 및 복구 능력을 갖추게 됐는데, 이렇게 저널링 기술을 사용하는 파일시스템을 저널링 파일시스템 이라고 한다.
저널링이란?
매일 무엇을 했는지 적어놓은 기록.
저널링이란 항상 디스크에 정보를 변경하기 전에 변경사항들을 저널이라고 부르는 로그공간에 미리 기록을 해두는 것이다.
로그를 남겨뒀기 때문에 문제가 발생해도 저널 로그를 보고 다시 복구할 수 있다.
ext3에 비해 저널링 기술도 더 업그레이드 되고, 단편화 증상도 더 줄어들었다.
가장 주목할 점은 지원하는 용량이 매우 커진 것인데 1엑사 바이트의 디스크 크기와, 파일당 16테비 바이트를 지원한다.
현재 대부분의 리눅스 배포판에서는 ext4를 기본 파일 시스템으로 사용한다.
64비트 저널링 파일시스템이며
리눅스에서 ext시리즈 다음으로 가장 많이 쓰이는 파일시스템이다.
centos7부터 기본 파일시스템으로 채택되었다.
조금 더 자세하게 공부한 뒤 글을 작성하셨으면 도움이 될것 같습니다🙏🙏🙏
출처도 불분명한곳이 많은것 같습니다! 레퍼런스 확실하게 표시해 주세요!🙏🙏🙏
-저작권 협회-