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를 로드하여 운영체제를 부팅할 수 있게 만든다.


 

Tagged with:
 
  • http://www.facebook.com/ruony Eun Gyun Kim

    좋은자료 잘 보고갑니다. 개인블로그에 백업해두고 보려고 퍼갑니다 :)

    • http://www.facebook.com/proneer Jinkook Kim

      출처만 밝혀주시면 공유에 특별한 제약은 없습니다.

  • http://www.facebook.com/profile.php?id=100001325694102 장태윤

    파일시스템을 조금씩 공부하고있는데, 정말 많은 도움이 되네요 ^^;
    좋은 자료 감사합니다!

    • http://www.facebook.com/proneer Jinkook Kim

      보시다가 이해 안되는 부분이 있으면 언제든지 댓글로 남겨 주세요. 파일시스템도 추가적으로 쓰기로 하고 안쓴 부분이 많아서 필요한 부분을 요청해주시면 추가로 포스팅하겠습니다.