본문 바로가기

Job Notes/File System

File system의 이해

출처: 데브피아(http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=6726&MAEULNo=861&no=26721&ref=26721)

아래의 글은 한빛미디어에서 나온 "임베디드 개발자를 위한 파일시스템의 원리와 실습(정준석, 정원용)"의 내용을 바탕으로 요약해 놓은 자료입니다. 만약 저작권 관련하여 문제가 된다면 연락해주십시오. 삭제하도록 하겠습니다. 글이 필요하신분은 마음껏 참조하셔도 좋습니다만 출처만은 밝혀주십시오.

 

 

1장 파일시스템의 이해

 

 

 

1.1 파일시스템의 정의

 

1.1.1 파일 시스템의 정의

파일 시스템은 저장장치 내에서 데이터를 읽고 쓰기 위해 미리 정해진 약속이다. 파일 시스템은 저장할 데이터를 결정하고, 그 크기와 위치 등을 미리 약속한 뒤 운영체제 등에서 그대로 사용하면 된다. 실제 사용되는 파일 시스템의 데이터 구조는 방대하고, 그 규약들이 복잡하지만 결국 '미리 약속한 방법으로 저장하고 읽어 들이는것'이다. 그러니 앞으로 우리가 분석할 파일 시스템들을 접할 때 그 분량과 방식에 당황하지 말고, '결국 남이 만들어놓은 약속대로 읽고 쓰면 된다.' 라고 생각하고 가벼운 마음으로 접근하도록 하자.

 

 

 

1.2 파일시스템의 분류

 

1.2.1 FAT(File Allocation Table) 파일 시스템

마이크로 소프트사의 빌게이츠가 만들었고, 전 세계적으로 가장 많이 사용되는 파일 시스템 중의 하나이며, 초기에 만들어진 파일 시스템. 단순한 구조를 지니고 있으며 최근 대용량 저장장치를 지원하기 위해 FAT16, FAT32 등이 만들어진 이후 윈도우 OS의 흥행과 더불어 지금도 널리 사용되고 있다.

 

1.2.2 HPFS(High Performance FileSystem)

IBM의 OS/2 1.2부터 사용된 파일 시스템이며 NTFS가 나오기 까지 많은 영향을 준 파일 시스템. 대용량 디슨크에 적합한 구조를 지니고 있었으며, 효율적인 캐싱과 FAT 파일 시스템에 비해 파일 손실과 단편화가 적고, 서버 시스템에 사용할 수 있도록 여러가지 보안 기능 등에 대한 요구를 충족시켜 줄 수 있는 파일 시스템. OS/2가 윈도우 NT와의 경쟁에서 밀려 흥행이 실패하면서 우수한 성능 및 발전 가능성에도 불구하고 비운의 파일 시스템이 되었다.

 

1.2.3 NTFS(New Technology FileSystem)

마이크로소프트사의 서버급 운영체제인 Windows NT에서 사용되는 파일시스템. NTFS는 대용량 저장장치를 겨냥해서 제작되었으며 FAT와 HPFS에 있던 여러 제약 사항들을 크게 개선한 파일 시스템이다. 그러나 제작사인 MS에서 전체 스펙을 공개하지 않아 현재까지도 완벽한 분석이 이루어 지지 않았으며, 이로 인해 리눅스 등의 다른 OS에서 NTFS를 지원한다고 해도 미흡한 부분이 있을 수 밖에 없다.

 

1.2.4 UFS(Unix FileSystem)

UFS는 유닉스의 대표적인 파일 시스템으로서 현재까지 쓰이는 대부분의 유닉스에서 사용되는 팡리시스템의 근간이 되었다. BSD 계열(FreeBSD, NetBSD, OpenBSD 등)은 물론이고 HP-UX, Apple OS X, Sun Solaris에 이르기까지 많은 유닉스 계열의 OS들이 UFS를 각각의 OS에 맞게 변형해서 사용하고 있다. 빠른 속도와 높은 안정성을 목표로 만들어졌으며 저장장치를 그룹화 하여 관련된 데이터끼리는 최대한 가까운 위치에 자리할 수 있는 구조로 되어 디스크 헤드의 이동이 적고, 중요한 데이터는 여러 그룹에 걸쳐 많은 백업을 저장하므로 만일의 사태에 대하여 보다 신뢰성을 높였다.

 

1.2.5 Ext2 파일시스템(Second Extended FileSystem)

Ext2 파일시스템은 현재 리눅스의 기본 파일시스템인 Ext3에서 저널링 기능을 뺀 파일시스템으로서 UFS를 근간으로 하고 있다. UFS에서 유명무실한 구조들은 제거하고, 전체적인 구조를 보다 간략히 한 Ext2는 비교적 명료하고 간단하면서도 UFS의 속도와 안정성을 고루 갖춘 파일시스템이다.

 

 

 

1.3 파일시스템의 요소들

 

1.3.1 클러스터

