<In Story>

BCD 부팅 구성 데이터 저장소 구조 // [OS] [MS Windows] [Boot] 본문

OS(operating system)/MS WIndows

BCD 부팅 구성 데이터 저장소 구조 // [OS] [MS Windows] [Boot]

<In Story, Hi story, History> 2015. 5. 4. 15:05
* 2012년 02월 13일 14시 30분 수정 됨 - 일부 오류와 잘못된 설명을 수정하였으며 글의 주제와 상관없는 부분은 삭제하였습니다.

http://cappleblog.co.kr/53



BCD 는 Bootmgr 부트 매니저의 부팅 환경 설정 파일입니다. 이러한 BCD 는 "Bootmgr 부트 매니저의 시작이자 끝" 이라고 할 수 있습니다. 이 말인 즉슨, 결국 NTLDR 에서도 그러했듯 Bootmgr 도 부팅 환경 설정을 수정하고 편집하는 것이 우리가 할 거의 대부분의 작업이란 것이죠.

이러한 BCD 는 동일한 역할을 수행하던 이전의 Boot.ini 에 비해 그 뭐랄까... 음... 시작 전 BCD 만 따로 기본 개념이나 구조에 대한 밑밥을 좀 깔아두고(?) 시작하는게 좋습니다. 그래서! 밑밥을 좀 깔아보죠. ^^; 




BCD(Boot Configuration Data) 저장소란?

1. BCD 저장소의 정의

BCD 는 Boot Configuration Data 의 약자로 마이크로소프트의 새로운 윈도우 부트 매니저인 Bootmgr 부트 매니저의 모든 부팅에 관련된 환경 설정을 담고 있는 공간입니다. 일단 BCD 파일은 이전의 Boot.ini 파일과 같은 텍스트 기반의 파일이 아니라 데이터베이스 기반의 파일로써 그 구조는 윈도우의 레지스트리 하이브 파일과 비슷합니다. 이러한 연유로 BCD 파일은 BCD 저장소라고 표현됩니다.

BCD 와 레지스트리는 전혀 달라보이지만 실상 그 구조는 거의 비슷하다.



결론적으로 BCD 를 아주 간단하게 정의하자면 "BCD 는 Bootmgr 부트 매니저의 부팅 환경 설정 파일" 이라고 할 수 있습니다.

* 이하 BCD 는 BCD 저장소로 통일합니다.



2. Bootmgr 부트 매니저(BCD)가 지원하는 시스템 환경

일단 이걸 먼저 정리해야 겠네요. Bootmgr 부트 매니저와 BCD 저장소는 지금까지 수없이 이야기해 온 BIOS[바이오스] 시스템과 MBR 디스크의 조합으로 구성되는 전통적인 부팅 환경 뿐만 아니라, 비교적 최근에 규격이 갖추어진 (U)EFI[확장 펌웨어 인터페이스] 시스템과 GPT 디스크의 조합으로 구성되는 새로운 부팅 환경까지 모두 지원합니다.

전통의 BIOS 기반 시스템 - CMOS 셋업 화면


새로운 (U)EFI 기반 시스템 - EFI 셋업 화면


즉, Bootmgr 부트 매니저는 이전까지의 NTLDR 부트 매니저에서는 지원되지 않던 EFI + GPT 디스크에서의 부팅도 새롭게 지원을 한다는 것이죠.(하지만 EFI + GPT 디스크 조합을 쓰게 되면 이를 지원하지 않는 윈도우 버전들은 사용할 수 없게 됩니다.)

뭐 이건 일단 참고로만 알아두시구요. EFI 부팅은 메인보드 + 디스크 + 부트 매니저 + 지원 운영체제 사박자가 맞아야 쓸 수 있기 때문에 제한적이고 기존까지의 운영체제들에서 지원을 하지 않는 점 등으로 인해 아직은 잘 사용이 되지 않고 있습니다.

이러한 이유도 있고 현재까지도 우리가 접할 수 있는 대다수의 시스템은 BIOS 기반이기 때문에 Bootmgr 부트 매니저도 가장 많이 사용되는 BIOS 환경을 기준으로 이야기하게 될 것입니다.



3. BCD 저장소의 위치와 시스템 저장소

