[CS] 파일 시스템에 대해 알아보자
안녕하세요, 루피입니다.
"파일 시스템"이라는 단어는 개발자에게 매우 익숙하지만, 막상 원리를 설명하려고 하면 막연하게 느껴질 때가 많습니다. 이번 기회에 파일 시스템의 개념부터 동작 원리, 그리고 오늘날의 안정성을 만들어 낸 기술까지 한번에 정리해 보려 합니다. 바로 시작합니다.
1. 파일 시스템이란?
우선 저는 위키 백과에 나와 있는 설명을 확인 해봤는데요..?

아이고.. 너무 어려운 말이 너무 많습니다. 다 뒤로 하고 쉽게 파일 시스템을 한 문장으로 정의하면 다음과 같습니다.
파일 시스템은 OS 가 저장 장치에 데이터를 쓰고, 읽고, 찾고, 관리하는 모든 방법을 정의한 규칙 이자 시스템입니다.
하드디스크나 SSD와 같은 저장 장치는 그 자체로는 데이터를 저장할 수 있는 수많은 칸의 나열일 뿐입니다!!
하지만, 파일 시스템이 이 칸들에게 주소를 부여하고, 여러 칸을 묶어 파일 이라는 의미 있는 단위로 만들어 주고, 디렉토리라는 서랍에 정리하여 우리가 데이터를 쉽게 사용할 수 있도록 도와주는 것입니다. 신기하지 않나요..? 아님 말고요...ㅠㅠ
2. 논리적 구조: 어떻게 데이터를 정리하는가?
파일 시스템의 발전은 "어떻게 하면 데이터를 더 효율적으로 정리하고 찾을 수 있을까?"라는 질문에서 시작되었습니다.
물리적 주소의 한계라는 문제...
초기 컴퓨터는 "3번 트랙, 5번 섹터에서 128바이트를 읽어라"처럼 프로그래머가 데이터의 물리적 주소를 직접 알아야 했습니다. 이는 데이터를 관리하기 매우 복잡하게 만들었고, 여러 프로그램이 같은 주소를 덮어쓸 경우 데이터가 손상될 위험이 컸는데요...
이를 해결하기 위한 해결책들이 등장했습니다.
해결책 1: '파일'이라는 추상화
이러한 복잡성을 해결하기 위해 운영체제는 파일(File)이라는 논리적 단위를 도입했습니다. 이는 이름이 부여된, 논리적인 정보 저장 단위를 의미합니다.
운영체제는 파일이라는 논리적 개념을 실제 디스크의 물리적 블록 주소로 매핑하는 역할을 전담합니다.
이제 프로그래머는 물리적 주소 대신 "my_data.txt"라는 이름만 알면 됐고, 하드웨어의 복잡성을 개발자가 해결해야하는 문제점이 많이 해결 된거죠!!
해결책 2: '디렉토리'와 계층 구조
파일의 수가 증가하면서 이름 충돌과 관리의 어려움이라는 새로운 문제가 발생했습니다. 이를 해결하기 위해 오늘날 우리에게 익숙한 디렉토리(Directory) 개념과 계층적 파일 시스템이 등장했습니다.
디렉토리(Directory는 다른 파일이나 디렉토리의 목록을 포함하는 특수한 형태의 파일입니다.
디렉토리가 다른 디렉토리를 포함할 수 있게 되면서, 데이터를 Tree 구조로 체계적으로 구성하는 것이 가능해졌습니다. 이는 UNIX 운영체제의 "모든 것은 파일이다(Everything is a file)"라는 설계 철학으로 이어져, 시스템의 모든 요소를 일관된 방식으로 다룰 수 있는 기반이 되었습니다.
3. 동작 원리: 어떻게 디스크에 기록되는가?
파일과 디렉토리라는 논리적 구조를 비휘발성 저장 장치 에 어떻게 기록하고 유지할까?? 는 영속성 기술의 핵심입니다.
1) 핵심 원칙: 데이터와 메타데이터의 분리
효율적인 관리를 위해, 파일 시스템은 다음 두 정보를 분리하여 저장합니다.
메타데이터(Metadata)는 데이터에 대한 데이터. 파일 이름, 크기, 소유자, 권한, 생성 시간 및 데이터의 실제 위치 정보 등을 포함하는 데이터의 테이터입니다.
데이터(Data)는 파일의 실제 내용. 즉, 컨텐츠 입니다.
초기 파일 시스템인 FAT(File Allocation Table) 는 이 원칙을 명확히 보여줍니다. FAT 시스템은 디스크 공간을 데이터 블록으로 나누고, 디렉토리 엔트리(메타데이터)에 파일의 첫 블록 주소를,FAT(메타데이터)에 각 블록이 다음 블록을 가리키는 포인터 정보를, 그리고 데이터 블록에 실제 내용을 저장함으로써 이 둘을 철저히 분리했습니다.
4. 시스템 통합과 신뢰성
파일 시스템은 단순한 저장 기능을 넘어, 다양한 환경에 적응하고 데이터의 안정성을 보장하도록 발전해왔습니다.
1) VFS (Virtual File System): 추상화의 힘
세상에는 FAT32, NTFS, ext4 등 수많은 종류의 파일 시스템이 존재합니다. 만약 운영체제나 응용 프로그램이 이들을 개별적으로 지원해야 한다면 엄청 복잡해지겠죠??
VFS는 실제 파일 시스템 위에 위치하는 커널 내부의 소프트웨어 계층으로, 모든 종류의 파일 시스템에 대해 일관된 인터페이스를 제공하는 추상화 계층입니다.
VFS는 응용 프로그램이 open(), read(), write() 같은 표준 시스템 콜(System Call) 을 호출하면, VFS가 해당 저장 장치의 실제 파일 시스템에 맞는 드라이버를 통해 적절한 동작을 수행하도록 중계합니다. 이는 시스템의 유연성과 확장성을 극대화하는 핵심적인 설계입니다.
2) 저널링 (Journaling): 신뢰성의 기술
파일을 쓰는 도중 시스템에 장애가 발생하면, 메타데이터와 실제 데이터 간의 불일치가 발생하여 파일 시스템이 손상될 수 있습니다.
저널링는 파일 시스템을 변경하기 전, 수행할 작업 내역을저널이라는 별도의 로그에 먼저 기록하는 기술입니다.
데이터베이스의 트랜잭션 로그에서 유래한 이 기술은, 시스템 장애 후 재시작 시 저널을 검토하여 작업을 안전하게 완료하거나 원상 복구함으로써 파일 시스템의 일관성(Consistency)과 무결성(Integrity)을 보장합니다. ext4, NTFS, APFS 등 대부분의 현대 파일 시스템이 이 기술을 채택하여 데이터 신뢰성을 확보하고 있습니다.
오늘도 화이팅입니다.