클러스터는 운영체제가 저장장치에 데이터를 읽고 쓰는 논리적인 기본 단위이며, 파일시스템에 따라서 그 크기가 고정되어 있기도 하고, OS가 파일 시스템 생성 시 저장장치의 크기를 고려하여 클러스터의 크기를 조절하기도 한다. 크기가 작은 파일을 저장장치에 쓰고자 하는 경우 클러스터의 크기보다 파일의 크기가 작아서 공간이 남게 된다면 나머지 공간은 사용이 불가능하게 된다. 예를 들어 1KB미만의 파일들이 대부분인 상황이라면 클러스터의 크기를 1KB로 설정해야 현명한 선택이다. 그렇지 않고 4KB로 설정하였다면 모든 파일마다 3KB 정도의 공간이 낭비되므로 결국에는 실제 사용되는 영역보다 낭비되는 영역이 더 많아지는 상황도 있을 수도 있다.

 

1.3.2 파일

파일시스템이란 결국 파일을 기록하기 위한 것이므로 파일을 이루는 구조와 그것을 관리할 수 있는 추가적인 방법을 제시하는 것이다. 파일은 속성을 기록하는 메타 데이터 영역과 실제 데이터를 기록하는 데이터 영역으로 나눌 수 있다. 메타 데이터라 함은 파일 시스템에서 파일을 관리할수 있는 정보 자체를 말하며 파일의 속성은 물론 실제 데이터를 기록한 위치를 찾아 가기 한 정보들을 포함한다. 모든 파일시스템들은 이러한 정보들을 어딘가에 저장해 두었다가 OS가 정보를 요청하면 해당 파일을 찾아서 정보를 조합하여 넘겨주면 사용자가 파일이라 부르는 정보가 되는 것이다.

 

1.3.3 디렉토리

디렉토리는 현존하는 모든 파일시스템들이 도입한 개념으로서 파일들을 계층화하고 그룹화 할 수 있다. 상, 하위 개념의 디렉토리와 파일들은 그것들을 관리함에 있어서 많은 이점을 제공하며, 때로는 이러한 개념을 뛰어넘기 위한 링크(link) 등의 방법을 제공하는 파일시스템들도 있다.

 

1.3.4 소유권

개인용 컴퓨터와 서버용 컴퓨터의 파일시스템간의 두드러진 차이점 중의 하나는 각 파일마다 그룹과 소유권을 따로 관리할 수 있다는 점이다. FAT파일 시스템에서는 소유권을 관리할 수 없기 때문에 OS 차원에서 제한을 두는 것은 한계가 있기 때문이다. 반대로 NTFS, Ext2를 비롯한 서버급 컴퓨터를 겨냥한 파일시스템은 모든 파일에 사용자 그룹과 소유 권한을 부여할 수 있어서 서로 다른 사용자 파일간의 배타적인 접근이 가능하며, 사용자가 시스템 파일에 허가 없이 접근하는 것을 막을 수 있다.

 

1.3.5 동기화

현재의 모든 OS들은 멀티태스킹 기능을 지원하여, 하나의 CPU에서도 여러 프로그램이 동시에 실행되는 것처럼 동작한다. 이때 주의해야 할 점이 바로 동기화 작업이다. 하나의 파일에 여러 프로세스가 동시에 접근해서 작업을 하는 경우 해당 파일에 락을 걸어주고 적절한 시점에 해제하는 동기화가 진행되어야 하는데, 파일시스템을 제작하면서 동기화만큼 손이 많이 가는 작업도 드물다.

 

1.3.6 일관성 체크와 저널링

파일 시스템에서 일관성이 깨지는 것을 최소화 할 수 있는 여러가지 방법이 도입되어야 한다. 가장 우선적으로 파일 시스템 구현시 이러한 상황을 대비해야 하며, 파일을 쓸 때 메타 데이터와 파일 데이터를 쓰는 순서부터 시스템 Crash 상황을 고려해야 한다. 요즘과 같이 하드 디스크의 용량이 수백 GB에 이르는 저장장치의 일관성 체크를 하다보면 몇 시간이 걸릴 수도 있다. 이러한 상황을 위해 나온것이 바로 저널링 기능이다.

저널링이란 데이터베이스에서 일관성 체크를 위해 사용되는 방법을 파일시스템에 적용한 것으로서, 파일시스템 업데이트 시에 로그를 기록하고 문제가 생길 경우 해당 로그를 참조하여 업데이트를 취소할 수도 있고 파일시스템에 적용 완료할 수도 있다. 최근의 대부분의 파일시스템들은 모두 저널링 기능을 지원한다.

 

1.3.7 보안

중요한 데이터에 대한 접근 권한을 최소화하고, 로그인 패스워드를 복잡하게 만들었다고 해도, 하드디스크를 떼어다가 다른 PC에 연결하면 그만이다. 이런 상황을 위해 파일시스템의 암호화 기법을 도입할 수 있다. 파일시스템의 암호화는 일반적으로 널리 쓰이고 있지는 않지만, 서버급 OS에서 사용되는 파일시스템들은 기본적으로 암호화 기능을 제공하기도 하며 최근에는 관련 툴이 다양하게 나와 있어서 대부분의 OS와 파일시스템에서 암호화를 적용할 수 있다.

 

 


 

1.4 저장장치 소개

 

1.4.1 저장장치 소개

저장장치란 컴퓨터가 처리하는 데이터들과 프로그램들을 반영구적으로 담고 있는 장치들을 말한다. 우리가 사용하는 대부분의 컴퓨터들은 저장장치에서 데이터를 읽어와서 메모리에 적재한 후 CPU가 그 데이터를 처리한다. CPU 입장에서 본다면 저장장치들은 많은 용량을 담을 수 있는 반면 너무 느리기 때문이다.

 