BCD 파일은 어디에나 있을 수 있지만 부팅에 사용되는 것은 BIOS 시스템에선 시스템 파티션의 \Boot 폴더에, EFI 시스템에선 EFI 시스템 파티션(ESP)의 \EFI\Microsoft\Boot 폴더에 존재하는 BCD 파일입니다.

BIOS 시스템에서의 시스템 저장소 위치


EFI 시스템에서의 시스템 저장소 위치 (참고로 시스템에 EFI 부팅 구성이 갖추어지지 않아 부득이 DVD 의 것을 스크린 샷으로 사용하였습니다.)



이 중에서 우리가 흔히 사용하는 환경은 BIOS 환경이기 때문에 우선은 시스템 파티션의 \Boot 폴더에 위치한 BCD 파일만 기억하고 계시면 될 듯 합니다. 아무튼 BIOS 시스템이든 EFI 시스템이든 해당 위치에 존재하고 부팅에 사용되는 BCD 저장소를 시스템 저장소라고 부릅니다.

즉, Bootmgr 이나 기타 관련 도구에서 시스템 저장소라고 이야기 한다면 우리가 흔히 사용하는 BIOS 기반 PC 에서는 [시스템 파티션\Boot\BCD] 파일을 의미하는 것이라는 이야기죠.

DVD 매체에서 사용되는 윈도우 PE 에는 BCD 저장소가 BIOS 시스템 기준의 \Boot 와 EFI 시스템 기준의 \EFI\Microsoft\Boot 에 모두 위치하고 있습니다. 즉, 윈도우 PE 는 두 가지 구성을 모두 가지고 있는 것이죠. 이는 해당 DVD 가 어떤 펌웨어 시스템에서 사용될 지 모르기 때문입니다. 이러한 내용은 윈도우 7 설치 DVD 를 확인해보시면 쉽게 확인해 보실 수 있습니다.





BCD 저장소의 구조와 내부 구성

일단 BCD 를 편집하여 윈도우의 부팅을 설정하고 편집하는 것을 알아보기 전에 미리 BCD 저장소의 구조와 내부 구성을 알아두는 것이 좋습니다. 설정들이 어떤 형식으로 저장되는지 안다면 나중에 BCD 를 편집하는 작업을 좀 더 쉽게 이해할 수 있기 때문이죠.



1. BCD 저장소의 구조

일단 BCD 는 아래와 같은 구조로 이루어져 있습니다.

출처 - 마이크로소프트 MSDN 문서



보시는 것과 같이 BCD 저장소(BCD Store) 는 객체와(BCD Object) 요소의(BCD Element) 집합으로 이루어져 있습니다. 이를 좀 더 쉽게 풀자면 BCD 저장소는 BCD 파일을 의미하며, 객체는 하나 하나의 부팅 항목을, 요소는 해당 부팅 항목의 개별적인 설정들을 의미합니다. 즉, 개별적인 설정들이 모여 하나의 항목을 이루고, 이러한 항목들이 모여있는 곳이 BCD 저장소가 되는 것이죠.

한글 윈도우에선 이러한 BCD 의 구조 중 BCD Store 는 BCD 저장소로, BCD Object 는 항목으로 BCD Element 는 항목 옵션으로 표현하고 있습니다. 앞으로는 이러한 한글 윈도우의 기본 표현을 기준으로 설명을 하도록 하겠습니다.


앞서 BCD 저장소 중 시스템 파티션 또는 ESP 파티션의 지정된 경로에 위치하여 실제 부팅에 사용되는 BCD 저장소를 시스템 저장소라 하였죠. BCD 시스템 저장소는 윈도우의 부팅에 필요한 기본적인 항목들을 모두 담고 있는 저장소로 7 계열 윈도우들을 설치할 때 설치 프로그램에 의해 자동으로 구성됩니다. 대략적인 구조는 아래와 같죠.

출처 - 마이크로소프트 MSDN 문서



이와 같이 BCD 저장소는 (부팅) 항목들과[Object] 해당 부팅 항목에 대한 설정들이(항목 옵션)[Elements] 체계적으로 모여 있는 곳 입니다. 이제 각각의 부팅 항목들은 그 종류에 따라 알맞은 설정들을 가지고 있죠. 그래서 우리는 적절한 부팅 항목을 만들고 해당 부팅 항목에 맞게 알맞은 옵션들을 정리해주면 되는 것입니다.



