Table of Contents
Abstract
본 글에서는 파일 시스템을 이해하는 데 필요한 파일 시스템 구성 요소와 더불어 파일 시스템이 왜 필요한지, 무엇인지에 대해 얘기해보려 한다. 파일 시스템은 디스크에 데이터를 저장하는데 있어 편리함과 효율을 챙기기 위해 만들어졌으며, I/O 효율을 위해 디스크는 섹터라는 단위를, 파일 시스템은 클러스터라는 단위를 사용해 데이터를 읽고 쓴다. I/O 작업의 최소 단위에 의해서 발생하는 빈 공간인 슬랙과 자칫 헷갈릴 수 있는 파티션과 볼륨에 대한 설명도 함께 작성했다.
File System
Why do we need a File System?
메모장에 작성한 텍스트를 파일로 저장하지 않고 메모장을 닫으면 그 내용을 두 번 다시 볼 수 없다. 즉 메모리 상의 데이터는 한 번 휘발되면 복구하기가 쉽지 않다. 그래서 두 번 세 번 혹은 그 이상 데이터를 재사용해야 하거나 기억할 필요가 있으면 전기 없이도 데이터를 가질 수 있는 저장장치(보조기억장치)에 그 데이터를 저장한다. 석기 시대의 인류는 동굴 벽을 저장장치로 사용해 그림 형태로 동물의 모습 데이터를 저장했다. 그렇지 않은가?
메모리처럼 디스크의 어느 위치든 자유롭게 접근할 수 있다고 생각해보자. 대신 파일 시스템 없이 Raw 데이터를 원하는 위치에 아무런 변형없이 저장해야 한다. 그렇다면 이 데이터를 다시 가져오기 위해선 어떤 값들이 필요할까. 섹터나 클러스터는 일단 생각하지 말자.
우선 "hello"라는 데이터가 저장된 디스크 내의 위치(오프셋)를 알아야 한다. 일단 이 값이 있어야 "hello"를 찾고 읽을 수 있을 것이다. MBR이나 GPT에서 보았듯 디스크는 이러한 오프셋 값을 정수로 다룬다. 다음으론 데이터의 크기다. 데이터의 크기가 5바이트인 것을 알아야 불필요한 데이터까지 가져오지 않을 것이다.
데이터 하나 정도야 오프셋 어찌어찌 외운다고 치자. 그런데 디스크에 저장한 데이터 수가 너무나도 많아진다면? 석기 시대 인류처럼 동굴 벽에 오프셋과 크기를 다 적을 것인가? 심지어 오프셋과 크기만으로는 해당 위치에 저장된 데이터가 어떤 데이터인지 감도 잡을 수 없다. 또한 새로운 데이터를 디스크에 쓰려고 할 때 마다 적당한 크기의 빈공간이 존재하는 지도 매번 계산하고 찾아야 한다. 그뿐인가? 기존 데이터를 새로 수정할 때도 여간 귀찮은 일이 아닐 것이다.
디스크에 데이터를 저장하고 관리하는 시스템이 없을 때 생기는 단점을 대충 정리해보면 아래 목록과 같지 않을까 싶다. 더 많을테지만 생각나는 것만 적어봤다.
- 데이터가 저장된 위치를 일일이 기억하기 힘들다.
- 해당 위치에 저장된 데이터의 크기를 일일이 기억하기 힘들다.
- 해당 위치에 저장된 데이터가 어떤 데이터인지 기억하기 힘들다.
- 데이터 사이사이 빈 공간을 찾기가 힘들어진다. (기존 데이터를 삭제했다면 사이사이 거대한 빈 공간이 생길 수 있다.)
- 데이터를 수정(특히 크기가 거진 경우)하기가 힘들어진다.
- 의미나 쓸모가 비슷한 데이터들을 묶기가 힘들다. (폴더에 넣는다든지)
- 압축(CNTFS), 암호화(비트락커 등), 저널링, 다국어 지원 등 다양한 추가 기능에 대한 요구를 충족하기가 힘들다.
What is a File System?
What is a File System? [1]
A file system is a means to organize data expected to be retained after a program terminates by providing procedures to store, retrieve and update data, as well as manage the available space on the device(s) which contain it. File system formats define the way that data file is stored on storage media and they affects a file system's structure. A file system organizes data in an efficient manner and is tuned to the specific characteristics of the device. File systems allocate space in a granular manner, usually multiple physical units on the device. The file system is responsible for organizing files and directories and keeping track of which areas of the media belong to which file and which are not being used.
앞서 봤듯이 데이터를 별다른 구조, 메타데이터, 시스템 없이 날 것 그대로 저장하는 건 사람에게 있어 큰 불편을 가져다준다. 그래서 디스크에 데이터를 저장할 때 어느 위치에 저장했고, 크기는 얼마이며, 그 데이터의 이름은 무엇이고, MAC 시간은 언제이고부터 시작해 데이터가 저장되지 않은 빈 영역은 얼마나 있고, 필요하면 압축이나 암호화같은 부가 기능도 제공하는 파일 관리 체계가 필요하게 된 것이다.
파일 시스템은 컴퓨터에서 파일이나 자료를 쉽게 찾고 접근할 수 있도록 보관하고 조직하는 시스템을 말한다.[2] 하드 디스크 드라이브(HDD), 솔리드 스테이트 드라이브(SSD), CD/DVD 같은 광학 드라이브, USB 드라이브와 같은 플래시 메모리, 플로피 디스크, 자기 테이프 등 다양한 저장장치의 저장공간을 쉽게 사용하고 관리할 수 있도록 하는 것이다. 각각의 파일 시스템마다 파일을 관리하는 방법이 다르기 때문에 파일을 관리하는 실제 방법은 FAT 등 파일 시스템에 대한 글에서 설명하겠다.
파일 시스템은 프로그램이 아닌 명세에 가깝다. Windows 시스템을 예로 들면 FAT는 fastfat.sys, NTFS는 ntfs.sys, exFAT는 exfat.sys 같은 드라이버 실행 파일 형태로 각 파일 시스템 기능을 제공한다. Linux 시스템은 커널 모듈의 일부로 각 파일 시스템 기능을 제공하고 있다. 그 파일 시스템의 설계대로 분석하는 코드를 작성해 실행하면 우리도 파일 시스템을 인식할 수 있는 뷰어 정도는 만들 수 있게 되는 것이다.
파일 시스템 목록은 위키피디아에 잘 정리돼있다.
https://ko.wikipedia.org/wiki/%ED%8C%8C%EC%9D%BC_%EC%8B%9C%EC%8A%A4%ED%85%9C_%EB%AA%A9%EB%A1%9D
Organization of a File System
전반적인 파일 시스템의 구조에 대해서 알아보자. 대부분의 파일 시스템은 파일 목록이 저장된 파일 테이블, 파일의 속성 정보가 저장된 메타데이터, 파일의 실제 내용이 저장된 데이터 영역으로 나뉜다. 각 구성요소가 실제 파일 시스템에서 어떻게 구현되는지는 후에 FAT 등 파일 시스템을 설명하는 글에서 다루도록 하겠다.
File Table
디스크, 정확히는 파일 시스템이 설정되어 접근 가능하게 된 볼륨에 저장된 파일과 폴더(디렉토리)의 목록이 저장되는 영역이다. NTFS에서는 $MFT 파일이 이에 해당한다. 파일 시스템들은 파일 테이블 영역에 일정 크기의 엔트리들로 각각의 파일과 폴더를 나타낸다. 이 엔트리는 메타데이터들로 채워진다.
Metadata of a file
파일의 속성에 대한 정보가 저장되는 영역이다. 파일의 이름, 크기, 실제 데이터가 저장된 볼륨 내 위치, 부모 엔트리(폴더 같은), MAC 시간부터 파일의 접근/읽기/쓰기 등의 권한 정보 등 파일의 실제 내용을 제외한 기타 정보들이 저장된다.
Real data of a file
파일의 실제 내용이 저장되는 영역이다. 파일의 크기라고 하는 건 보통 실제 데이터의 크기를 의미한다.
Sector and Cluster
섹터와 클러스터는 파일 시스템을 이해하는 데 있어 반드시 알아야 하는 개념이다.
Sector
디스크와 같은 저장장치는 특유의 대용량 특성과 I/O 부하 절약을 위해 메모리처럼 1 바이트 마다 주소를 할당하지 않는다. 보통 512 바이트 크기를 최소한의 데이터 입/출력 단위로 사용하는데, 이 512 바이트 단위를 섹터라고 한다.[3] 오늘날 저장장치의 용량이 더욱 커지면서 4 TB 이상의 저장장치에서는 섹터 크기가 4096 바이트인 경우도 볼 수 있다.
접근하려는 파일의 실제 내용에 접근하려면 실제 내용이 저장된 섹터의 주소로 접근해야 한다. 섹터의 주소를 지정하는 방식은 CHS와 LBA가 있다. CHS는 물리적인 실린더, 헤드, 섹터의 주소를 각각 지정해 접근하는 방식이고, LBA는 디스크 내의 모든 물리적인 섹터를 선형적인 배열 형태로 취급해 0부터 1씩 늘려가며 접근할 수 있도록 한 방식이다. 오늘날에는 LBA 방식을 가장 많이 사용한다.
Cluster
클러스터란 파일과 폴더에 대해 디스크 공간을 할당하는 단위이다. [4] 논리적으로 연속된 여러 개의 섹터를 하나로 묶어 사용하는 방법인데, NTFS는 보통 512 바이트 섹터 8개를 묶어 4,096 바이트 크기의 클러스터를 파일 할당의 최소 단위로 사용한다. 클러스터를 사용하면 디스크 I/O 횟수를 줄일 수 있다는 장점이 생긴다. 4,096 바이트 데이터를 디스크에 쓴다고 가정하면 클러스터 단위를 사용하면 1번의 출력이면 되지만, 섹터 단위를 사용하면 8번의 출력 시도가 발생한다. 쉽게 말해 한번 읽고 쓸 때 클러스터 단위로 읽고 쓴다고 생각하면 된다.
Windows 시스템에서 파일의 속성을 볼 때 "디스크 할당 크기(Size on disk)"라고 나오는 부분이 해당 파일이 할당 받은 클러스터의 전체 크기를 의미한다.
Slack
섹터와 클러스터를 보고 의문이 들었을 지 모르겠다. '만약 데이터의 크기가 섹터 크기보다 작으면 나머지 공간은 어떻게 되지?' 혹은 '클러스터 크기보다 작으면 남은 공간은?' 같은 의문이 들었다면 섹터와 클러스터를 잘 이해한 것이라고 보면 된다. 이처럼 물리적인 구조와 논리적인 구조의 차이에 의해 발생하는 사용되지 않는 낭비 공간을 슬랙이라고 한다. [5] 아래 그림은 하나의 클러스터에 8개의 섹터가 존재한다고 했을 때 발생할 수 있는 슬랙들을 그림으로 나타낸 것이다.
슬랙의 종류는 아래 표와 같다.
종류 | 설명 |
램 슬랙 | 데이터가 디스크에 기록될 때는 섹터 단위로 기록된다. 만약 디스크에 기록되는 데이터가 섹터 크기의 배수가 아니면 섹터 크기와 데이터 크기 사이에 차이가 발생한다. 이로 인해 섹터 단위로 발생한 빈 공간을 램 슬랙(RAM Slack) 또는 섹터 슬랙(Sector Slack)이라고 한다. |
드라이브 슬랙 | 파일 시스템은 데이터를 디스크에 기록할 때 클러스터 단위로 기록하는데, 클러스터는 논리적으로 연속된 섹터를 일정 개수 단위로 묶은 것이다. 데이터가 하나의 클러스터에 포함된 모든 섹터를 사용하지 않을 정도로 작으면 당연히 사용되지 않는 섹터가 발생할 것이다. 이처럼 클러스터 내에서 섹터 단위의 빈 공간을 드라이브 슬랙(Drive Slack)이라고 한다. |
파일 슬랙 | 램 슬랙과 드라이브 슬랙을 합친 영역으로, 하나의 클러스터 내에서 사용되지 않은 전체 영역을 의미한다. |
파일 시스템 슬랙 | 하나의 파일 시스템이 설정된 볼륨은 볼륨 내의 영역들을 클러스터 단위로 참조한다. 만약 볼륨에게 할당된 전체 섹터 개수가 클러스터당 섹터 개수의 배수가 아니면 클러스터로 할당하지 못하는 나머지 섹터들이 존재한다. 이처럼 파일 시스템에 의해 발생된 슬랙을 파일 시스템 슬랙이라고 한다. |
볼륨 슬랙 | 디스크 내에서 파티션을 나눌 때 어느 파티션에도 속하지 못한 섹터들을 볼륨 슬랙이라고 한다. |
Partition and Volume
파티션과 볼륨에 대해서는 앞서 MBR에서 자세하게 설명했었다. 파티션과 볼륨에 대한 내용을 적은 MBR 글의 링크로 본 섹션의 내용을 대신하겠다.
- #1 MBR - Master Boot Record
https://geun-yeong.tistory.com/67
Close
이상으로 파일 시스템이 왜 필요한지, 파일 시스템이란 무엇인지 등 파일 시스템에 대한 개론을 알아봤다. 이와 같은 개념들을 잘 이해하고 있다면 추후 FAT, NTFS 같은 파일 시스템을 이해할 때 큰 어려움이 없을 것이다.
Refs.
- [1] Windows File Systems
- [2] 파일 시스템
- [3] MBR, GPT, Filesystem
- [4] 데이터 클러스터
- [5] Slack
'Digital Forensics > File System' 카테고리의 다른 글
#2 FAT - Directory Entry (2) | 2022.02.01 |
---|---|
#1 FAT - File Allocate Table (0) | 2022.01.20 |
#3 GPT - GPT 복구 (0) | 2022.01.08 |
#2 GPT - GUID Partition Table (2) (0) | 2022.01.08 |
#1 GPT - GUID Partition Table (1) (0) | 2022.01.06 |