1.4.2 하드디스크 분석

 

1.4.2.1 트랙

디스크의 중심으로부터 반지름이 같은 영역을 이어놓은 원을 생각하면 된다. 반지름이 커질수록 원이 커지는 만큼 디스크의 가장자리 영역에 데이터를 많이 보관할 수 있게 된다.

 

1.4.2.2 섹터

원을 균일하게 자를 때 부채꼴 형태의 모양이 나오듯이, 디스크에서 부채꼴 형태로 자른 뒤 다시 트랙으로 자른 형태가 바로 섹터이다. 각각의 섹터는 571Byte의 공간을 차지한다. 이중 59Byte는 각각의 섹터에서 고유 번호 등을 저장하는 용도로 사용되고, 나머지 512Byte가 사용자들의 데이터 저장에 사용되는 영역이다.

 

1.4.2.3 실린더

여러장의 플래터가 수직으로 같은 위치에 있게 되는데, 이때 수직으로 같은 위치에 있는 트랙들을 합쳐서 실린더라고 한다.

 

1.4.2.4 헤드

헤드 암의 가장 끝부분에는 데이터를 읽고 쓰기 위해 헤드가 존재한다. 헤드는 각각의 플래터 표면에 하나씩 할당되어 있어서 하드디스크는 '플래터의 개수*2'개의 헤드를 가진다. 헤드는 따로 움직이는것이 아니라 헤드 암에 의해 액츄에이터로 연결된다. 때문에 헤드가 각 플래터의 동일한 트랙을 돌며 움직이므로 실린더의 개념이 생겨나는 것이다.

 

1.4.3 하드디스크 인터페이스

 

1.4.3.1 ATA 또는 IDE

일반적으로 IDE또는 ATA를 혼용해서 이야기 하는데, ATA라고 하는 것이 좋다. IDE는 인터페이스를 만든 회사 이름이다. ATA는 1980년대 중반에 HDD를 접근하기 위해 만들어진 표준이다. 가격이 저렴하고 인터페이스를 제어하기도 편리한 부분이 많아서 점저 많이 쓰이다가 표준이 되어 현재 HDD 인터페이스 방식의 대부분을 차지하고 있다.

 

1.4.3.2 SCSI

ATA방식에 비해 빠르고 확장성이 좋지만 비싼 편이다. ATA 방식이 SCSI 방식에 비해 저렴한 이유는 외부에 컨트롤러를 따로 두지 않아도 되고, 인터페이싱을 하는 프로토콜이 SCSI의 그것에 비해 단순하기 때문이다. ATA의 단점은 CPU점유율이 높다는 건데, DMA를 쓴다면 이 문제도 만이 해결된다.

 

1.4.4 ATA 레지스터

ATA 레지스터들은 같은 어드레스의 레지스터라고 할지라도 그 레지스터를 읽느냐 쓰느냐에 따라 기능이 달라진다. 이번에는 하드디스크를 접근하는 기본 단위에 대해 알아보자.

 

1.4.4.1 CHS Address

CHS는 각각 실린더, 헤드, 섹터를 나타내며, 디스크의 주소는 물리적인 CHS 주소로 나타내어지며 초기의 하드디스크를 접근하는 방법도 CHS 주소를 사용했다.

 

1.4.4.2 LBA 모드

ROM BIOS를 통하여 CHS 모드를 사용한 하드디스크의 접근은 현재 주로 사용되는 수십, 수백 GB의 하드디스크를 이용할 수 없다. 이를 극복하기 위하여 물리적인 방법이 아닌 논리적인 방식의 디스크 접근 방법이 고안되었다. LBA(Logical Block Area)는 CHS 모드와 같이 물리적인 특성에 따른 기본 단위를 따로 계산하는 것이 아니라 섹터들을 일렬로 죽 늘어놓은 것과 같은 논리적인 개념이다.

 

 

 

 

 

 

2장 파티션

 

 

2.1 파티션 소개

 

2.1.1 파티션이란?

파티션은 연속된 저장 공간을 하나 이상의 연속되고 독립된 영역으로 나누어서 사용할 수 있도록 정의한 규약이다.

2.2.2 파티션 정보의 관리

파티션을 나누어서 사용하는 모든 저장장치에는 파티션들의 정보를 파악 할 수 있는 영역이 따로 존재한다. DOS 기반의 파티션으로 보자면 MBR(디스크의 0번 섹터) 영역 내에 '파티션 테이블'이 존재한다. 이 파티션 테이블이 저장장치 내 파티션들의 속성을 가지고 있고, 여기에서 부팅 가능 여부, 파티션에서 사용되는 섹터의 개수 등 자세한 정보들을 알아 낼 수 있다.

 

2.2.3 파티션의 사용 용도

1) 하나의 물리적인 디스크를 여러 논리 영역으로 나누어 관리를 용이하게 하기 위해

2) OS 영역과 Data 영역으로 나누어 OS 영역과 따로 포맷 및 관리하기 위해

3) 여러 OS를 설치하기 위해

