NTFS(New Technology File System)는 마이크로소프트에서 FAT의 한계를 개선하기 위한 새로운 시스템으로서 개발되었으며, Windows 2000, 2003, 2008, XP, 95, 98 등 Windows에서 표준 파일시스템으로 사용되고 있으며 유닉스에서도 지원하고 있다. NTFS는 모든 데이터를 데이터 영역에 파일 형태로 관리하고 있다.
1. NTFS 대표적 특징
USN Journal(Update Sequence Number Journal)
USN 저널은 NTFS의 메타데이터를 구성하는 파일로 NTFS 볼륨에 변경이 생길 때마다 저널 파일에 변경을 기록한다. 64비트에 USN, 파일 이름, 변경 등에 관한 정보가 기록된다.
ADS(Alternate Data Stream)
FAT에서 파일은 데이터 스트림 하나만 가진다. 그러나 NTFS에서 ADS는 부가적인 데이터 스트림이라는 뜻처럼 파일이 다중 데이터 스트림을 가질 수 있다. ADS는 NTFS의 특징으로 네트워크 등을 통해 다른 파일시스템으로 복사할 경우 원본 스트림만 복사된다.
Sparse 파일
파일이 거의 0인 경우 실제 데이터를 저장하지 않고 크기만 가지고 있는 특성이다. 크기만 가지고 실제 데이터는 저장하지 않아 저장장치의 효율이 높아진다.
파일 압축
NTFS에서는 시스템에서 파일 및 디렉터리를 선택한 뒤 압축하여 저장할 수 있는 기능을 제공한다.
VSS(Volume Shadow Copy Service)
VSS는 Windows 2003부터 지원되며 디렉터리와 파일들의 백업본을 생성시키는 기능이다. 비정상 종료 시에 부팅 과정에서 안전한 복구를 지원한다.
유니코드 지원
NTFS에 저장되는 스트림은 모두 유니코드를 지원하며 다국어 지원이 가능하다.
동적 배드 클러스터 재할당
NTFS는 배드 섹터가 생기면 자동적으로 다른 클러스터를 할당하고 데이터를 복사한다. 그리고 배드 섹터가 생긴 클러스터는 $BadClus에 기록되어 사용되지 않도록 한다.
2. NTFS 구조
NTFS는 아래 그림처럼 VBR, MFT, 데이터 영역 세 부분으로 나눌 수 있다.
VBR은 NTFS 구조 중 맨 앞부분에 존재하며 부트 섹터 + 추가적인 VBR 영역으로 구성되어 있다. 고정된 크기를 가지지 않고 클러스터 크기에 따라 512Byte(1 Sector), 1KB(2 Sector), 2KB(4 Sector), 4KB(8 Sector)를 가진다.
MFT는 파일과 디렉터리의 모든 정보가 존재하며 파일과 디렉터리는 반드시 MFT 테이블에 하나의 엔트리를 가지며 엔트리 크기는 1024Byte이다. 처음 포맷 시에는 일정 영역의 MFT 공간이 할당되고, 이 할당된 MFT 공간이 모두 채워지면 데이터 영역에 추가 MFT 공간이 할당되 사용된다.
1) VBR
VBR의 첫 번째 섹터는 부트 코드를 포함한 부트 섹터가 저장되어 있다.
VBR 크기가 1 섹터를 넘는 NTLDR(NT Loader)을 빠르게 로드하기 위해 NTLDR에 대한 정보가 저장된다.
해석상 중요한 부분은 Byte Per Sector, Sector Per Cluster, Start Cluster for $MFT, Total Sectors, Volume Serial Number 등이다.
위치 | 길이 | 이름 | 내용 |
0x00 - 0x02 | 3 | Jump Boot Code | 부트 코드로 점프하라는 명령어 |
0x03 - 0x0A | 8 | OEM Name | OEM ID |
0x0B - 0x0C | 2 | Byte Per Sector | 섹터당 바이트 수 |
0x0D | 1 | Sector Per Cluster | 클러스터당 섹터 수 |
0x15 | 1 | Media Descriptor | 0xF8이면 고정식 디스크 |
0x28 - 0x2F | 8 | Total Sectors | 해당 볼륨이 가지는 총 섹터 수 |
0x30 - 0x37 | 8 | Start Cluster for $MFT | $MFT의 LBA 주소(클러스터 단위) |
0x38 - 0x3F | 8 | Start Cluster for $MFTMirr | $MFTMirr의 LBA 주소(클러스터 단위) |
0x40 | 1 | Cluster Per MFT Entry | MFT Entry 크기 |
0x48 - 0x4F | 8 | Volume Serial Number | 볼륨 시리얼 번호 |
OEM ID가 "er.NTFS"로 표시되면, MFT를 해석하여 올바른 클러스터로 이동했음을 확인할 수 있다.
- Byte Per Sector = 0x200 = 512 Byte
- Sector Per Cluster = 8
- Total Sectors = 8E 82 0A 77 00 00 00 00 = 77 0A 82 8E (리틀 엔디안 변환) -> 1,997,177,486
- Start of MFT = 00 00 0C 00 00 00 00 00 = 786,432
- MFT 위치 = (Start of MFT * 섹터당 클러스터 수) + Boot Record 위치 = (786,432 * 8) + Boot Record 위치
- Volume Serial Number = EA 3F 41 DE 65 41 DE 14
2) MFT
MFT는 NTFS의 핵심으로 파일 및 디렉터리의 변경 등 여러 정보가 기록되며 파일 레코드라고도 불린다.
MFT 영역은 각각 1024바이트인 여러 개의 MFT 엔트리로 이루어져 있다. MFT 엔트리는 파일이나 디렉터리가 생성될 때마다 생성되어 생성된 파일이나 디렉터리를 관리하기 위한 메타데이터를 저장하고 있다. 따라서 숨긴 파일을 찾거나, 파일의 복사, 삭제 등을 알아보거나 타임라인 분석 등 디지털 포렌식 조사에 있어 중요하다.
MFT 영역은 크기가 고정되어 있는 상태가 아니며 일반적으로 전체 볼륨의 대략 12.5%가 MFT 영역으로 할당되는 것으로 알려졌다. MFT Entry 0번에서 23번은 파일시스템 생성 시 파일시스템 자체의 메타데이터를 관리하기 위해 예약된 엔트리이다.
MFT 엔트리 0번부터 3번까지 살펴보면 MFT 엔트리 0번은 $MFT 파일로 MFT 영역의 크기, 위치, 할당 정보 등 MFT 영역 파일에 대한 MFT 엔트리이다.
MFT 엔트리 1번은 $MFTMirr으로 $MFT의 일부 백업본으로 $MFT의 0-3번의 엔트리를 복사, 저장하고 있다. $MFT가 손상이 되었을 때 이 $MFTMirr를 사용하여 복구하는 목적이다.
MFT 엔트리 2번은 $LogFile으로 파일의 생성, 변경, 삭제, 이름 변경 등 MFT 엔트리에 영향을 주는 사항을 기록해 두어서 트랜잭션이 정상 완료되지 못하는 경우 시스템 재부팅 시 복구에 도움을 준다.
아래 표에 MFT 엔트리의 간략한 기능에 대해 설명하였다.
Entry 번호 | 이름 | 설명 |
0 | $MFT | MFT에 대한 MFT Entry |
1 | $MFTMirr | $MFT의 일부 백업본 |
2 | $LogFile | 메타데이터의 트랜잭션 저널 정보 |
3 | $Volume | 볼륨의 레이블, 식별자, 버전 등 정보 |
4 | $AttrDef | 속성의 식별자, 이름, 크기 등 정보 |
5 | .(Root Directory) | 디렉터리 구조의 파일을 빠르게 접근하기 위해 index 구조로 저장 |
6 | $Bitmap | 볼륨 클러스터 할당 정보 |
7 | $Boot | 부팅 가능한 볼륨인 경우 부트 섹터 정보 |
8 | $badclus | 배드 섹터를 가지는 클러스터 정보 |
9 | $Secure | 파일의 보안, 접근제어 관련 정보 |
10 | $Upcase | 모든 유니코드 문자의 대문자 |
11 | $Extend | |
12-15 | 사용 안함 | |
16-23 | 사용 안함 | |
- | $ObjID | 파일의 고유 ID 정보 저장 |
- | $Quota | 사용량 정보 저장 |
- | $Reparse points, | Reparse point에 대한 정보 저장 |
- | $UsnJrnl, | 파일이나 디렉터리 변경사항에 대한 정보 저장 |
24 이후 | 일반 파일 | 일반적인 파일이나 디렉터리 실제 저장 위치 |
- MFT 구조
MFT 엔트리는 아래 그림과 같은 구조를 가진다. MFT Entry Header / Fixup Array / Attributes / End Marker / Unused Space로 구분되며 End Marker 이후는 MFT Entry에서 사용되지 않는다. Attributes는 여러 개가 올 수 있으며 MFT 엔트리는 할당된 이후에 파일이 삭제되면 프리 리스트가 되고 이후 재사용될 수 있다. 만약 재사용 안 되는 경우 Free MFT 엔트리에 예전 파일 데이터가 존재할 수 있다.
- MFT 엔트리 헤더(MFT Entry Header)
MFT 엔트리 헤더는 모든 MFT 엔트리의 제일 첫 부분에 위치하며 크기는 42바이트이다.
아래 그림은 MFT 엔트리 헤더의 데이터 구조이다. MFT 엔트리의 시작은 "FILE"이라는 시그니처로 시작한다.
크기 | 위치 | 이름 | 내용 |
4 | 0x0 - 0x03 | Signature | MFT 엔트리 Signature |
2 | 0x04 - 0x05 | Offset to fixup array | fixup array 시작 위치 |
2 | 0x06 - 0x07 | Number to entries of fixup array | fixup array에 포함되는 항목 수 |
8 | 0x08 - 0x0F | $LogFile Sequence Number(LSN) | $LogFile에 존재하는 해당 파일의 트랜잭션 위칫값 |
2 | 0x10 - 0x11 | Sequence Number | MFT 엔트리에 생성 후 할당/해제 시마다 1 증가 |
2 | 0x12 - 0x13 | Hard Link Count | MFT 엔트리에 연결된 Hard Link |
2 | 0x14 - 0x15 | Offset to First Attribute | 해당 MFT 엔트리의 첫 번째 속성 위치 |
2 | 0x16 - 0x17 | Flags | MFT entry 속성 0x00(사용하지 못함) 0x01(사용 중) 0x03(사용 중인 디렉터리) 0x02(사용하지 않는 디렉터리) |
4 | 0x18 - 0x1B | Used size of MFT entry | 실제 사용 중인 크기 |
4 | 0x1C - 0x1F | Allocated size of MFT entry | MFT에 할당된 크기 |
8 | 0x20 - 0x27 | File Reference to base record | Base record 주소값 |
2 | 0x28 - 0x29 | Next Attribute ID | 다음 속성 ID |
2 | 0x2A - 0x2B | Align to 4Byte boundary | 예약 영역 |
4 | 0x2C - 0x2F | Number of MFT Entry | MFT 엔트리 넘버 |
실제 예를 가지고 MFT 엔트리 헤더를 해석해 보면 아래와 같다.
- Signature: FILE이며 엔트리에 문제가 있으면 BADD 시그니처를 갖는다.
- Offset to fixup array: fixup 배열의 시작 위치는 0x30이 된다.
- Number of entries of fixup array: 3개임을 알 수 있다.
- Sequence Number: 1로서 이 엔트리가 처음 사용되었음을 알 수 있다.
- Hard Link Count: 파일은 같은 데이터를 가리키는 여러 개의 이름을 가질 수 있으나 여기서는 하드링크가 1로서 하나밖에 없음을 알 수 있다.
- Offset to First Attribute: 속성 오프셋은 38이므로 38바이트 후 속성이 나타나고 MFT 헤더가 56바이트임을 알 수 있다.
- Flags: 1이므로 할당된 파일임을 보여준다.
- File Reference to base record: 파일이 하나 이상의 레코드가 필요하면 1024byte에 들어갈 수 없고 추가 레코드가 필요하다. 그 경우 베이스 레코드를 지정할 때 필요하나 여기서는 0이므로 추가 레코드가 없음을 알 수 있다.
- Next Attribute ID: 7이므로 속성 ID가 1에서 6에 있다는 것을 알 수 있다.
- MFT Entry Number: 0임을 알 수 있다. 즉 $MFT이다.
- Fixup Array Values
Fixup Array는 MFT 엔트리의 신뢰성을 높이기 위해 도입되었다. "Fixup"은 "고치다"라는 뜻으로, MFT 엔트리의 데이터 오류를 감지하기 위한 역할을 한다. MFT 엔트리는 1024바이트(2개 섹터)를 사용하며, 각 섹터의 마지막 2바이트 값을 Fixup Array에 저장한다. 이후, 원래의 섹터 끝 값을 그다음 바이트에 기록하여, 섹터 데이터가 손상되었을 경우 이를 감지할 수 있도록 한다.
3. Attributes
속성은 파일의 메타정보를 가지고 있으며 Attribute Header와 Attribute Content로 구성되어 있다. 전체는 17개의 속성을 가지고 있으나 일반 파일은 $STANDARD_INFORMATION(0x10), $FILENAME(0x30), $DATA(0x80) 속성을 가진다. 크기에 따라 Resident 속성과 Non-Resident 속성으로 나누어지며 $STANDARD_INFORMATION, $FILENAME 등 대부분은 Resident 속성이고 $DATA 속성 중 680byte 이하면 Resident 속성이 되고 크기가 이보다 크면 Non-Resident 속성이 된다.
속성 식별값 | 이름 | 설명 |
0x10 | $STANDARD_INFORMATION | 파일의 생성, 접근, 수정 시간, 소유자 정보 등 |
0x20 | $ATTRIBUTE_LIST | 추가적 속성들에 대한 리스트 |
0x30 | $FILE_NAME | 파일 이름(유니코드), 생성, 접근, 수정 시간 등 |
0x40 | $VOLUME_VERSION | 볼륨 정보 |
0x40 | $OBJECT_ID | 파일 및 디렉터리의 16바이트 고유값 |
0x50 | $SECURITY_DESCRIPTOR | 파일의 접근제어와 보안 속성 |
0x60 | $VOLUME_NAME | 볼륨 이름 |
0x70 | $VOLUME_INFORMATION | 파일시스템 버전과 다양한 플래그 정보 |
0x80 | $DATA | 파일 내용 |
0x90 | $INDEX_ROOT | 인덱스 트리의 루트 노드 정보 |
0xA0 | $INDEX_ALLOCATION | 인덱스 트리의 루트와 연결된 하위 노드 정보 |
0xB0 | $BITMAP | $MFT의 할당 정보 |
0xC0 | $SYMBOLIC_LINK | 심볼릭 링크 정보 |
0xC0 | $REPARSE_POINT | 심볼릭 링크에서 사용하는 Resparse point 정보 |
0xD0 | $EA_INFORMATION | OS/2 응용프로그램과 호환성을 위해 존재(HPFS) |
0xE0 | $EA | OS/2 응용프로그램과 호환성을 위해 존재(HPFS) |
0xF0 | $LOGGED_UTILITY_STREAM | 암호화된 속성의 정보와 키 값 |
4. 공통 속성헤더
속성헤더는 속성마다 서로 다른 형식을 가지지만 헤더 시작 부분 16바이트는 동일한 구조를 가진다. 밑의 표는 공통 헤더의 구조이다.
크기 | 위치 | 이름 | 내용 |
4 | 0x00 - 0x03 | Attribute Type ID | Attribute 타입 식별자 |
4 | 0x04 - 0x07 | Length of Attribute | Attribute 길이 |
1 | 0x08 | Non Resident Flag | 1이면 Non-resident |
1 | 0x09 | Length of Name | Attribute 이름 길이 |
2 | 0x0A - 0x0B | Offset to Name | Attribute 이름 시작 위치 |
2 | 0x0C - 0x0D | Flag | 상태 플래그 0x0001(읽기 전용) 0x4000(암호화) 0x8000(Sparse 속성) |
2 | 0x0E - 0x0F | Attribute ID | Attribute의 고유 식별자로 MFT 엔트리에 같은 Attribute가 복수 개일 경우 다른 값을 가짐 |
- Resident Header
크기 | 위치 | 이름 | 내용 |
4 | 0x10 - 0x13 | Size of Content | Attribute Content 크기 |
2 | 0x14 - 0x15 | Offset to Content | Attribute Content 시작 위치 |
1 | 0x16 | Indexed Flag | 1이면 index 정보로 사용 |
1 | 0x17 | Unused | |
8 | 0x18 - 0x1F | Attribute Name | Attribute Name이 있을 경우 존재하며 없는 경우 바로 Attribute Content가 옴 |
5. $STANDARD_INFORMATION
모든 파일에 기본적으로 존재하는 기본적인 속성으로 시간 정보, 파일 특성, 소유자, 보안 ID 등을 표시하며 Attribute Type이 0x10일 경우 해당 속성을 의미한다.
크기 | 위치 | 이름 | 내용 |
8 | 0x00 - 0x07 | Create Time | 파일이 생성된 시간 |
8 | 0x08 - 0x0F | Modified Time | $DATA나 $INDEX 내용의 마지막 수정 시간 |
8 | 0x10 - 0x17 | MFT Modified Time | MFT 엔트리가 마지막으로 수정된 시간 |
8 | 0x18 - 0x1F | Last Accessed Time | 파일에 마지막으로 접근한 시간 |
4 | 0x20 - 0x23 | Flag | 파일 속성 |
4 | 0x24 - 0x27 | Maximum number of version | 파일에서 최대로 허용된 버전 값 |
4 | 0x28 - 0x2B | Version Number | 파일의 버전 번호 |
4 | 0x2C - 0x2F | Class ID | 클래스 ID |
4 | 0x30 - 0x33 | Owner ID | 소유자 ID($Quota에서 인덱스로 사용) |
8 | 0x34 - 0x37 | Security ID | $Secure에서 인덱스로 사용 |
8 | 0x38 - 0x3F | Quota Charged | 사용자 할당량 중 해당 파일이 할당된 크기 |
8 | 0x40 - 0x47 | Update Sequence | $UsnJrnl에서 사용하는 파일의 USN 값 |
Flag | 설명 | Flag | 설명 |
0x0001 | 읽기 전용 | 0x0002 | 숨긴 파일 |
0x0004 | 시스템 | 0x0020 | Archive |
0x0040 | Device | 0x0080 | 일반 |
0x0100 | 임시 | 0x0200 | Sparse 파일 |
0x0400 | Reparse Point | 0x0800 | 압축 |
0x1000 | 오프라인 | 0x2000 | 인덱스 되지 않음 |
0x4000 | 암호화 |
6. $FILE_NAME
모든 파일에 기본적으로 존재하는 속성으로 파일 이름을 저장하기 위해 사용되며 Attribute Type이 0x30인 경우 해당 속성을 의미한다.
파일 이름 외에도 다양한 부가 정보가 함께 저장되며, NTFS에서 빠른 탐색을 위해 구축된 인덱스 구조인 $I30에도 기록된다. 또한, 파일 이름의 크기가 가변적이므로 $FILE_NAME 속성의 크기는 68바이트 이상이 될 수 있다.
$STANDARD_INFORMATION에 4개의 시간 정보가 있으나 $FILE_NAME에도 4개의 시간 정보가 존재한다.
크기 | 위치 | 이름 | 내용 |
8 | 0x00 - 0x07 | File Reference of parent directory | 부모 디렉터리 파일 참조 주소 |
8 | 0x08 - 0x0F | Creation Time | 생성 시간 |
8 | 0x10 - 0x17 | Modified Time | 수정 시간 |
8 | 0x18 - 0x1F | MFT Modified Time | MFT 레코드 업데이트 시간 |
8 | 0x20 - 0x27 | Last Accessed Time | 접근 시간 |
8 | 0x28 - 0x2F | Allocated size of file | 해당 파일이 할당된 클러스터 크기 |
8 | 0x30 - 0x37 | Real size of file | 해당 파일 실제 크기 |
4 | 0x38 - 0x3B | Flags | 파일 속성 $STANDARD_INFORMATION 파일 속성과 거의 같지만 아래 속성이 추가됨 0x10000000 디렉터리 0x20000000 인덱스 뷰 |
4 | 0x3C - 0x3F | Reparse value | 해당 속성의 Reparse point |
1 | 0x40 | Length of name | 이름 길이 |
1 | 0x41 | Namespace | 이름 표현 방식 0(POSIX) 1(WIN32) 2(DOS 3) 3(WIN32 & DOS) |
- | 0x42 - | Name | 유니코드(UTF-16)로 인코딩된 이름 |
7. $DATA
모든 파일에 기본적으로 존재하는 속성으로 파일 데이터를 저장하기 위해 사용된다. Attribute Type이 0x80인 경우 해당 속성을 의미한다. 보통 MFT 엔트리는 $STANDARD_INFORMATION, $FILE_NAME, $DATA 3개의 속성을 가지고 있다. $STANDARD_INFORMATION, $FILE_NAME과 달리 680byte를 넘는 대부분의 파일은 Non-Resident 속성이며 Cluster Run 구조로 데이터를 가지고 있다. 680byte 이하의 내용을 갖는 파일은 Resident 속성으로 MFT 엔트리 내부에 데이터를 저장한다.
- Non-Resident Header
크기 | 위치 | 이름 | 내용 |
8 | 0x10 - 0x17 | Start VCN of Runlist | Runlist의 시작 VCN VCN(Virtual Cluster Number)은 파일의 첫 번째 클러스터부터 순차적으로 부여한 번호 |
8 | 0x18 - 0x1F | End VCN of Runlist | Runlist의 끝 VCN |
2 | 0x20 - 0x21 | Offset of Runlist | Runlist의 시작 위치 |
2 | 0x22 - 0x23 | Compression until size | 압축 단위 크기 |
4 | 0x24 - 0x27 | Unused | |
8 | 0x28 - 0x2F | Allocated Size of Attribute Content | Attribute Content가 할당된 클러스터 크기 |
8 | 0x30 - 0x37 | Real Size of Attribute Content | Attribute Content의 실제 클러스터 크기 |
8 | 0x38 - 0x3F | Initialized Size of Attribute Content | Attribute Content가 초기화된 클러스터 크기 |
8 | 0x40 - 0x47 | Attribute Name | Attribute Name이 있을 경우 존재하며 없는 경우 바로 Attribute Content가 옴 |
6. $BITMAP
MFT 엔트리 6번은 $BITMAP이며 MFT 엔트리 할당 상태를 관리한다. 바이트가 아닌 비트가 MFT 엔트리 할당 상태를 가리킨다. MFT 엔트리가 할당되면 비트가 1로 설정되며 비트가 0으로 설정되면 할당이 되지 않은 상태를 나타낸다.
7. $LogFile
$LogFile은 MFT 엔트리 2에 해당하며, 파일 및 디렉터리의 생성, 삭제, 이름 변경 등의 작업을 기록하는 로그 파일이다. 이는 시스템이 비정상적으로 종료되었을 때 롤백을 수행할 수 있도록 돕는다.
작업 기록은 LSN(Logfile Sequence Number)을 사용해 순차적으로 증가하는 숫자로 저장되며, 이를 통해 레코드들의 순서를 구분할 수 있다. 기본적으로 $LogFile의 크기는 약 65MB이며, 하루 8시간 사용한다고 가정하면 약 2~3시간 분량의 로그를 저장할 수 있는 용량이다.
로그 파일 크기는 chkdsk /L 명령어로 확인할 수 있으며, chkdsk /L:파일크기(KB) 명령어를 사용해 조정할 수 있다.
또한 $LogFile에는 변경된 정보(Redo)와 변경 전 정보(Undo)가 모두 저장되며, 이러한 레코드들이 모여 하나의 트랜잭션을 구성한다. NTFS는 모든 작업을 트랜잭션 단위로 관리하며, 시스템에 문제가 발생하면 트랜잭션 내의 Undo 정보를 활용해 변경 전 상태로 복구할 수 있다.
- $LogFile의 전체적인 구조
$LogFile은 재시작 영역(Restart Area)과 로깅 영역(Logging Area) 두 부분으로 구성된다. 로깅 영역은 두 개의 페이지(각 4KB)로 이루어져 있으며, 두 번째 페이지는 첫 번째 페이지의 복사본이다. 이 영역은 마지막 작업 레코드의 정보를 저장하여 시스템 복구 시 중요한 역할을 한다.
NTFS는 디스크 복구를 위해 5초마다 체크포인트 레코드를 저장한다. 이를 통해 디스크 오류 발생 시, 복구를 어디서 시작해야 하는지 파악할 수 있다. 체크포인트 레코드는 특정 페이지에 기록되며, 이후 재시작 영역에 해당 LSN(Logfile Sequence Number) 번호를 저장한다. 이를 기반으로 시스템은 복구 작업을 시작할 위치를 결정할 수 있다.
- $LogFile 재시작 영역의 페이지 헤더
- $LogFile 일반 영역
로깅 영역은 다시 버퍼 페이지 영역과 일반 페이지 영역으로 나눌 수 있다.
버퍼 페이지도 두 페이지로 구성되어 있으며 두 번째 페이지는 첫 번째 페이지의 복사본이다. 버퍼 페이지는 마지막 작업 레코드의 정보를 기록하고 있고 일반 영역에 순차적으로 기록하고 용량이 다 차면 로깅 영역의 첫 위치로 다시 순환하면서 덮어쓰기를 한다.
모든 페이지는 헤더 하나와 여러 개의 작업 레코드들로 구성되어 있다.
- $LogFile 일반 영역의 페이지 헤더
- $LogFile 작업 레코드 구조
작업 레코드는 업데이트 레코드와 체크포인트 레코드로 구분되며, 업데이트 레코드는 Redo 정보와 Undo 정보를 포함한다.
Redo 정보는 트랜잭션이 커밋되었지만 아직 디스크에 기록되기 전에 시스템 오류가 발생한 경우, 해당 트랜잭션을 다시 적용하기 위해 사용된다. 반면, Undo 정보는 커밋되지 않은 트랜잭션이 수행 도중 시스템 오류로 중단된 경우, 이미 실행된 작업을 되돌리는 역할을 한다.
- $LogFile 페이지 작업 레코드 헤더
- Current LSN: 현재 작업 레코드 LSN
- Previous LSN: 이전 작업 레코드 LSN
- Client Undo LSN: 복구 시 다음 Undo 작업의 LSN을 가지고 있는 레코드
- Client Data Length: 레코드 크기(Redo Op 필드부터 레코드 끝)
- Record Type: 0x02(체크포인트 Record), 0x01(그 외 레코드)
- Flags: 0x01(레코드가 현재 페이지로 넘어감), 0x00(넘어가지 않음)
- Redo Op: Redo 작업 코드
- Undo Op: Undo 작업 코드
- Redo Offset: Redo 오프셋
- Redo Length: Redo 데이터 크기
- Undo Offset: Undo 오프셋
- Undo Length: Undo 데이터 크기
- MFT Cluster Index: MFT 내 Redo/Undo data가 있는 클러스터
- Target VCN: Redo/Undo된 데이터의 $MFT VCN(Virtual Cluster Number)
- Target LCN: Redo/Undo된 데이터의 $MFT LCN(Logical Cluster Number)
NTFS Operation | Hex Value(Op code) |
Noop | 0x00 |
Compensation Log Record | 0x01 |
Initialize File Record Segment | 0x02 |
Deallocate File Record Segment | 0x03 |
Write End of File Record Segment | 0x04 |
Create Attribute | 0x05 |
Delete Attribute | 0x06 |
Update Resident Value | 0x07 |
Update Non Resident Value | 0x08 |
Update Mapping Paris | 0x09 |
Delete Dirty Clusters | 0x0A |
Set New Attribute Sizes | 0x0B |