본문 바로가기

디스크와 파티션

MBR 이야기 - MBR 초기화 작업이란?

MBR 의 간략한 구조

1. MBR 의 구조



MBR 의 구조를 간단하게 보면 위와 같습니다.

파티션 테이블에는 현재 디스크에 존재하고 있는 파티션들에 대한 정보들이 저장되어 있는 공간입니다. 파티션의 크기, 위치, 속성, 활성 여부 등의 정보가 기록되어 있죠. 지금까지 DiskPart 를 비롯하여 많은 도구들에서 디스크와 파티션을 관리하던 수많은 작업들의 대부분은 파티션 테이블과 관련이 있던 작업들이었습니다.

디스크 서명DiskPart 의 UniqueID 명령디스크 서명 충돌 문제윈도우 7 Bootmgr 의 0xc000000e 부팅 오류에서 다뤘죠? 해당 디스크를 식별하기 위한 IDentity! 이 이상 더 설명드릴 게 없네요.

코드 영역은 부팅과 관련이 있는 영역이죠. 코드 영역의 기본 목적은 파티션 테이블에서 활성 파티션을 찾고 해당 파티션의 부트 섹터로 이동하게끔 해주어 나머지 부팅 과정이 진행되도록 하는 겁니다. 그리하여 코드 영역에는 그러한 작업을 진행하는 작은 프로그램이 저장되어 있습니다. [PC 의 부팅 과정 - {BIOS -> MBR(코드 영역 + 활성 파티션) -> 부트 섹터 -> 부트 매니저(-> 로더)}] 이를 표준 코드라고 합니다.

이것이 MBR 의 주요한 세 가지 구성 요소입니다.



2. MBR 보기

MBR 은 디스크의 첫 번째 섹터에 위치하고 있습니다. 첫 번째 섹터는 Logical Sector 0, CHS 0:0:1, LBA 0 과 같은 주소를 가지고 있죠. 그래서 디스크의 섹터 내용을 직접 볼 수 있는 디스크 관리 유틸이나 디스크에 접근할 수 있는 Hex 에디터를 통해 이 내용을 확인할 수 있습니다.

먼저 그 전에 다음의 표는 위에서 간단하게 보여드린 MBR 의 좀 더 정확한 구조입니다. [참고 - MBR 디스크]

마스터 부트 레코드의 구조[Structure of a Master Boot Record]
주소 설명 크기
Bytes
16진수 8진수 10진수
0000 0000 0 코드 영역[code area] 440
(max. 446)
01B8 0670 440 디스크 서명[disk signature (optional)] 4
01BC 0674 444 비어 있음[Usually nulls; 0x0000] 2
01BE 0676 446 프라이머리 파티션 테이블
네 개의 16 Byte 엔트리
[Table of primary partitions
(Four 16-byte entries, IBM partition table scheme)]
64
01FE 0776 510 55h MBR 서명[MBR signature];
0xAA55
2
01FF 0777 511 AAh
MBR, 전체 크기: 446 + 64 + 2 = 512



그리고 아래는 HxD 라는 무료 헥스 에디터를 통해 특정 디스크의 MBR 을 살펴 본 모습입니다. 물론 GDisk 와 같은 섹터의 내용을 직접 볼 수 있는 디스크 관련 유틸을 사용하셔도 됩니다. 아무튼 위의 구조를 토대로 내용을 잘 살펴 보시면 이해하시기 쉬울 겁니다.






MBR 초기화란?(Initialise or Repair)

1. MBR 초기화란?

우리가 흔히 이야기하는 MBR 초기화는 MBR 에서 코드 영역을 초기화하는 겁니다. 간혹 프로그램에 따라 디스크 서명까지 초기화하는 경우도 있지만 어쨌든 MBR 초기화(Initialise, Repair)는 파티션 테이블은 건드리지 않습니다. 그렇다면 코드 영역의 초기화는 왜 하느냐?

간혹 코드 영역의 프로그램에 문제가 발생하는 경우가 있습니다. MBR 의 코드 영역을 직접 사용하는 부트 매니저를(ex. GRUB4DOS) 잘못 설치하였거나 바이러스나 잘못된 작업 등 여러가지 이유에 의해 MBR 코드 영역의 프로그램이 깨지는 것이죠. 이렇게 되면 해당 디스크로는 부팅을 진행할 수 없게 됩니다.

이럴 때 해결 방법은 MBR 의 코드 영역을 다시 원래대로 파티션 테이블에서 활성 파티션을 찾고 해당 파티션의 부트 섹터로 이동하게끔 해주는 표준 코드를 기록해주면 됩니다. 이것이 MBR 초기화입니다. 때론 MBR 의 코드 영역에 설치된 GRUB4DOS 와 같은 부트 매니저를 제거하는 용도로 MBR 초기화 작업을 진행하기도 합니다.



2. 표준 코드