4) 하드디스크의 물리적인 배드 섹터로 특정 영역을 잘라서 사용하기 위해

 

2.2.4 파티션과 볼륨의 차이점

볼륨의 정의 : 볼륨은 OS나 Application 등에서 이용할 수 있는 저장 공간, 즉 섹터들의 집합이다.

위의 정의에서 저장 공간으로 끝나지 않고 섹터들의 집합이란 표현을 사용한 이유는 물리적인 연속된 공간이 아니어도 볼륨으로 볼 수 있기 때문이다. 예를 들어 2개의 하드디스크를 사용하는 시스템에서 마치 하나의 하드디스크처럼 인식하여 사용할 수 있는 것이다.

파티션은 볼륨이라고도 할 수 있다. 파티션 역시 저장공간이므로 볼륨이라고 볼 수 있다. 하지만 파티션은 볼륨과 달리 반드시 연속되어 있는 섹터들의 집합이어야 한다.

 

 

 

2.2 MBR

 

2.2.1 MBR이란?

MBR(Master Boot Record, 마스터 부트 레코드)은 말 그대로 Boot Record들의 메인 격이라 할 수 있다. 부트 레코드는 각 파티션의 첫 번째 섹터에 위치하며, 주된 목적은 해당 파티션에 설치된 OS를 부팅해 주는 역할을 한다. OS를 실행하기 위해 부트로더를 호출하는 것이다. 파티션을 나누지 않은 상태라면 부트레코드는 MBR 위치에 기록되어 있을 것이다. MBR은 2개 이상의 BR을 대표하는 BR이며, 각각의 파티션에 속한 BR을 호출하기 위한 프로그램 영역과 파티션들의 정보를 담고 있는 파티션 테이블을 포함한다.

 

2.2.2 MBR의 구조

MBR은 크게 두 영역으로 나눌 수 있다. 하나는 부트 코드영역이로 다른 하나는 파티션 정보를 저장하고 있는 파티션 테이블 영역이다. 다른 OS의 경우 대부분 부트 코드 영역이 몇 섹터에 걸쳐서 저장되기도 하고, 파티션 영역을 저장하는 영역도 한 섹터 또는 몇 섹터에 걸쳐서 저장하기도 하지만, Microsoft의 MBR에는 부트 코드와 파티션 테이블이 둘다 들어가 있는 것이 특징이다. 0번 섹터의 512Byte중 부트 코드 영역은 상위 446Byte를 사용하고 있으며 그 뒤의 64Byte를 파티션 테이블이, 하위 2Byte는 MBR의 시그너쳐인 0xAA55가 들어간다.

 

 

 

 

 

3장 FAT 파일 시스템

 

 

 

3.1 FAT 파일 시스템 소개

 

3.1.1 FAT 파일시스템의 배경

FAT 파일 시스템은 1976년에 Microsft의 빌게이츠에 의해 최초로 구현되었다. 그러나 정작 PC 환경에 널리 쓰이게 된 계기는 Tim Paterson이라는 사람이 QDOS라는 운영체제를 개발하면서 QDOS가 이용할 파일시스템으로 FAT 파일 시스템을 선택하고서 부터이다.

 

3.1.2 FAT12

1980년에 나온 FAT 파일시스템의 최초 버전은 다른 버전들과 구분하기 위해 FAT12라고 불린다. 이것은 플로피디스크에 파일을 저장하기 위해 개발되었다. 최초의 버전에는 디렉토리라는 개념도 없었다. 1983년 MDS-DOS2.0이 나오고 나서 FAT12에 계층형 디렉토리가 지원되게 되었다.

 

3.1.3 FAT16

HDD기술의 발달로 개인용 컴퓨터에 사용할 HDD용 파일 시스템의 필요성이 증가되었다. 따라서 MS-DOS 4.0을 통해서 FAT16을 발표한다. 이전과의 차이점은 클러스터를 표현하는 비트수가 12개에서 16개로 늘어나 이론적으로는 클러스터 크기를 32KB로 할 경우 2GB까지 표현할 수 있었다.

 

3.1.4 VAT(virtual FAT)

기존보다 향상된 파일 시스템으로 Windows95에 탑재되었다. 32bit 보호 모드에 적합하게 재작성하였고, 독점 모드를 추가하여 동시에 여러 프로그램이 같은 파일을 접근할 경우에 대비하였다. 또한 LFNs(Long File Name)를 지원하여 8.3Naming을 최대 255자 까지 늘려 파일명의 길이 제한으로부터 자유로울수 있었다.

 

3.1.5 FAT32

FAT16의 2GB의 용량 표현 한계 때문에 1996년 Windows95 OSR2를 발표하면서 FAT32를 선보였다. 이는 클러스터를 표현하는 bit를 32개로 늘려 최상위 예약 4bit를 제외하고 28bit를 이용하여 최대 4TB까지 인식이 가능하였다. 하지만 여러 이유 때문에 실제로는 최대 32GB로 제한하고 있다.

 

3.1.6 FAT 파일시스템의 비교

 

● 파일시스템 비교

StartFragment

구분

FAT12

FAT16

FAT32

사용 용도

플로피

티스크용

저용량

하드디스크

고용량

하드디스크

클러스터 표현 비트 수

12bit

16bit