2. 일반 부팅 항목 - Windows 부팅 로더와 기타 부팅 항목들

가장 기본적인 항목이라고 할 수 있습니다. 하나 하나의 항목들이 모두 개별적으로 하나의 윈도우 또는 다른 운영체제를 부팅시킬 수 있는 부트 로더(부트 매니저)입니다.

주요 부팅 항목들 중 하나인 Windows 부팅 로더 항목과 Windows 레거시 OS 로더 항목



이 항목들에는 해당 윈도우(부트 로더)가 정확하게 어디에 위치해 있는지 해당 윈도우(부트 로더)로 부팅을 진행할 때 어떤 기능을 켜고 끌 것인지 등 윈도우로 부팅하기 위한, 또는 다른 부트 로더로 제어권을 이양시키기 위한 모든 실질적인 설정을 담고 있는 부분입니다. 즉, BCD 에서 실질적인 부팅과 관련된 설정을 담당하는(다른 부트 로더로 제어권을 이양하는) 부분이라고 할 수 있죠.

이러한 윈도우의 부팅이나 다른 부트 로더(부트 매니저)로의 제어권 전환은 모두 각자의 부팅 항목에 설정되어 있다.



이러한 항목들은 그것이 어떠한 종류인지에 따라(그것이 윈도우인지, 다른 부트 로더인지 등) 몇 가지 유형으로 나누어지며 각각의 유형은 그에 맞는 지정된 항목 옵션들을 가지고 있는 정형화된 구조를 가지고 있습니다. 즉, Windwos 부팅 로더 항목에는 동일하게 딱 어떤 설정들이 필요하고, Windwos 레거시 OS 로더 항목에는 또 나름대로 동일하게 딱 어떤 설정들이 필요하고 이런 식이란 것이죠. 그래서 그러한 정형화된 틀만 잘 이해하고 외우면 됩니다.

윈도우의 부팅 구성은 일종의 퍼즐 맞추기와 같다. 짜여진 틀 속에 알맞게 옵션들을 끼워 넣기만 하면 되니까.



이런 정형화된 구조로 인해 "어떤 종류의 부팅 항목을 추가할 땐 무조건 요렇게" 와 같이 딱 틀에 맞춘 명령 구성이 가능해 집니다. 이제 세부적인 옵션들의 내용들만 바뀌는 것이죠. 그래서 이러한 부분만 보면 윈도우의 부팅을 구성하는 것은 매우 쉬운 작업이며 단순 반복 노동의 성격이 짙습니다.

또한 이러한 이유로 아무런 기초 지식이 없더라도 관련된 팁만 보고 손쉽게 윈도우의 부팅을 구성하는 것도 가능해 집니다. 다만 그러한 분들은 또 다른 문제가 주어졌을 때 그것을 해결할 기초적인 지식이 없기 때문에 앞으로 나아가는 것은 좀 힘들겠죠? 뭐... 저도 사실 따지고 보면 그렇게 많이 아는 것은 아니지만요. ^^;;

아무튼 이러한 부팅 항목들은 Bootmgr 부트 매니저를 통한 부팅의 핵심이라고 할 수 있습니다. 무언가의 부팅을 위해선 이러한 부팅 항목이 반드시 필요하다는 것! 일단 이걸 잊지 마세요.



3. Windows 부팅 관리자(Windows Boot Manager)

위에서도 이야기 했지만 BCD 저장소에서 하나의 부팅 항목은 쉽게 하나의 윈도우(부트 로더)라고 생각할 수 있습니다. 이러한 부팅 항목들이 모여 부팅을 이루고 멀티 부팅을 구성하는 것입니다. 그렇다면 이렇게 부팅 항목들만 존재하면 모든게 만사 OK 일까요? 부팅 항목만 있으면 부팅은 알아서 자동으로 이루어질까요?

아니죠. 부팅 항목들이 있다면 이러한 부팅 항목들을 체계적으로 정리하여 관리해 줄 관리자 항목도 필요합니다.