코드 영역에 사용되는 표준 코드는 윈도우 버전마다 조금씩 그 구성이 다릅니다. 이러한 각 윈도우 버전의 표준 코드는 해당 윈도우에 포함된 디스크 도구나(FDisk, 디스크 관리, DiskPart) MBR 관리 프로그램을 사용할 때 그에 맞게 기록됩니다. 하지만 코드의 구성이 다소 다를지라도 기본적으로 그 구조는 활성 파티션의 부트 섹터로 이동하는 것으로 동일합니다.

그래서 MBR 의 코드 영역이 윈도우 XP 형식의 표준 코드를 가지고 있다 할 지라도 부트 섹터가 NT60 형식으로(BOOTMGR 을 찾도록) 설정되어 있다면 BOOTMGR 부트 매니저로 정상적으로 부팅되고, 반대로 코드 영역이 윈도우 7 형식의 표준 코드를 가지고 있다 할 지라도 NTLDR 로 정상 부팅됩니다. 기본 구조는 같으니까요.

이러한 이유로 MBR 초기화 작업에서 어떤 윈도우 버전의 표준 코드를 사용해야 할 지는 사실 크게 고민하지 않아도 되는 문제입니다. 일단 각 윈도우에 포함된 관리 도구를 사용하면 자동으로 해당 윈도우 버전의 표준 코드를 사용하고, 만약 다른 버전의 표준 코드를 사용하더라도 설명한 것과 같이 부팅에 큰 영향을 미치지 않고 정상적으로 부팅이 진행되니까요.


참고로 아래는 각 윈도우 버전들의(도스부터) 표준 코드에 대한 정보입니다.






MBR 초기화하기

1. Bootsect.exe

윈도우 비스타, 7, 8 에서 MBR 초기화를 담당하는 도구는 bootsect.exe 입니다. 원래 특정 파티션의 부트 섹터를 NT52(NTLDR), 또는 NT60(BOOTMGR) 형식으로 수정하기 위한 도구이지만 이와 함께 해당 파티션이 속한 디스크의 MBR 을 초기화하는 기능이 함께 포함되어 있습니다.

bootsect /nt60 c: /mbr
C: 드라이브 파티션의 부트 섹터를 NT60 형식으로(BOOTMGR 을 찾도록) 변경하고 이에 더해 해당 파티션이 속한 디스크의 MBR 코드 영역을 표준 코드로 초기화합니다. (/NT52 일 때와 /NT60 일 때의 표준 코드가 조금 다릅니다. 하지만 부팅에 큰 영향을 미치진 않습니다.)




2. 윈도우 7 - 컴퓨터 복구의 Bootrec.exe

컴퓨터 복구(WinRE.wim)로 부팅하면 명령 프롬프트에서 Bootrec.exe 이라는 도구를 사용할 수 있습니다. 이러한 Bootrec.exe 는 윈도우 7 계열의 부팅을 복구하는 것을 도와주는 도구입니다. 참고로 Bootrec.exe 의 작업들은 Bootsect.exe, BCDEdit.exe, BCDBoot.exe 로도 할 수 있습니다. 그냥 이러한 것이 있다는 것 정도만 알아두셔도 될 듯 하네요.

bootrec /fixmbr
시스템 파티션(펌웨어 기준 부팅용 디스크의 활성 파티션)이 속한 디스크의(결국 첫 번째 디스크) MBR 코드 영역을 표준 코드로 초기화합니다.





3. 윈도우 XP - 복구 콘솔

윈도우 XP 의 복구 콘솔로 부팅하면 Fixmbr 도구를 사용할 수 있습니다. Fixmbr 도구는 기본적으로 첫 번째 디스크의 MBR 코드 영역을 표준 코드로 초기화합니다.

fixmbr
새로운 MBR을 만드시겠습니까? Y



참고로 fixmbr 은 사용자가 직접 MBR 을 초기화할 디바이스를(디스크) 선택할 수도 있는데 이 때 디스크의 디바이스 경로는 map 명령을 통해 알아낼 수 있습니다. 이렇게 알아낸 디바이스 경로 중 디스크 경로까지만 입력하시면 됩니다.

map
fixmbr \Device\Harddisk0






4. MBRWiz.exe

MBRWiz - 작고 강력한 MBR 관리 도구

대표적인 MBR 관리 유틸인 MBRWiz.exe 를 통해서도 MBR 의 코드 영역을 초기화할 수 있습니다. 한 가지 MBRWiz 는 이를 초기화가(Initialise) 아닌 수리로(Repair) 표현합니다. 그리고 작업을 진행할 디스크의 정확한 번호는 mbrwiz /list 명령으로 미리 확인하시면 됩니다. [윈도우의 디스크 번호와 동일]

mbrwiz /disk=0 /repair=win7 /confirm
/repair=xp <- 윈도우 XP 표준 코드로 초기화
/repair=win7 <- 윈도우 7 표준 코드로 초기화



