NTFS File Structure

g0ni·2024년 11월 7일

NTFS File

목록 보기
1/2

NTFS


New Technology File System

FAT32의 단점을 보완하기 위해 개발된 형식.

NTFS 방식으로 포맷할 경우 드라이브 최대 크기는 256TB.
개별 파일 하나당 저장할 수 있는 최대 크기는 16TB.

윈도우 위주의 형식이라는 단점을 가짐.
애플, 안드로이드, 리눅스를 기반으로 하는 기기에서는 사용에 제한. → 호환성이 떨어짐.

NTFS 파일 시스템 구조


“VBR(Volume Boot Record)” / “MFT(Master File Table)” / “Data Area” 로 구성

1. VBR (Volume Boot Record)


NTFS로 포맷된 “파티션” 의 가장 앞부분에 위치하는 영역.
VBR 영역에는 Boot Sector, NTLDR Location, Boot Code를 담고 있음.

VBR의 섹터 크기는 Cluster Size에 의해서 정해짐.

Cluster SizeVBR Size (Sector)
512 bytes1
1 KB2
2 KB4
4 KB8

클러스터의 크기는 VBR에 있는 Bytes Per Sector, Sector Per Cluster 로 알 수 있음.

기본적으로 1 Cluster 당 4KB 이기 때문에 8 Sector.

OffsetSize (byte)Field NameDescription
0x0000 ~ 0x00023Jump Boot CodeJump Instruction (EB 52 90 → NTFS)
0x0003 ~ 0x000A8OEMD ID제조사 ID
0x000B ~ 0x005373BPBBPB 영역
0x0054 ~ 0x01FD426Boot CodeBoot Code
0x01FE ~ 0x01FF2Signaturesignature (0x55AA)

Boot Sector - BPB (BIOS Parameter Block)


해당 볼륨의 여러 가지 설정 값들을 저장하며, 해당 볼륨이 부팅될 수 있도록 부팅에 필요한 실행 코드도 포함.

OffsetSize (byte)Field NameDescription
0x0B ~ 0x0C2Byte Per Sector섹터 당 바이트
0x0D1Sectors Per Sector클러스터 당 섹터
0x0E ~ 0x0F2Reserved Sector Count예약된 섹터
0x10 ~ 0x145Unused-
0x151Media Descriptor미디어 서술자
0x16 ~ 0x172Unused-
0x18~0x192Secters per Track트랙 당 섹터
0x1A~0x1B2Number Of Heads헤드 수
0x1C ~ 0x1F4Hidden Sector숨겨진 섹터
0x20 ~ 0x278Unused-
0x28 ~ 0x2F8Total Sector총 섹터
0x30 ~ 0x378Start Cluster for $MTF$MFT 클러스터 번호
0x38 ~ 0x3F8Start Cluster for $MTFMirr$MFTMirr 클러스터 번호
0x401Cluster Per MFT Entry파일 레코드 세그먼트 당 바이트
0x41 ~ 0x433Unused-
0x441Cluster Per Index block인덱스 버퍼 당 클러스터
0x45 ~ 0x473Unused-
0x48 ~ 0x4F8Volume Serial Number0x1C741BC9741BA514
0x50 ~ 0x534Unused-

NTLDR Information & Boot Strap


VBR 다음 Sector인 Sector 1 에 위치해 있다.
NTFS Boot Loader 의 위치 정보를 담고 있음.

부트로더(boot loader)란 운영 체제가 시동되기 이전에 미리 실행되면서
커널이 올바르게 시동되기 위해 필요한 모든 관련 작업을 마무리하고.
최종적으로 운영 체제를 시동시키기 위한 목적을 가진 프로그램을 말한다.

2. MFT (Master File Table)


MFT (Master File Table) : 볼륨에 존재하는 모든 파일과 디렉토리에 대한 정보를 가진 테이블, NTFS의 가장 중요한 구조체.

파일이나 디렉토리가 많아질수록 MFT의 크기는 점점 커지지만 한 번 늘어난 MFT는 파일이 줄어든다고 해서 줄어들지 않음.

MFT는 Meta Data File 과 일반 파일 또는 디렉터리에 대한 정보(위치 및 속성, 시간정보, 이름, 크기 등)를 저장하고 있는 MFT Entry 로 구성

모든 파일과 디렉토리는 MFT에 꼭 하나의 Entry를 가지고 있다.

Meta Data File


  • 볼륨의 모든 바이트가 파일로 할당되어 이를 관리하는 데이터를 저장할 파일이 필요
  • 위와 같은 다른 데이터의 관리 데이터를 저장한 파일을 메타데이터라 부름
  • MFT의 첫 16 개 Entry들로 예약되어 있으며, 사용하지 않는 Entry들은 비할당 상태가 아닌 할당 상태
  • 오직 기본적이고 일반적인 정보만을 포함
  • 사용자에게는 보이지 않지만, 루트 디렉토리 존재
  • 각 파일들은 $ 로 파일명이 시작되고, 첫 번째 문자는 대문자로 시작
