New Technology File System
FAT32의 단점을 보완하기 위해 개발된 형식.
NTFS 방식으로 포맷할 경우 드라이브 최대 크기는 256TB.
개별 파일 하나당 저장할 수 있는 최대 크기는 16TB.
윈도우 위주의 형식이라는 단점을 가짐.
애플, 안드로이드, 리눅스를 기반으로 하는 기기에서는 사용에 제한. → 호환성이 떨어짐.
“VBR(Volume Boot Record)” / “MFT(Master File Table)” / “Data Area” 로 구성
NTFS로 포맷된 “파티션” 의 가장 앞부분에 위치하는 영역.
VBR 영역에는 Boot Sector, NTLDR Location, Boot Code를 담고 있음.
VBR의 섹터 크기는 Cluster Size에 의해서 정해짐.
| Cluster Size | VBR Size (Sector) |
|---|---|
| 512 bytes | 1 |
| 1 KB | 2 |
| 2 KB | 4 |
| 4 KB | 8 |
클러스터의 크기는 VBR에 있는 Bytes Per Sector, Sector Per Cluster 로 알 수 있음.
기본적으로 1 Cluster 당 4KB 이기 때문에 8 Sector.

| Offset | Size (byte) | Field Name | Description |
|---|---|---|---|
| 0x0000 ~ 0x0002 | 3 | Jump Boot Code | Jump Instruction (EB 52 90 → NTFS) |
| 0x0003 ~ 0x000A | 8 | OEMD ID | 제조사 ID |
| 0x000B ~ 0x0053 | 73 | BPB | BPB 영역 |
| 0x0054 ~ 0x01FD | 426 | Boot Code | Boot Code |
| 0x01FE ~ 0x01FF | 2 | Signature | signature (0x55AA) |
해당 볼륨의 여러 가지 설정 값들을 저장하며, 해당 볼륨이 부팅될 수 있도록 부팅에 필요한 실행 코드도 포함.

| Offset | Size (byte) | Field Name | Description |
|---|---|---|---|
| 0x0B ~ 0x0C | 2 | Byte Per Sector | 섹터 당 바이트 |
| 0x0D | 1 | Sectors Per Sector | 클러스터 당 섹터 |
| 0x0E ~ 0x0F | 2 | Reserved Sector Count | 예약된 섹터 |
| 0x10 ~ 0x14 | 5 | Unused | - |
| 0x15 | 1 | Media Descriptor | 미디어 서술자 |
| 0x16 ~ 0x17 | 2 | Unused | - |
| 0x18~0x19 | 2 | Secters per Track | 트랙 당 섹터 |
| 0x1A~0x1B | 2 | Number Of Heads | 헤드 수 |
| 0x1C ~ 0x1F | 4 | Hidden Sector | 숨겨진 섹터 |
| 0x20 ~ 0x27 | 8 | Unused | - |
| 0x28 ~ 0x2F | 8 | Total Sector | 총 섹터 |
| 0x30 ~ 0x37 | 8 | Start Cluster for $MTF | $MFT 클러스터 번호 |
| 0x38 ~ 0x3F | 8 | Start Cluster for $MTFMirr | $MFTMirr 클러스터 번호 |
| 0x40 | 1 | Cluster Per MFT Entry | 파일 레코드 세그먼트 당 바이트 |
| 0x41 ~ 0x43 | 3 | Unused | - |
| 0x44 | 1 | Cluster Per Index block | 인덱스 버퍼 당 클러스터 |
| 0x45 ~ 0x47 | 3 | Unused | - |
| 0x48 ~ 0x4F | 8 | Volume Serial Number | 0x1C741BC9741BA514 |
| 0x50 ~ 0x53 | 4 | Unused | - |
VBR 다음 Sector인 Sector 1 에 위치해 있다.
NTFS Boot Loader 의 위치 정보를 담고 있음.
부트로더(boot loader)란 운영 체제가 시동되기 이전에 미리 실행되면서
커널이 올바르게 시동되기 위해 필요한 모든 관련 작업을 마무리하고.
최종적으로 운영 체제를 시동시키기 위한 목적을 가진 프로그램을 말한다.
MFT (Master File Table) : 볼륨에 존재하는 모든 파일과 디렉토리에 대한 정보를 가진 테이블, NTFS의 가장 중요한 구조체.
파일이나 디렉토리가 많아질수록 MFT의 크기는 점점 커지지만 한 번 늘어난 MFT는 파일이 줄어든다고 해서 줄어들지 않음.
MFT는 Meta Data File 과 일반 파일 또는 디렉터리에 대한 정보(위치 및 속성, 시간정보, 이름, 크기 등)를 저장하고 있는 MFT Entry 로 구성
모든 파일과 디렉토리는 MFT에 꼭 하나의 Entry를 가지고 있다.
| Entry Num | File Name | Description |
|---|---|---|
| 0 | $MFT | NTFS에서의 모든 파일 들의 MFT Entry 정보를 담고 있다. |
| 1 | $MFTMirr | $MFT 파일의 일부 백업 데이터를 담고 있다. |
| 2 | $LogFile | Meta Data의 트랜잭션 저널 정보를 담고 있다. |
| 3 | $Volume | 볼륨의 레이블, 버전 등의 여러 정보를 담고 있다. |
| 4 | $AttrDef | 인자 값, 이름, 크기 등 여러 속성 값 |
| 5 | . | 파일 시스템의 루트 디렉토리 |
| 6 | $Bitmap | 파일 시스템의 클러스터 할당 관리 정보를 담고 있다. |
| 7 | $Boot | 부트 레코드 영역의 정보를 담고 있다. |
| 8 | $BadClus | 배드 클러스터 영역 정보를 담고 있다. |
| 9 | $Secure | 보안과 접근 권한에 대한 정보를 담고 있다. |
| 10 | $Upcase | 모든 유니코드 문자의 대문자 |
| 11 | $Extend | $Objld, $Quota, $Reparse, $UsnJrnl 등의 추가적인 파일의 정보를 기록하기 위해서 사용하는 Entry |
| 12~15 | - | 미래를 위해서 예약된 영역으로 남겨둠. |
| 16~23 | 포맷 후 생성되는 파일의 정보를 위해서 사용. | |
| 지정 x | $Objld | 파일 고유의 ID 정보를 담고 있다. |
| 지정 x | $Quota | 사용량의 정보를 담고 있다. |
| 지정 x | $Reparse | Reparse Point에 대한 정보를 담고 있다. |
| 지정 x | $UsnJrnl | 파일이나 디렉토리 변경 정보를 담고 있다. |