32bit

(28bit 사용)

최대 클러스터 개수

4,048개

65,524개

약 228

최대 볼륨 크기

16MB

2GB

2TB

파일의 최대 개수

볼륨

크기만큼

볼륨

크기만큼

4GB

디렉토리당 최대 파일 개수

X

65,535개

65,535개

루트 디렉토리의 파일 개수 제한

있음

있음

없음


 


 

● FAT 파일시스템의 호환성

StartFragment

운영체제

FAT12

FAT16

FAT32

NTFS

MS-DOS

 

 

Window 95

 

 

Window 95 OSR2

 

Window 98

 

Window Me

 

Window NT 4.0

 

Window 2000

Window XP


 


 

● 클러스터 크기와 슬랙(Slack) 문제

StartFragment

볼륨 크기

FAT16 클러스터 크기

FAT32 클러스터 크기

NTFS 클러스터 크기

16MB ~ 32MB

512Byte

지원 안 함

512Byte

32MB ~ 64MB

1KB

512Byte

512Byte

64MB ~ 128MB

2KB

1KB

512Byte

128MB ~ 256MB

4KB

2KB

512Byte

256MB ~ 512MB

8KB

4KB

512Byte

512MB ~ 1GB

16KB

4KB

1KB

1GB ~ 2GB

32KB

4KB

2KB

2GB ~ 4GB

64KB

4KB

4KB

4GB ~ 8GB

지원 안 함

4KB

4KB

8GB ~ 16GB

지원 안 함

8KB

4KB

16GB ~ 32GB

지원 안 함

16KB

4KB

32GB ~ 2TB

지원 안 함

인식 가능

4KB


 


3.1.6.1 클러스 크기에 따른 장단점

 

클러스터 크기가 작을 때의 장점은 버려지는 용량이 적고 단점으로는 FAT 영역이 커진다.

클러스터 크기가 클 때에 장점은 FAT영역이 작고 Cluster 처리 부담이 적어지나 단점으로는 버려지는 용량(Slack)이 많아진다.

 

 

 

3.2 FAT 파일 시스템 구조

 

◆ FAT 파일 시스템의 구조

 FAT16과 FAT32는 기본적인 구조에서 거의 비슷하나 FAT16은 루트 디렉토리 영역이 따로 존재한다는것이 다르다. FAT16에서는 반드시 FAT#2 영역 뒤에 와야 하지만 FAT32는 루트 디렉토리 역시 일반 디렉토리 중의 하나로 간주하기 때문에 데이터 영역 어디에 오든 상관이 없게 되었다.

◆ 부트 레코드(Boot Record)

 이 영역은 볼륨의 첫 번째 섹터를 의미한다. 이 영역에는 Windows를 부팅시키기 위한 기계어 코드와 FAT 파일 시스템의 여러 설정 값들이 담겨있다. 이 영역은 BIOS Parameter Block(BPB)이라고도 한다.

◆ 예약된(Reserved) 영역

 이 영역은 미래를 위해 예약해 놓은 영역이다. FAT16인 경우에는 1섹터를, FAT32인 경우에는 32섹터를 할당한다.

◆ FAT#1 영역과 FAT#2 영역

 FAT영역은 클러스터들을 관리하는 테이블이 모여 있는 공간이다. FAT영역을 통해서 어떤 클러스터가 비어 있는지, 어떤 파일에 어떤 클러스터가 연결되어 있는지를 알 수 있게 된다. 매우 중요한 영역이기에 FAT 영여그이 백업본을 한 개 이상 만들어 두게 해 놓았다. FAT#2는 FAT#1과 동일한 내용을 담고 있다. 일종의 백업본인 것이다. 이것은 최소 1개 이상이어야 하며, 3개를 만들어도 된다. 전 세계의 많은 FAT 코드는 보통 2개의 영역을 만든다.

◆ 루트 디렉토리 영역(FAT16에만 존재)

 이 방식은 루트 디렉토리가 어디에 있는지를 조사 할 필요가 없어서 개발의 편의성이 증가하게 되는 장점이 있지만, 루트 디렉토리의 파일 개수 제한 등 단점이 있어서 FAT32에서는 구조가 바뀌었다.

◆ 데이터 영역(파일과 디렉토리)

 이 영역에는 파일 또는 디렉토리가 저장되어 있다. 이 영역은 클러스터라고 불리는 논리적인 단위로 읽기/쓰기가 된다.

◆ 사용하지 않는 영역

 이 영역은 물리적으로는 사용해도 상관없지만, FAT 파일 시스템이 볼륨을 구조하 시키는 과정에서 잉여분이 조금 남는 영역이다.

 

 

 

3.3 부트 레코드

 부트 레코드 소개BIOS Parameter Block(BPB)이라고도 불리며, 해당 볼륨이 부팅될 수 있도록 부팅에 필요한 실행 코드도 포함하고 있다. Boot Record가 저장되는 위치는 해당 볼륨의 첫 번째 섹터이다.

 

StartFragment

[그림 3-4] 파티션 없이 단일 볼륨인 하드디스크의 부트 레코드 위치

 

[그림 3-5] 파티션이 존재하고 볼륨이 2개인 하드디스크의 부트 레코드 위치

 

 