Entry NumFile NameDescription
0$MFTNTFS에서의 모든 파일 들의 MFT Entry 정보를 담고 있다.
1$MFTMirr$MFT 파일의 일부 백업 데이터를 담고 있다.
2$LogFileMeta 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$ReparseReparse Point에 대한 정보를 담고 있다.
지정 x$UsnJrnl파일이나 디렉토리 변경 정보를 담고 있다.
  • 24개 (0~23)의 Entry
  • MFT 한 개의 영역은 1024 Byte(2 Sector)로 구성
  • 24번 Entry 이후부터 사용자 데이터에 대한 MFT Entry가 위치

MFT Entry


NameOffsetDescription
MFT Entry Header0x0 - 0x2FMFT Entry에 대한 메타데이터
Fix-up Array0x30 - 0x37NTFS의 신뢰성을 높이기 위한 구조
Attribute Area0x38 - 가변파일 이름, 변경 시각, 데이터, 위치 들 속성(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의 파일 참조 번호를 생성하는데 사용된다.

MFT Entry Header


SizeInformation
4Signature (FILE)
2Offset of Fixup array
2Number of Entries in Fixup array
(Fixup 배열이 포함하는 항목 수)
8$LogFile Sequence Number (LSN)
($LogFile에 존재하는 해당 파일의 트랜잭션 위치 값 MFT Entry가 변경될 때마다 갱신)
2Sequence Number
(순서 번호로 MFT Entry 생성 후 할당/해제 시마다 1씩 증가)
2Hard Link count
(해당 MFT Entry에 연결된 하드 링크)
2Offset 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) |

Attribute Area


  • 0x10: $Standard_Information (SI) 시간 정보 (생성/정근/수정)
  • 0x30: $File_Name(FN) 파일 이름 & 파일 이동 / 수정 등의 시간 정보
  • 0x80: $DATA 파일 내용

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

MBR (Boot Sector?)


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가 있다.

Partition Table


OffsetSizeField Name
0x1BE(446) ~ 0x1CD16 bytePartition Table Entry #1
0x1CE(462) ~ 0x1DD16 bytePartition Table Entry #2
0x1DE(478) ~ 0x1ED16 bytePartition Table Entry #3
0x1EE(494) ~ 0x1FD16 bytePartition Table Entry #4

Partition Table Entry 구조


OffsetSizeDescription
0x00 ~ 0x001Boot Flag
0x01 ~ 0x033Starting CHS Addr
0x04 ~ 0x041Partition Type
0x05 ~ 0x073Ending CHS Addr
0x08 ~ 0x0B4Starting LBA Addr
0x0C ~ 0x0F4Size in Sector

Extended Partition Table


4개 이상의 Partition을 만드는 경우 첫 번째 Sector에 위치한 주 Partition Table의 Partition Table Entry #4 는 Extended Partition을 나타내는 Entry 값으로 채워짐.
확장 파티션을 나타내는 경우 ****Partition Type Field가 0x0F 값을 가진다.

CHS (Cylinder Head Sector) / LBA (Logical Block Address)?


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

GPT (GUID Partition Table)


기존 MBR 구조와 GPT 구조의 차이


  • Protective MBR - 기존 MBR과 호환
  • GPT Entry - 최대 128개의 파티션 (hex value : 0x80)
  • Backup - GPT Header, GPT Entry
  • 처음 GPT 헤더와 엔트리, 백업 GPT 헤더와 엔트리는 자리가 바뀌어 구성됨.
  • 하나의 섹터에 Entry는 4개 (엔트리는 128 byte이기 때문)
  • 섹터는 34개를 사용.

MBR


Protective MBR은 EFI 가 아닌 BIOS 서비스를 통한 GPT 기반 부팅을 진행할때 지원하는 운영체제에서 첫번째 섹터는 Boot 로더로서 사용하기 때문에 Protective MBR 이라는 이름으로 존재.


Sector 1 에 위치하고, 일반적으로 92 Byte로 구성되어있음.
GPT에 대한 대부분의 설정 정보를 담고 있으며, 그 외의 영역에는 NULL Byte를 가짐.

OffsetSize (byte)Field NameDescription
0x0 ~ 0x78SignaturebEFI PART
0x20 ~ 0x278LBA of BackupGPT Header
0x28 ~ 0x2F8Starting LBA Partition
0x30 ~ 0x378Ending LBA Partition
0x50 ~ 0x534Number of partition entries
0x54 ~ 0x574Size of each entry

Partition Entry


Sector 2 에 위치, 일반적으로 128 Byte로 되어있음.
각 파티션에 대한 대부분의 정보를 담고 있고, MBR의 Partition Table의 LBA 주소는 4Byte 로 기록하지만 GPT는 8Byte로 기록함.

OffsetSize (byte)Field Name
0x0 ~ 0xF16Partition Type GUID
0x10 ~ 0x1F16Unique partition GUID
0x20 ~ 0x278First LBA
0x28 ~ 0x2F8Last LBA
0x30 ~ 0x378Attribute flags
0x38 ~ 0x7F72Partition name

GPT Partition Entry Attribute Flags


BitDescription
0Platform Required
1EFI Firmware should ignore the content of partition
2LEgacy BIOS bootable
3 - 47Reserved
48 - 63Defined and used by individual partition

https://en.wikipedia.org/wiki/GUID_Partition_Table

profile
Let it rip!

0개의 댓글