| Name | Offset | Description |
|---|---|---|
| MFT Entry Header | 0x0 - 0x2F | MFT Entry에 대한 메타데이터 |
| Fix-up Array | 0x30 - 0x37 | NTFS의 신뢰성을 높이기 위한 구조 |
| Attribute Area | 0x38 - 가변 | 파일 이름, 변경 시각, 데이터, 위치 들 속성(Attribute)들이 나열되는 영역 |
| End Marker | 이후 | MFT Entry 끝을 알리는 데이터 |
Entry의 크기는 1 KB 이며, 헤더는 미리 정의된 목적을 가짐.
속성 영역은 특정 목적을 갖는 작은 데이터로 이루어져 있음.
각 MFT Entry는 Table 내 주소를 갖고, 해당 주소는 0부터 시작.
보통 Entry 크기는 1KB이지만, 정확한 크기는 Boot Sector에서 정의.
MFT도 시스템 내에서는 하나의 파일로 취급되어 MFT를 설명하는 MFT Entry가 MFT 안에 포함되어 있다.
MFT를 설명하는 Entry는 $MFT이며, 해당 Entry는 MFT의 디스크 위치를 설명.
MFT의 전반적인 레이아웃과 크기를 파악하려면 $MFT Entry를 참조, MFT 시작 위치는 Boot Sector에서 정의.
MFT Header는 42 Byte의 크기, 12개의 Field를 포함, 나머지 982 byte는 비구조적으로 속성 값들을 포함하고 있다.
MFT Entry 첫 필드는 시그니처, 보통 b’FILE’ . 하지만, Entry 오류 등이 생길 시 b’BAAD’ 값을 가짐.
MFT Entry는 Entry 할당 상태, 타입 구분 필드 등이 있으며 파일 하나의 Entry 만으로 설명되지 않을 경우 여러 Entry를 사용할 수도 있다.
MFT Entry는 48 bit 주소 값을 가지며, 순차적으로 주소가 할당되고, 주소 시작은 0부터 이다.
첫 번째 Entry가 주소 0을 가지며, MFT 최대 주소는 MFT 크기가 증가할 때마다 증가한다.
또 MFT는 주소 외의 다른 순서 번호를 가지며, 해당 순서 번호는 16 bit 이고, 48 bit의 주소와 조합되어 64 bit의 파일 참조 번호를 생성하는데 사용된다.

| Size | Information |
|---|---|
| 4 | Signature (FILE) |
| 2 | Offset of Fixup array |
| 2 | Number of Entries in Fixup array |
| (Fixup 배열이 포함하는 항목 수) | |
| 8 | $LogFile Sequence Number (LSN) |
| ($LogFile에 존재하는 해당 파일의 트랜잭션 위치 값 MFT Entry가 변경될 때마다 갱신) | |
| 2 | Sequence Number |
| (순서 번호로 MFT Entry 생성 후 할당/해제 시마다 1씩 증가) | |
| 2 | Hard Link count |
| (해당 MFT Entry에 연결된 하드 링크) | |
| 2 | Offset of File attribute |
(해당 Entry의 첫 번째 속성 주소),
(MFT Entry 시작으로부터 해당 오프셋에 Attribute Area가 나타남) |
| 2 | Flags
(0x01: 사용 중, 0x02: 디렉터리, 0x03, 0x04: 분석 안됨 이며 해당하는 속성을 OR 연산한 값) |
| 4 | Real size of MFT Entry
(MFT Entry의 실제 사용 크기) |
| 4 | Allocated size of MFT Entry
(MFT Entry의 할당 크기: 1,024 Byte) |
| 8 | File Reference to Base Entry
(해당 MFT Entry가 non-base일 경우 자신의 Base Entry의 주소값) |
| 2 | Next attribute ID |
| 2 | Windows XP의 경우 → 존재 |
| 4 | Number of this MFT Entry → MFT Entry의 번호를 나타냄.
(MFT Entry Address) (MFT Entry Number) (Record Number) |

