VBR(Volume Boot Record)는 NTFS 구조에서 가장 앞부분에 위치하는 영역이다. VBR은 FAT 예약된 영역과 유사하게 부트 섹터와 추가적인 부트 코드가 저장된다.
VBR의 크기는 고정된 크기를 가지지 않고 다음과 같이 클러스터 크기에 의존한다. 파일이 클러스터 크기로 할당된다는 점에서 이상하지 않을지 모르지만 앞서 FAT 파일시스템에서 예약된 영역이 파일시스템 타입에 따라 고정된 크기를 가지는 것과는 사뭇 다르다.
Cluster Size (Byte) | VBR Size (Sector) |
512 | 1 |
1K | 2 |
2K | 4 |
4K | 8 |
부트 섹터 (Boot Sector)
VBR의 첫 번째 섹터는 부트 코드를 포함한 부트 섹터가 위치한다. FAT 파일시스템 예약된 영역의 부트 섹터와 그 내용이 같다고 이해하면 될듯 하다. 결국, 클러스터 크기가 512인 경우는 VBR 자체가 부트 섹터가 된다. VBR 크기가 1섹터를 넘는 경우, 나머지 섹터들은 추가적인 부트 코드를 저장하기 위한 용도로 사용되거나 NTLDR(NT Loader)을 빠르게 로드하기 위해 NTLDR의 위치를 저장하기 위한 용도로 사용된다.
다음은 부트 섹터의 데이터 구조이다.
Byte Range | Description | |
Decimal | Hexadecimal | |
0 – 2 | 0×0000 – 0×0002 | Jump command to boot code (usually 0xEB5290) |
3 – 10 | 0×0003 – 0x000A | OEM ID (typically "NTFS ") |
11 – 12 | 0x000B – 0x000C | Bytes per sector |
13 – 13 | 0x000D – 0x000D | Sectors per cluster |
14 – 15 | 0x000E – 0x000F | Reserved |
16 – 18 | 0×0010 – 0×0012 | Always 0 |
19 – 20 | 0×0013 – 0×0014 | Unused |
21 – 21 | 0×0015 – 0×0015 | Media descriptor |
22 – 23 | 0×0016 – 0×0017 | Always 0 |
24 – 25 | 0×0018 – 0×0019 | Sector per track |
26 – 27 | 0x001A – 0x001B | Number of heads |
28 – 31 | 0x001C – 0x001F | Hidden sectors |
32 – 35 | 0×0020 – 0×0023 | Unused |
36 – 39 | 0×0024 – 0×0027 | Unused |
40 – 47 | 0×0028 – 0x002F | Total secotrs |
48 – 55 | 0×0030 – 0×0037 | Logical cluster Number for the file $MFT |
56 – 63 | 0×0038 – 0x003F | Logical cluster Number for the file $MFTMirr |
64 – 67 | 0×0040 – 0×0043 | Clusters per file record segment |
68 – 71 | 0×0044 – 0×0047 | Clusters per index block |
72 – 79 | 0×0048 – 0x004F | Volume serial number |
80 – 83 | 0×0050 – 0×0053 | Checksum |
84 – 509 | 0×0054 – 0x01FD | Boot code and error message |
510 – 511 | 0x01FE – 0x01FF | Signature ("0x55AA") |
다음은 NTFS 부트 섹터를 덤프한 내용이다. 위의 데이터 구조와 함께 살펴보자.
VBR의 부트 코드 역시 MBR에서 부팅 가능한 파티션을 찾은 후 해당 볼륨의 첫 섹터로 점프한다. NTFS가 부팅 가능한 파티션일 경우 부트 섹터로 점프하면 위의 점프 명령어가 실행될 것이다. 점프 명령어는 BPB(BIOS Parameter Block)을 지난 오프셋 0×54로 점프하게 된다.
이후 BPB 항목을 참조하여 해당 볼륨의 운영체제를 로드하는 부트 코드가 실행된다. 위 부트 코드 역시 BIOS에서 해석 가능하도록 16비트 명령어로 이루어져 있다.
추가적인 VBR 영역 (Bootstrap Code Area)
VBR의 첫 섹터를 제외한 나머지 섹터에는 일반적으로 NTLDR을 빠르게 로드하기 위해 NTLDR에 대한 정보와 추가적인 부트 코드가 저장된다. 다음은 VBR의 두 번째 섹터에 대한 덤프이다. 섹터의 윗부분에 NTLDR와 함께 "$I30"이라는 문자가 보일 것이다. "$I30"은 NTFS에서 $FILE_NAME 속성을 인덱싱할때 사용하는 인덱스 이름이다.
쉽게 말해 FAT 파일시스템의 루트 디렉터리부터 하위 디렉터리까지 탐색하기 위한 구조로 디렉터리 엔트리를 사용하였지만, NTFS에서는 이것을 위해 $FILE_NAME을 트리 형태로 인덱싱하여 하위 디렉터리를 빠르게 탐색할 수 있도록 지원한다. 결과적으로 NTLDR이 위치한 정보를 기록해 놓은 셈이 된다. 이로 인해 더 빠르게 NTLDR를 로드하여 운영체제를 부팅할 수 있게 만든다.
덧글