즉, 하나가 아닌 다수의 부팅 항목들이 존재한다면 사용자에게 현재 존재하는 부팅 항목들 중 실제로 사용할 녀석들만 추려서 확인할 수 있게 목록으로 표시도 해 주어야 할테고, 목록을 표시해 준다면 얼마의 시간 동안 표시해 줄 것인지, 또 많은 부팅 항목들 중 어떤 것을 기본으로 부팅을 진행할지 등을 미리 결정해야 하고 이걸 사용자가 알 수 있게 화면에 표시해주어야 합니다.

이와 같이 BCD 에는 BCD 내의 부팅 항목들을 종합하여 체계적으로 정리하고 관리하며 사용자와 연결해주는 역할을 하는 특별한 항목이 있는데 그것이 바로 Windows 부팅 관리자(Windows Boot Manager) 항목입니다. 그런데 이름도 그렇고 하는 일도 그렇고... 부팅을 총괄하여 관리한다? 이거 Bootmgr 부트 매니저에 대한 설명과 동일하네요?

맞습니다. 사실 Windows 부팅 관리자 항목은 Bootmgr 부트 매니저에 대한 자체적인 설정입니다. 즉, Bootmgr 부트 매니저도 자신의 설정을 BCD 안에서 설정하고 관리하는 것이죠. 간단하죠?



아무튼 이러한 Windows 부팅 관리자 항목은 평상시에는 드러나지 않지만 멀티 부팅이 꾸며지면 비로소 우리가 확인을 할 수 있습니다. (그러니까 이게 Bootmgr 부트 매니저의 모습이라고 할 수 있습니다.)

제가 바로 Windows 부팅 관리자입니다.



이러한 Windows 부팅 관리자 항목은 아래와 같이 생겼습니다.



지금 당장은 뭔가 좀 복잡해 보이고 어지럽죠? 근데 사실 별거 없습니다. 이러한 Windows 부팅 관리자 항목의 각 요소(항목 옵션)들에 대한 설명은 차분히 하나씩 하게 될 것입니다.


이제 조금은 다른 관점에서 Windows 부팅 관리자 항목을 설명해 보겠습니다. BCD 내에서 개별적인 윈도우(부트 로더)의 부팅에 관한 설정들이 모여서 하나의 일반 부팅 항목을 이뤘죠. 이제 이렇게 만들어진 일반 부팅 항목들을 한 자리에 모아 놓고 사용자가 선택할 수 있도록 정리를 해주는게 Windows 부팅 관리자 항목인 겁니다. 이런 식으로 매우 단순화시켜 이해하셔도 큰 무리는 없습니다. ^^

클릭하면 좀 더 크게 보실 수 있어요. ^^*




참고로 Windows 부팅 관리자 항목의 실제 내용과 우리가 직접 눈으로 보게 되는 멀티 부팅 화면을 짝지어 정리해보면 아래와 같습니다.

참고로 파워 윈도우즈가 여깁니다. 근데 다시 봐도 이쁘게 잘 만들었네요. ^^; 클릭하시면 좀 더 크게 보실 수 있어요!



흐음... 대충 이렇게 급하게 마무리...



4. 일반 부팅 항목이 부팅에 사용되기 위해서는?

"모든 부팅 항목은 실제로 사용(부팅)되기 위해서는 반드시 Widnows 부팅 관리자 항목을 거쳐야 한다."


이게 무슨 말이냐면 BCD 에 부팅 항목이 존재하더라도 Widnwos 부팅 관리자 항목의 목록에 등록이 되어 있지 않으면 우리는 해당 부팅 항목을 선택할 수 없고, 고로 우리는 해당 부팅 항목으로는 부팅을 진행할 수 없다는 것입니다.

* 아시는 분들을 위해 첨언하자면 이 부분의 설명은 일단 Bootsequence 는 배제한 설명입니다. 근데 정확하게 따지고 보면 Bootsequence 도 Windows 부팅 관리자에 등록되는 거잖아요? 그러니까 Windows 부팅 관리자 항목을 거쳐야 한다는 전제는 맞는거죠.