◆ 부트 레코드에서 FAT16과 FAT32의 차이

 

StartFragment

[그림 3-6] FAT16과 FAT32의 부트 레코드 레이아웃

 

부트 레코드의 0번 오프셋에서 32번 오프셋까지는 FAT16과 FAT32가 공통된 항목을 가진다. 32번 오프셋 이후는 FAT16과 FAT32의 항목이 서로 달라서 호환이 안 되는데, FAT 파일시스템을 구현할 때는 FAT16용 부트 레코드 구조체와 FAT32용 부트 레코드 구조체를 따로 선언해야 한다.

 

◆  FAT16 부트 레코드

 

StartFragment

[그림 3-7] FAT16 부트 레코드 영역을 출력한 값

 

 그림에서 보이는 512Byte의 16진수 내용이 FAT16 부트 레코드의 모든 것이다. 한 가지 유의해야 할 점은 FAT 파일시스템은 리틀 엔디언(Little Endian)으로 설계되었기 때문에 위의 그림에서 출력된 값들은 실제 저장한 값과 반대로 뒤집혀 있다.

 

StartFragment

[그림 3-8] FAT16 부트 레코드 항목들

 

 위 그림은 [그림 3-7]에서 보여준 데이터들이 어떤 항목인지를 보여주는 그림이다. 항목 중에 흐리게 칠해진 항목들은 FAT16과 FAT32 둘 다 가지는 공통 항목을 의미하고, 진하게 칠해진 항목들은 FAT16 전용 항목을 의미한다.

 

◆ FAT16과 FAT32 부트 레코드 공통 항목 설명

 

StartFragment

StartFragment

 

 이쯤 되면 클러스터의 크기를 알 수 있게 된다. 클러스터당 섹터 수가 2이고, 섹터당 512Byte라면 2 X 512 = 1024Byte, 즉 클러스터의 크기는1KB가되는것이다. Sector Per Cluster X Bytes Per Sector = 클러스터 크기

 

StartFragment

StartFragment

 

 Root Directory Entry Count 항목이 존재하는 이유는 FAT16의 경우 루트 디렉토리 영역이 따로 분리되어 있기 때문이다. 이 영역의 크기를 지정하기 위해서 위 항목이 존재하게 된다. FAT16에서는 루트 디렉토리에 넣을 수 있는 디렉토리나 파일의 수에 제한이 있는데 보통은 512개이며, 더 넣고 싶다면 Root Directory Entry Count 항목의 값을 변경하면 된다. 단, 루트 디렉토리의 크기가 부족하다고FAT16 파일시스템 사용 도중 마음대로 늘릴 수 없으니, 포맷을 할 때 신중히 결정해야 한다.

 

StartFragment

 

StartFragment

[표 3-6] Media 항목에 들어갈 수 있는 값들

 

 

 

StartFragment

 

 

◆ FAT16 부트 레코드 항목 설명

 

이제부터 FAT16에 해당하는 항목들을 살펴보자. 주의해야 할 점은 위치(Offset) 값의 시작이 36부터라는 점이다.

 

StartFragment

 

지금까지 FAT16에 해당하는 항목에 대해 모두 알아보았다.

 

 

 

◆ FAT32 부트 레코드 항목 설명

 

 이제부터 FAT32에 해당하는 항목들을 살펴보자. 주의할 점은 위치(Offset) 값의 시작이 36부터라는 점이다. 그 이전에 해당하는 값들은FAT 16/32의 공통 항목이다.

 

StartFragment

[그림 3-9] FAT32 부트 레코드 항목

 

StartFragment

[그림 3-10] Ext Flags 항목

 

[표 3-7] Ext Flags 항목 설명

 

 

StartFragment

 

 

 

 

--------------------------------------------------------

▒ 여기선 잠깐 ▒

 

부트 레코드 항목 중에는 문자열을 저장하는 항목이 몇 군데 있다. OEM Name, Volume Label, File System Type 항목은 문자열을 저장한다. 이들 항목에 문자열을 저장하는 데 있어서 주의해야 할 점은 빈 공간은 반드시 Space(0x20)로 처리해야 한다는 것이다. 예를 들어 C 언어로 File System Type에‘FAT16’이라는 문자열을 넣을 때 다음과 같이 코드를 작성했다고 하자.strcpy( FileSystemType, "FAT16" );그러면 저장되는 값은 다음과 같다.

 

 

StartFragment

 

 

하지만 FAT 파일시스템에서 문자열의 모든 빈 공간에는 Space가 들어가야 한다. 그러므로 다음과 같은 저장 형태를 가져야 한다.

StartFragment

 

위와 같은 형태로 들어가게 하려면 일반적으로 C 언어에서 제공하는 문자열 제어 함수를 사용하면 안 된다. 직접 특별한 문자열 제어 함수를 구현하든지 소스 작성하기가 귀찮다면 일일이 배열에 값을 넣어주면 된다

---------------------------------------------------------

 

 

 

 

 부트 레코드의 끝부분부트 레코드를 구현하는 데 있어 한 가지 주의 사항이 있다면 FAT16/32 모두 부트 레코드 영역의 Offset 511~512에는 반드시0xAA55라는 서명이 들어가야 한다는 것이다.

 

StartFragment

 