https://velog.io/@rinm/NTFS-structure
https://ko.wikipedia.org/wiki/NTFS
https://blog.forensicresearch.kr/15
https://yum-history.tistory.com/242

Partition Table의 정보를 기점으로 기동하는 partition의 boot sector를 읽어서 해당 섹터의 프로그램에 의해 운영 체계가 기동된다.
첫 번째 Sector를 MBR 이라고함. FAT32의 첫 번째 Sector의 용량은 512 byte. (446+16+16+16+16+2=512)
446 byte는 Boot Code, 16 byte의 Partition Table이 4개 존재 16*4 = 64 byte, 마지막(510) 2 byte는 55 AA 로 Signature.
※ 플래시메모리에는 MBR이 없다. 대신 Boot Sector가 있다.
| Offset | Size | Field Name |
|---|---|---|
| 0x1BE(446) ~ 0x1CD | 16 byte | Partition Table Entry #1 |
| 0x1CE(462) ~ 0x1DD | 16 byte | Partition Table Entry #2 |
| 0x1DE(478) ~ 0x1ED | 16 byte | Partition Table Entry #3 |
| 0x1EE(494) ~ 0x1FD | 16 byte | Partition Table Entry #4 |
| Offset | Size | Description |
|---|---|---|
| 0x00 ~ 0x00 | 1 | Boot Flag |
| 0x01 ~ 0x03 | 3 | Starting CHS Addr |
| 0x04 ~ 0x04 | 1 | Partition Type |
| 0x05 ~ 0x07 | 3 | Ending CHS Addr |
| 0x08 ~ 0x0B | 4 | Starting LBA Addr |
| 0x0C ~ 0x0F | 4 | Size in Sector |
4개 이상의 Partition을 만드는 경우 첫 번째 Sector에 위치한 주 Partition Table의 Partition Table Entry #4 는 Extended Partition을 나타내는 Entry 값으로 채워짐.
확장 파티션을 나타내는 경우 ****Partition Type Field가 0x0F 값을 가진다.
CHS : 실린더 주소(C), 플래터와 앞뒤 면을 확인할 수 있는 헤드번호(H), 트랙에서 섹터를 확인할 수 있는 섹터 주소(S)를 통해 주소를 지정하는 방식.
해당 방식은 8GB 이하 디스크에서만 동작하는 등 제한 사항이 많아 더 이상 사용되지 않고 있다.
LBA : CHS의 주소 지정 한계를 대체. 하드디스크의 물리적 구조 방식을 이용하지 않고, 섹터를 쭉 일렬로 논리적으로 나열해서 단순히 0부터 시작하는 숫자의 섹터의 번호가 매겨짐.
https://www.minzkn.com/moniwiki/wiki.php/Partition
https://m.blog.naver.com/ginger2009/221985406342
https://ljhblog.tistory.com/46

Protective MBR은 EFI 가 아닌 BIOS 서비스를 통한 GPT 기반 부팅을 진행할때 지원하는 운영체제에서 첫번째 섹터는 Boot 로더로서 사용하기 때문에 Protective MBR 이라는 이름으로 존재.
Sector 1 에 위치하고, 일반적으로 92 Byte로 구성되어있음.
GPT에 대한 대부분의 설정 정보를 담고 있으며, 그 외의 영역에는 NULL Byte를 가짐.

| Offset | Size (byte) | Field Name | Description |
|---|---|---|---|
| 0x0 ~ 0x7 | 8 | Signature | bEFI PART |
| 0x20 ~ 0x27 | 8 | LBA of Backup | GPT Header |
| 0x28 ~ 0x2F | 8 | Starting LBA Partition | |
| 0x30 ~ 0x37 | 8 | Ending LBA Partition | |
| 0x50 ~ 0x53 | 4 | Number of partition entries | |
| 0x54 ~ 0x57 | 4 | Size of each entry |
Sector 2 에 위치, 일반적으로 128 Byte로 되어있음.
각 파티션에 대한 대부분의 정보를 담고 있고, MBR의 Partition Table의 LBA 주소는 4Byte 로 기록하지만 GPT는 8Byte로 기록함.

| Offset | Size (byte) | Field Name |
|---|---|---|
| 0x0 ~ 0xF | 16 | Partition Type GUID |
| 0x10 ~ 0x1F | 16 | Unique partition GUID |
| 0x20 ~ 0x27 | 8 | First LBA |
| 0x28 ~ 0x2F | 8 | Last LBA |
| 0x30 ~ 0x37 | 8 | Attribute flags |
| 0x38 ~ 0x7F | 72 | Partition name |
| Bit | Description |
|---|---|
| 0 | Platform Required |
| 1 | EFI Firmware should ignore the content of partition |
| 2 | LEgacy BIOS bootable |
| 3 - 47 | Reserved |
| 48 - 63 | Defined and used by individual partition |