이와 같이 Windows 부팅 관리자의 부팅 목록에 등록되지 않은 부팅 항목을 비활성 항목이라고 부릅니다. 반대로 등록이 되어 사용 가능한 상태의 항목은 활성(Active) 항목이라고 부르죠.


아무튼 그래서 우리가 어떠한 부팅 항목을 생성하고 이를 활용하고자 할 때는 반드시 아래의 과정대로 작업이 이루어집니다.

첫 째, 부팅 항목을 만들고 
둘 째, 만든 부팅 항목에 대한 설정을 모두 마친 후
셋 째, 해당 부팅 항목을 원하는 방식으로 Windows 부팅 관리자에 등록


부팅 항목 생성 -> 부팅 항목 옵션 설정 -> Windows 부팅 관리자에 부팅 항목 등록하여 활성


bcdedit /create {ntldr} /d "이전 버전의 윈도우들"
bcdedit /set device partition=c:
bcdedit /set path \ntldr

bcdedit /displayorder {ntldr} /addlast



즉, 마지막에 꼭 해당 부팅 항목을 활성하는 과정이 포함되는 것이죠. 명령은 그냥 예시로 넣어둔 것이니까 모르시는 분들은 파란 박스 부분은 크게 개의치 마시고 노란 박스와 녹색 박스의 이런 작업 구조를 통해 부팅 항목을 생성하고 실제로 사용할 수 있게 등록(활성)한다는 그 전체적인 과정 자체를 이해를 하고 계시길 바랍니다.
 
[생성 -> 설정 -> 활성] 이게 부팅 항목 추가의 기본 단계입니다. 요거 매우 중요합니다. 잊지 마세요.



5. Boot.ini 와 BCD 저장소의 비교

이건 덤으로 올려드리는 겁니다. 만약 이 글을 읽고 있는 여러분이 NTLDR 의 Boot.ini 를 빠삭하게 알고 있다면 Boot.ini 의 구조와 BCD 저장소의 구조를 직접 비교해보는게 이해가 빠를테니까요.

출처 - 마이크로소프트 MSDN 문서. 클릭하면 커져요!



대충 이와 같습니다. 대략적인 그림이 나오시죠? 다음으로 넘어가죠.




BCD 의 편집 도구

이러한 BCD 저장소(파일)은 앞에서도 이야기 했다시피 텍스트 기반이 아닌 데이터베이스 기반의 파일이기 때문에 메모장과 같은 통상의 텍스트 에디터로는 편집이 불가능해졌습니다. BCD 저장소의 데이터베이스의 구조에 맞게 편집을 지원하는 전문적인 도구가 필요하게 되었고, 이를 담당하는 것이 바로 윈도우 비스타부터 기본으로 포함된 명령줄 도구인 BCDEdit.exe 입니다.



여기에서 명령줄 도구란 것은 도스 시절과 같이 명령 프롬프트에서 명령을 하나 하나 입력해야 하는 녀석이라는 걸 의미합니다. 그래서 초보분들이 접근하기엔 사실 조금 어렵긴 합니다.


그렇다고 마이크로소프트가 이렇게 BCDEdit.exe 라는 어려운 도구만 내놓고 넋놓고 있진 않았습니다. 이미 만들어진 부팅 항목들에 대한 설정이나 단순한 작업들은 GUI 로 처리할 수 있도록 도구들을 준비해 두었죠.

Windows Key + Pause(시스템) -> 고급 시스템 설정 -> 시작 및 복구의 설정




Windows Key + R(실행) -> msconfig -> 부팅




이와 같이 간단한 작업들은 편하게 GUI 로 진행할 수 있도록 시스템 도구들이 준비되어 있습니다. 하지만! 이러한 것들은 보조적인 의미의 도구들이기 때문에 부팅 항목을 새로 생성하는 류의 작업은 불가능하며 좀 더 세세한 설정도 BCDEdit.exe 에 비해 기능이 많이 약합니다. 그래서 결국 원하는 모든 작업을 진행하려면 BCDEdit.exe 가 필요합니다.


추가적으로 마이크로소프트 뿐만 아니라 여타의 회사들도 접근이 어려운 BCDEdit.exe 를 좀 더 쉬운 GUI 인터페이스로 사용할 수 있게 도구를 만들기도 했습니다. 대표적인게 NeoSmart Technologies 사의 EasyBCD 이죠.