많은 FAT 관련 문서에서는“Signature의 위치는 부트 레코드 영역의 가장 끝부분이다.”라고 설명하고 있지만, 이것은 섹터의 크기가 512Byte일 경우에만 유효한 내용이다. Microsoft에서 제공하는 공식 문서에 따르면 섹터의 크기가 512Byte보다 큰 경우라도 Signature는 Offset 510~511에 와야 한다.

 

StartFragment

[그림 3-11] Signature의 위치

 

 

 

3.4 예약된 영역

 

 FAT 파일시스템에서 가장앞쪽에 위치하고 있는 영역. FAT16의 경우 이 영역의 크기가 보통 '1'이며 FAT32의 경우 보통 '32' 값을 가진다. 주요 사용 목적은 부트 레코드 저장과 주요 항목 백업이다.

 

 

 

3.5 FAT 영역

 

◆ FAT 영역 소개

 FAT 영역의 주된 목적은 파일의 할당을 관리하는 것이다. 단순히 클러스터의 상태값을 담고 있는 공간이 연속되는 단순한 형

태를 띠고 있다 .

 

◆  FAT 영역 분석

 FAT32 파일 시스템에서는 한 섹터당 128개의 FAT Entry를 담을 수 있으며, FAT16 파일 시스템에서는 한 섹터당 256개의 FAT Entry를 담을 수 있다. FAT Entry 0번과 1번을 제외한 모든 FAT Entry는 자신의 번호와 일치하는 클러스터와 1대1로 대응하며, 자신의 번호에 해당하는 클러스터의 상태 값을 저장한다. 0번과 1번은 존재하지 않는다.

 

◆ FAT 클러스터 연결 방식

 FAT 영역은 각각의 파일이나 디렉토리가 데이터 영역 내에 저장된 위치를 단일 링크드 리스트로 표현하고 있다. 각각의 FAT Entry들ㅇ느 자신의 다음 클러스터 값을 담고 있게 된다.

 

◆ FAT Entry의 상태 값들

 만약 자신이 파일 또는 디렉토리의 마지막 클러스터라면 Entry 값에 0x0FFFFFFF라고 적으면 되며 이것은 EOC(End of Cluster)라는 뜻이다. 0x0000은 비어있는 클러스터를 의미하며 0xFFF7은 불량 클러스터를 의미한다.

 

 

 

3.6 데이터 영역

 

◆ 데이터 영역의 소개

 데이터 영역은 볼륨에서 대부분의 영역을 차지하고 있는 영역이며 데이터들이 저장되는 영역이다. 데이터는 클러스터 단위로 접근된다. 데이터 영역에는 Directory Entry라 불리는 구조체들을 담고 있는 디렉토리와 파일이 저장된다.

 

◆원하는 파일 찾아가는 방법

 \DOC\A.TXT라는 파일을 찾으려면...

1. 루트 디렉토리가 담고 있는 디렉토리 Entry를 하나씩 조사해서 DOC라는 디렉토리가 있는지 알아본다.

2. DOC라는 디렉토리가 담고 있는 디렉토리 Entry를 조사한다.

3. A.TXT의 내용이 어디에 저장되었는지에 대한 정보를 확인한다.

4. A.TXT의 시작 클러스터를 읽어 화면에 뿌려준다.

 

 

 

3.7 Long File Names

 

 기존의 MS-DOS 등의 운영체제에서는 8.3 File Naming 방식이다. 하지만 사용자들은 큰 불편을 겪었고 Unix 계열처럼 긴 파일명을 바라게 되었다. 결국 Windows95가 발표되면서 Virtual FAT의 새로운 기능중의 하나인 LFNs가 추가되면서 해결되었다. LFNs의 주요특징을 살펴보면,

1. 유니코드 방식으로 인코딩되어 다국어 지원이 가능

2. 최대 255자 까지 저장

3. 확장자가 3개 이상 가능

4. 기존의 Short File Name과 호환 및 특수 문자 허용 범위가 넓어짐

5. 

 

 

 

 

4장 NTFS

 

 

01. NTFS 소개

 

◆ NTFS의 탄생

Microsoft는 거대 시장인 서버와 엔터프라이즈급 운영체제 시장에서도 성공하고 싶었다. 하지만 FAT 파일시스템은 서버급 운영체제의 파일시스템으로 사용하기에는 너무 부족했다. 그리하여 1993년 NTFS의 최초 버전인 NTFS 1.0이 Windows 3.1과 함께 세상에 나오게 된다.

◆ NTFS 버전

사용자들의 늘어가는 요구를 충족시키기 위해서 MS는 계속해서 기능을 향상 시켰다.

 

◆ NTFS 1.0

Windows NT의 최초 판매 버전인 Windows NT3.1에 포함된 버전. 최초로 공개된 버전이기도 하며 이시점에서의 Windows NT는 아직 시장에서 큰 인기를 얻지 못하였다.

 

◆ NTFS 1.2(NTFS4.0)

Windows NT 4.0에 포함된 버전. 실제 버전은 1.2이지만 NT 4.0 에 포함되어 있는 버전이라고 하여 4.0버전이라고도 한다. NT 4.0이 나오고 나서야 사람들이 Windows NT를 많이 사용하기 시작하여 실제적으로 가장 널리 쓰이고 있는 버전이다.

 