이 때 디스크는 위와 같이 디스크로 지정해도 되고, /vol=c: 나 /part=boot, /part=system 과 같이 볼륨이나 특수 파티션으로 지정해도 됩니다. [이 때 boot 는 부트 매니저가 위치한 파티션(윈도우에선 시스템 파티션으로 표현)에 해당하며 system 은 윈도우가 설치된 파티션(윈도우에선 부팅 파티션으로 표현)에 해당합니다. 다소 헷갈릴 여지가 있습니다.]



5. MBRFix.exe

또 다른 MBR 관리 유틸 중 하나인 MBRFix.exe 를 통해서는 MBR 의 코드 영역을 XP/Vista/7 의 표준 코드로 초기화할 수 있습니다. 참고로 MBRFix 는 디스크를 Drive 로 표현합니다. 그리고 작업을 진행할 디스크는 mbrfix /drive 0 driveinfo 과 같이 디스크의 정보를 확인하여 판별해야 합니다. [윈도우의 디스크 번호와 동일]

mbrfix /drive 0 fixmbr /win7 /yes
fixmbr <- 윈도우 XP 표준 코드로 초기화
fixmbr /vista <- 윈도우 비스타 표준 코드로 초기화
fixmbr /win7 <- 윈도우 7 표준 코드로 초기화




6. GDisk32.exe

한 때 제가 가장 즐겨 사용했던 고스트의 친구 GDisk 도 MBR 초기화 기능을 제공하죠. 작업은 윈도우용인 GDisk32.exe 를 기준으로 하겠습니다. 디스크 번호는 gdisk32 /status(또는 그냥 gdisk32) 명령으로 파악하시고요.[GDisk 는 디스크 번호를 1 부터 시작하는 것에 주의.] 아무튼 GDisk 의 MBR 초기화에는 두 가지 옵션이 있습니다.

gdisk32 1 /mbr /p
1 번 디스크의 MBR 코드 영역을 초기화합니다. 기본값이기에 /p 를 생략하고 gdisk32 1 /mbr 로 작업해도 됩니다.

gdisk32 1 /mbr /z
1 번 디스크의 MBR 코드 영역을 초기화합니다. 동시에 디스크 서명을 재설정합니다.



참고로 /z 스위치를 통해 디스크 서명을 재설정하는 경우 BOOTMGR 부트 매니저 환경일 땐(윈도우 7) 부팅 과정에서 BOOTMGR 이 변경된 디스크 서명으로 인해 디스크를 찾지 못해 0xc000000e 오류 코드를 만나게 됩니다. NTLDR 부트 매니저 환경이(윈도우 XP) 아니라면 주의하세요.

그리고 GDisk 의 경우 코드 영역의 초기화에 독자적인 표준 코드 구성을 사용합니다. [그렇다고 할 지라도 기본적으로 활성 파티션 찾고 해당 부트 섹터로 이동하는 것에는 변함이 없습니다.]





이 외에도 많은 도구들이 있겠지만 대충 이정도만 정리해도 될 듯 하네요. 이상입니다. 그럼 다음 글에서 뵙죠. ^^

예전에 윈도우의 부팅 구조에 대한 정리 글에서 윈도우의 부트 매니저는 MBR 에 관여하지 않는다고 설명한 적이 있습니다. 하지만 윈도우의 버전마다 조금씩 다른 표준 코드를 사용하고 있고, 이는 해당 글에서의 설명이 잘못된 것임을 의미하는 것이죠. 

표준 코드의 기본 구조가 활성 파티션의 부트 섹터로 이동하는 것이고, 그렇기에 표준 코드의 변화가 직접적으로 겉으로 드러나지 않고 MBR 을 직접 봐야지만 알 수 있는 내용이었습니다. 이번 글을 작성하기 위해 MBR 에 대한 다양한 테스트를 진행하면서 살펴보던 도중 미처 예전에 발견하지 못했던 윈도우의 버전에 따라 표준 코드가 조금씩 다른 것을 발견하였고, 이에 대한 정보를 찾던 중 다양한 표준 코드에 대한 정보를 찾아내게 되었습니다. (해당 정보는 이번 글에 포함되어 있습니다.)

다른 윈도우 버전의 표준 코드 형식을 사용하더라도 말한 것과 같이 겉으로는 드러나지 않고 정상적으로 부팅이 진행되기에 코드들이 조금씩 다른 걸 몰랐습니다... 그래서 윈도우가 MBR 의 코드 영역에는 관여하지 않는다는 설명은 틀린 것이기에 관련 글에서 이에 해당하는 내용은 수정(관련 부분 삭제)하였습니다.

해당 글을 작성할 때 좀 더 자세하게 정보들을 수집했어야 했는데 미처 그러지 못하고 뒤늦게 오류를 잡게 되었네요. 죄송합니다. 점점... 글쓰기가 무서워 지네요. ㅜ_ㅜ