그런데 이러한 써드 파티의 도구들도 GUI 로 만들어졌지만 사실은 내부적으로는 BCDEdit.exe 를 활용하여 작업하는 것입니다.(고스트가 어렵다보니 제가 마우스로 작업할 수 있는 GARS 라는 툴을 만든 것처럼 말이죠.) GUI 로 만들어둬서 일부 작업에선 확실히 편하긴 하지만 여전히 그 속내를 모르면 어려운 건 마찬가지라고 할 수 있죠. 이게 정확하게 뭘 의미하는지는 알아야 쓸 수 있을거 아니에요?

그렇다면 그러한 내용은 어디에서 알 수 있느냐? BCDEdit.exe 를 통해 하나 하나 배우다보면 알 수 있죠. 그래서 이러한 툴은 일단 BCDEdit.exe 를 마스터하고 나서 나중에 이제 일부 작업들을 좀 더 편하게 하고자 할 때 활용하는 것이 좋습니다.


결국... 기본은 BCDEdit.exe 입니다. Bootmgr 부트 매니저에 대해서 배우고 BCD 를 편집하는 것은 일단 BCDEdit.exe 를 거치지 않고는 생각할 수가 없는 것이죠.(위에서 잠시 이야기가 나온 EasyBCD 도 내부적으로는 BCDEdit.exe 를 사용합니다. 설치 해놓고 프로그램 폴더에 가보세요. BCDEdit.exe 파일이 있을 걸요?)

그러니 일단 처음에 배울 때는 BCDEdit.exe 로 배우시는게 좋습니다. 그래서 앞으로 진행되는 저의 거의 모든 강좌도 BCDEdit.exe 를 중점으로 설명하게 될 것이구요. 뭐 일단 이건 그렇게 알아두시면 될 듯 합니다.

이제 이러한 기본적인 BCDEdit.exe 를 통한 설정을 모두 배우고 이해를 마쳤다면 그 후 부터는 써드 파티 프로그램을 사용하든 제가 만들었던 것과 같은 PowerBCDEditor 의 배치 파일 류의 도구를 사용하든 무엇을 사용하든 상관이 없는 것이죠. 오히려 그 때가 되어서도 무조건 BCDEdit.exe 만 사용하라고 제가 강요한다면 그건 제가 미친 놈인거죠.


음... 그럼 윈도우에는 이와 같이 부팅을 관리하는 도구로 BCDEdit.exe 만 있느냐? 그건 아니죠. 이제 여기에 추가적으로 (본연의 기능보다는 다른 용도로 더 많이 쓰이지만) Bootmgr 부트 매니저를 재설정하는 도구인 BCDBoot.exe 가 있고, 윈도우의 부팅과 뗄레야 뗄 수 없는 관계인 부트 섹터와 MBR 을 관리하는 도구인 Bootsect.exe 가 있습니다.

* BCDBoot.exe 는 윈도우 7 부터 기본 포함되어 있고, Bootsect.exe 는 윈도우 설치 DVD 에 포함되어 있습니다.

윈도우 7 부터 기본 포함된 BCDBoot 도구


윈도우 설치 DVD 에 포함된 Bootsect 도구



BCDEdit.exe, BCDBoot.exe, Bootsect.exe 이 세 가지 도구를 통해 윈도우의 부팅과 관련된 거의 모든 것을 관리할 수 있습니다. 아무튼 따로 기억해두시지 않아도 앞으로 많이 보게 될 겁니다. ^^ 참고로 이 세 도구는 구성 요소만 제대로 갖춰주면 윈도우 XP, 윈도우 비스타, 윈도우 7 에서 가리지 않고 사용할 수 있습니다.



준비한 내용은 여기까지이며 다음 글에서는 이어서 BCD 에서 빼 놓을 수 없는 GUID 식별자와 BCDEdit.exe 의 잘 알려진 식별자에 대해서 마저 이야기를 하도록 하겠습니다. 여기까지 입니다. ^^


참고 자료


2012년 02월 13일 14시 30분 수정 됨 - 일부 오류와 잘못된 설명을 수정하였으며 글의 주제와 상관없는 부분은 삭제하였습니다.