파일시스템의 종류와 역사
파일시스템은 말 그대로, 파일의 형태로 디스크 데이터를 다룰 수 있게 해주는 시스템 구조를 말한다.
디스크는 그냥 디스크일 뿐이고, 우리가 아는 파일의 형태로 디스크를 조작하려면 파일시스템이 필요하다.
USB 같은 외부장치 뿐만 아니라, OS 수준에서도 파일시스템이 있어야 파일을 다룰 수 있다.
대표적으로 어떤 것들이 있고, 각자 어떤 장단점이 있는지 간단히 다뤄본다.
그리고 Linux를 중심으로 다룬다.
OS별 파일시스템 선택
-
Windows
NTFS를 기본 파일시스템으로 사용한다.
옛날에는 FAT 계열을 사용했다. -
MacOS
Apple File System (APFS)라는 전용 파일시스템을 사용한다. -
Linux
리눅스는 배포판마다 지원하는 파일시스템 종류가 판이하게 다르다.
다만 우분투을 포함한 많은 배포판이 ext4를 쓴다.
하지만 xfs를 쓰는 것도 있고, btrfs를 쓰는 것도 있다. 뭐 많다.
FAT 12 (1980)
File Allocation Table의 축약이다.
원래 8비트 클러스터 포맷이던 FAT이라는 파일시스템을 확장해서 만든 것이다.
초창기 MS-DOS에서 사용했다.
당연히 제한사항이 매우 많았다.
사용 가능한 파일 공간이 32MB 뿐이었는데, 사실 당시에는 하드웨어가 너무 구려서 이걸로도 충분했다.
현재는 거의 쓰이지 않는다.
FAT 16 (1984)
Microsoft에서 MS-DOS에 쓰려고 FAT 12를 다시 확장한 버전이다.
이것도 초기에는 구현을 대충해서 공간 제한이 32MB 뿐이었다.
나중에는 2GB까지 늘릴 수 있게 확장이 되긴 했다.
현재는 거의 쓰이지 않는다.
HFS (1985년)
Hierarchical File System의 축약이다.
Apple에서 자기들 쓰려고 만든 파일시스템이다.
Mac OS System 2.1부터 도입되었고, Apple이 첫번째로 좀 제대로 만든 파일시스템이다.
이전에도 이것저것 있긴 한데 별로 의미도 없고 무시한다.
이것도 파일 저널링은 없어서 전원 나가면 손상됐다.
구버전 기술 막 던지는 애플답게, 지금은 버려져서 전혀 쓰이지 않고 지원도 되지 않는다.
Linux의 창세기 (1990~)
1990년대까지만 하더라도, 오픈소스에서 사용하는 파일시스템들은 지금 기준으로 생각하면 매우 유아적이고 제한도 많았다.
리눅스 커널을 처음 만들 적에는 직접 파일시스템을 창조해서 쓰지는 않았다. MINIX라는 파일시스템을 갖다가 썼는데, 1987년에 교육용으로 만들어진 단순한 녀석이었다.
파일명은 14자까지만 됐고, 저장공간은 64mb까지만 제어가 됐다.
당연히 이걸로 제대로된 OS를 만들 수는 없었고, ext라는 것이 나오게 된다.
ext1 (1992)
셋 다 현재는 역사의 뒤안길로 사라진 파일시스템이다.
ext 1은 1992년에 나왔고, 기존에 존재하던 유아적인 파일시스템들에 비하면 비약적인 발전을 이루었다.
무려 2GB어치의 디스크를 다룰 수 있었고, 파일 이름은 255자까지 늘었다.
특히나 여기서 중요한 것은 파일시스템 논리의 근간을 이루는 Virtual file system을 고안했다는 것이다.
이를 통해 파일시스템을 추상화해서, OS 입장에서 어떤 파일시스템을 사용하든 일관된 인터페이스로 접근할 수 있도록 했다.
하지만 여기까지 해도 사실 제대로 된 상업용이라고 하기는 어려웠고, 아직은 장난감 수준이었다.
진짜 시작은 ext2부터다.
ext2 (1993)
ext1의 부족한 단점을 메우면서 나온 파일시스템이다.
이것도 이런저런 단점이 많긴 했지만, 90년대의 주류 파일시스템으로 자리잡았다.
Linux도 이를 바로 도입했다.
제한
-
디스크를 쓰는 중에 크래시가 나거나 전원이 끊어지면 심각한 손상이 발생함
-
디스크 단편화로 인한 성능 저하가 심각했음
-
파일당 크기 제한 2gb
-
전체 파일 제한 4tb
특히 디스크 손상으로 인한 문제가 너무 심각해서 현재는 거의 버려진 상태다.
하지만 USB를 비롯해서 장기적인 사용을 원할 경우에는 ext2가 좋은 선택이고, 사용할 때도 있다.
왜나면, 이후의 파일시스템이 안정성을 유지하기 위해서 "파일 저널링"을 하는데, 이게 생각보다 디스크 수명을 꽤 깎아먹기 때문이다.
ext2은 안정성을 갖다버린 대신에 쓰기 성능이 더 좋고, 더 적은 쓰기를 하므로 수명 연장 효과도 있다.
그리고 ext 계열은 Linux에 친화적으로 만들어져서 Linux의 구조와 상당히 맞닿아있는데, 여기서는 i-node니 뭐니 하는 것은 거의 다루지 않거나 최소한만 다루려고 한다.
xfs (1993)
대형 파일을 관리하는데 최적화된 파일시스템이다.
원래 실리콘 그래픽스란 데서 만든건데, 나중에 오픈소스로 풀어버렸다.
파일 저널링 정도는 지원해서 장애 대응은 가능하다.
이건 정말 큰 파일을 다루는데 최적화되어있는데, 반대로 작은 파일에 대해서는 다른 파일시스템보다 비효율적일 수 있다. 그래서 성능 널뛰기도 심해서 무작정 선택하기는 어렵다.
리눅스의 파일시스템 주요 선택지 중 하나다.
NTFS (1993~)
New Technology File System의 축약이다.
Windows에서 자기들만 쓰려고 만든 파일시스템 형식이다. 기존 FAT의 한계를 탈피하려고 다시 만든거다.
Windows NT 3.1에 처음 나왔긴 한데, 사실 내부적으로는 버전이 계속 올라서 93년에 쓰는 NTFS와 지금 쓰는 NTFS는 많이 다르다.
주요 버전은 5개가 있다.
1.0 1.1 1.2 3.0 3.1
기본적으로 저널링 시스템을 사용하고 있고, 파일 이름 등의 메타데이터 관리를 B-Tree 기반으로 관리한다.
FAT32 (1996)
마이크로소프트에서 다시 FAT16을 확장해서 만든 포맷이다.
Windows 95부터 등장했다.
MS에서 만든 것이긴 하지만, Linux, MacOS를 포함해서 모든 플랫폼에서 잘 지원된다.
제한
-
전체 용량 제한은 2TB나, 사실 OS 구현 자체의 한계로 32GB가 되기도 했다.
-
파일당 최대 크기 제한은 4GB다.
-
이것도 파일 저널링이 존재하지 않는다. 전원이 갑자기 꺼지면 손상될 수 있다.
이것도 주류에서 버려졌으나, ext2와 같은 이유로 USB 등에서는 아직도 쓰인다. 파일 저널링이 없어서 쓰기 비용이 적고, 수명도 길기 때문이다.
게다가 임베디드 분야에서는 아직 주류로 사용되고 있다.
HFS+ (1998년)
Apple에서 자기들 쓰려고 만든 HFS의 강화판이다. 꽤 오랫동안 현역으로 굴렀다.
사람들이 겪는 MacOS 엑셀파일의 "자소분리" 현상이 이 시스템의 구현 문제로 발생하는 것이었다.
이런저런 문제가 좀 많은 편이다.
NTFS처럼 이름은 같지만 내부적으로 버전 업데이트는 엄청 많이 하면서 갈아엎었다.
파일 저널링도 초기 버전에 없었지만 나중에 생겼다.
macOS에서는 Hi Sierra부터는 APFS로 대체되어가는 추세였고, 현재는 거의 쓰이지 않는다.
ext3 (1998)
ext2와 ext3의 가장 큰 차이점이라고 하면, 파일 저널링이 추가된 것일 테다.
ext3는 이를 통해서 전원이 갑자기 나가거나 하는 장애 상황에서 무결성을 보장할 수 있었다.
쉽게 말해서, 디스크에 뭘 쓰더라도 직접 핵심 영역에 저장하는게 아니라, 커밋 단위로 쓰기를 몰아서 처리한 것이다. 커밋이 완료되지 않은 상태에서 쓰기가 중단된다면 해당 쓰기 영역-저널 영역은 손상된 것이라 판단하고 버린다.
파일 저널링에 대한 상세 구현 원리는 별도 포스트에서 다뤄보겠다.
zfs (2005)
썬 마이크로시스템즈에서 개발한 파일시스템이다.
자체 OS인 솔라리스에 포함해서 처음으로 배포했고, 초기에는 오픈소스였다가 오라클이 걸어잠가서 원본은 오픈소스가 아니게 됐다.
그래서 포크 버전을 OpenZFS라고 해서 지금도 이어오고 있는 것이 이거다.
특징
-
128비트 파일시스템이다. 그래서 파일 수용량에 거의 제한이 없다.
-
RAID를 위한 기능들을 제공한다.
-
NAS 사용사례에도 잘 맞는다.
대규모의 데이터를 핸들링해야 하는 엔터프라이즈급 사용사례에 적합한 파일시스템이라 할 수 있겠다.
하지만 대형 데이터를 핸들링해야하거나 RAID 등 확장 구성을 해야하는게 아니라면, 일반적인 옵션이 더 빠르고 가볍다.
현재 Linux 파일시스템의 주요 선택지 중 하나다.
ext4 (2008)
일반적으로 리눅스 배포판에서 널리 사용되는 파일시스템이다. 데비안, 우분투를 포함한 대중적인 배포판들이 이걸 쓴다.
성능도 대체로 안정적이고, 사용에도 별다른 문제는 없다.
역사적으로는, 당연히 ext2, ext3가 먼저 있었고, ext3의 여러가지 한계들을 개선하려고 Redhat이 만든 포맷이 ext4다.
**제한 ******
이것도 당연히 제한은 존재한다.
-
단일 파일은 최대 16TB의 크기를 가진다.
-
최대 1엑사바이트의 볼륨 제어가 가능하다.
장점 (ext3에 대비해서)
-
서브 디렉토리 개수 제한이 64000개로 늘어났다. (ext3는 32000개 제한)
-
extend라고 해서, 물리적으로 인접한 블록을 묶어서 처리해 성능을 최적화한다.
-
ext2, ext3에 대한 하위호환성을 제공한다. 예를 들어 ext4 시스템에서 ext3를 마운트하는 것이 가능하다.
이 외에도 이런저런 안정성 개선, 최적화 추가 등이 존재한다.
btrfs (2009)
B-tree file system의 축약이다.
요즘 Linux 환경에서 미는 오픈소스 파일시스템이다.
기존 파일시스템들과 차별화되는 장점들이 여럿 있다.
특징
-
기존 파일시스템에 비해 가볍다.
-
B-Tree 기반이라 접근 속도가 우수하다.
-
Copy on Write를 통한 최적화
-
SSD 최적화가 잘된다.
-
스냅샷&백업 기능이 파일시스템 수준에서 지원된다.
단순 파일시스템 수준을 넘어서서 뭔가 부가적인 기능들을 많이 제공하는 편이다.
Arch를 비롯해 "힙한" Linux 배포판들은 이걸 기본값으로 사용하거나 권장하는 옵션으로 제공한다.
f2fs (2012)
삼성전자에서 만든 오픈소스 파일시스템이다.
Flash-Friendly File System의 축약이다.
플래시 메모리, 그러니까 SSD에서 빠르게 동작하게끔 최적화되어있는 파일시스템이다.
SSD의 구조를 활용하기 위해서 단순 리스트나 테이블이 아닌 로그 형태의 시스템을 사용한다. LSM Tree 등과 비슷한 접근 방식이다.
근데 ext4보다 이게 극적으로 빠르냐 하면 그렇지는 않은 것 같다. 큰 파일을 다룰때 미미하게 빠르긴 한데, 극적이지는 않다.
그리고 현재 시점에서는 아직 안정성이 그다지.. 좋은 것 같진 않다. 사소한 부분에서도 크래시가 나는 경우가 잦다는 보고를 들었다.
리눅스 파일시스템의 주요 선택지 중 하나다.
APFS (2017년)
Apple File system의 축약이다.
HFS+를 대체하려고 만들었고, 지금은 완전히 대체했다.
현재 MacOS의 파일시스템은 무조건 이거다.
참조
https://en.m.wikipedia.org/wiki/List_of_default_file_systems
https://en.m.wikipedia.org/wiki/Ext4