◆ NTFS 3.0(NTFS 5.0)

이것은 Windows 2000(Windows NT 5.0)에 포함된 버전이다. 많은 기능들이 추가되었다.

1. Reparse Point 지원

2. 개선된 보안과 권한

3. 변경일지(Change Journals)기능

4. 암호화

5. 디스크 쿼터(Disk Quota)기능

6. Sparse 파일 지원

7. 디스크 조각 모음 지원(Windows NT는 조각모음이 없다.)

 

◆ NTFS 3.1(NTFS 5.1)

Windows XP와 Windows Server 2003의 운영체제에 포함된 버전이다. 기본적으로 5.0과 거의 동일하며 호환이 된다.

 

◆ NTFS 특징

NTFS(New Techonology FileSystem)는 그 단어 자체에 FileSystem이라는 뜻을 내포하고 있다.

 

◆  데이터 복구 기능

NTFS는 데이터의 신뢰성을 높이기 위해서 볼륨에 수행하는 모든 작업에 대해 트랜젝션 단위로 기록하고 있다. 이는 작업 도중에 어떤 문제가 발생하였을 경우 이런 기록을 조사해 봄으로써 볼륨의 상태를 정상적으로 복구할 수 있게 된다.

 

◆ 암호화

이 암호화 기능을 EFS(Encrypting Filesystem)라고 부른다. 이는 5.0 버전 이후부터 지원한다. EFS는 인증받지 않은 사용자들이나 프로그램으로부터 여러분의 데이터를 보호해 준다.

 

◆ 압축

NTFS는 파일시스템 수준의 압축 기능을 제공한다. 압축 알고리즘은 ZIP 파일 포맷으로 유명한 'LZ77'의 변형된 방식을 사용한다.

 

◆ 디스크 쿼터

사용자마다 디스크의 사용량을 제한하는 기능이다. NT는 다수의 사용자들이 하나의 컴퓨터를 쓰는 것을 기본으로 설계했는데, 다른 사람이 용량을 모두다 사용하는 것을 막기 위해 관리자는 사용자들마다 할당량을 설정할수 있게 한 것이다.

 

◆ ADS(Alternate Data Stream)

NTFS는 다중 데이터 스트림을 지원한다. 이것은 하나의 파일이 하나 이상의 데이터를 담을 수 있다는 의미이다. 예를 들어 파일의 첫 번째 스트림에는 파일의 내용을 담고, 두 번째 스트림에는 파일의 요약 정보나 파일의 아이콘 등 여러 정보를 담아 둘 수 있다.

 

◆ Sparse 파일

이것은 파일의 내용이 대부분 0으로 차있을 경우 해당 파일의 내용을 그대로 볼륨에 저장하지 않고, 그 정보만을 담는 파일을 말한다. 예를 들어 1MB의 파일에 맨처음 4KB에만 의미있는 데이터가 있고 나머지에는 전부 0이 적혀 있다면, 이 파일에는 의미있는 4KB만을 저장하고 나머지 영역이 0으로 채워져 있다는 정보만을 기록한다.

 

◆ 큰 용량 표현

NTFS는 이론상 무려 Exa Byte(2의 64승)까지의 용량을 표현할 수 있다. 그러나 이것은 이론상의 값이며, 실제는 2의 44승 약 16TB 정도까지 표현할 수 있는 크기이다.

 

 

 

02. NTFS 구조

 

◆ NTFS의 구조

NTFS의 가장 큰 특징은 모든 데이터를 파일의 형태로 관리한다는 점이다. 이로 인해 FileSystem관리 데이터 역시도 데이터 영역에 파일의 형태로 관리되며, 다른 FileSystem처럼 정형화된 볼륨 레이아웃이 존재하지 않는다.(물론, 성능을 위한 어느정도의 레이아웃은 잡아두었다.) NTFS에서 유일하게 위치가 고정되어 있는 영역은 Boot Record 영역이다.

 

◆ Boot Record

이 영역은 반드시 볼륨의 첫번째 섹터에 와야한다. 이 영역에는 부팅을 위한 코드(기계어)와 NTFS의 설정 값들이 있다. 사용자는 Boot Record를 분석 함으로써 볼륨의 크기, 클러스터 크기, MFT의 시작 주소와 같은 중요한 정보를 알 수 있다.

 

◆ MFT(Master File Table)

NTFS에서 가장 중요한 부분으로, NTFS는 정형화된 볼륨 구조대신 MFT가 존재하는데, 이는 볼륨에 존재하는 모든 파일과 디렉토리 정보를 담고 있다. MFT는 데이터 영역에 존재하는 파일로 돤리되며, MFTEntry라는 자료들의 집합으로 구성 된다. MFTEntry는 0번부터 시작하는 고유한 주소를 가지며, 0번부터 15번까지(16개) MFTEntry는 SystemFile용으로 예약되어 있다.

 

◆ 데이터 영역

파일과 디렉토리를 담는 영역으로 FAT FileSystem과 같이 클러스터 단위로 읽기/쓰기가 이루어 진다. NTFS는 볼륨의 크기가 크더라도 클러스터 크기를 4096Byte로 구정하는데 이는 NTFS의 압축 기능과 관련된다.