Skip to content
TUWLAB.com
모든 게시물에 대하여 '링크'
방식의 퍼가기만 허용합니다.
한양대학교 전자통신컴퓨터공학부
바라미
  • 16
  • 2717854
DNS Powered by DNSEver.com
Linux

[VirtualBox] Windows 7 물리 디스크 부팅 (Raw Disk Booting or Native Booting) - 방법

Posted 2015. 05. 30 Updated 2017. 06. 14 Views 3510 Replies 1
Atachment
첨부

이번 글에서는 이전 글에 이어서, VirtualBox에서 Windows 7이 설치된 파티션을 가상머신으로 부팅하는 방법에 대해 본격적으로 다루도록 하겠습니다.

'Windows 7 물리 디스크 부팅'이 뭥미? 하시는 분은 바로 이전 글을 먼저 보고 오시면 됩니다.ㅎㅎ

 

가상 머신 생성

VirtualBox를 root 권한으로 실행하고, Windows 7용 가상머신을 생성합니다.

VirtualBox를 root 권한으로 실행할 때 어려움을 겪는 분들이 종종 있는데, 터미널을 열고 다음과 같이 입력하면VirtualBox를 실행한 뒤에 터미널을 닫을 수 있습니다.

sudo virtualbox
[Ctrl]+[Z]
bg

[Ctrl]+[Z]는 실행취소가 아니라 현재 쉘의 Foreground에서 실행중인 프로세스를 일시정지하는 단축키입니다. fg 명령어 대신 단축키를 쓰는 이유는 sudo virtualbox를 실행하면 쉘이 반환되지 않기 때문입니다. (반면, 끝에 &을 붙여서 최초에 Background Process로 실행하면 패스워드를 입력할 수 없게 됩니다.) 마지막으로 bg를 입력하면 일시정지한 프로세스를 Background로 돌려서 실행하기 시작합니다.

VirtualBox를 root 권한으로 실행해야 하는 이유는 물리 디스크에 직접 접근하려면 root 권한이 필요하기 때문입니다. 보안 등의 문제로 인해 root 권한으로 실행하는 것이 꺼려진다면, disk 그룹에 사용자 계정을 추가하는 등의 방법을 사용해도 됩니다. 하지만 USB 장치를 사용하는 등의 상황에서 원인 불명의(?) 자잘하고 귀찮은 문제들이 많이 발생할 수 있으므로 예초에 root 권한으로 실행하는 편이 좋습니다.

Windows 7용 가상머신을 생성하는 방법은 https://tuwlab.com/110 에 자세히 설명이 되어 있으니, 이곳을 참조해서 가상머신을 생성하도록 합니다.

 

물리 파티션을 참조하는 가상 디스크 생성

물리 디스크에 존재하는 파티션들을 조립해서 가상머신에서 사용하기 위한 디스크 이미지를 만들어야 합니다. 이 글에서는 Windows 7이 리눅스와는 다른 디스크의 첫 번째 파티션에 설치되어 있는 상황을 예시로 들어 설명합니다.

Windows 7을 한 디스크를 온전히 사용하도록 설치한 경우 100MB 크기의 첫 번째 파티션은 시스템 예약 영역이 되고, 두 번째 파티션이 실제 파일들이 설치되는 C드라이브가 됩니다. 따라서, Windows 7 디스크 이미지에는 최소 이 두개 파티션이 포함되어 있어야 합니다.

2개 파티션을 포함하는 것 외에 중요한 작업이 또 필요한데, 바로 MBR(Master Boot Record)을 이식하는 작업입니다. 디스크의 첫 2048 Byte 영역은 MBR 영역으로 예약되어 있으며, 여기에는 부팅에 관련된 정보가 기록되어 있습니다.

여기서 MBR을 물리 디스크에서 가져오지 않고 Fake MBR로 대체하는 이유는 Windows 7의 독특한 부팅 방법 때문입니다. Windows 7은 설치 과정에서 MBR에 디스크 고유 식별자(Unique ID)를 기록해 두고, 부팅 과정에서 이 식별자를 참조해서 올바른 부트 파티션을 찾아갑니다.

물리 디스크의 파티션들을 모아서 생성한 가상 디스크는 이 고유 식별자가 물리 디스크의 고유 식별자와 달라지는데, 이로 인해 부팅이 올바르게 이루어지지 않는 것입니다. FakeMBR을 이식하지 않은 상태에서 Windows 7 물리 디스크 부팅을 시도하면 Booting Logo Show 직후에 다음과 같은 화면과 함께 Crash가 발생합니다.

Windows 7 Boot Crash.png
▲ MBR에 기록된 Unique ID의 불일치로 인해 발생하는 Crash

가상 디스크에 Fake MBR을 이식하는 방법으로 이 문제를 해결할 수 있습니다. 물리 디스크의 MBR을 그대로 연결해서 FixMbr을 해도 되지만, 그럴 경우 Native 부팅이 불가능해집니다. 이 Fake MBR은 가상머신에서 부팅할 경우에만 사용되므로 Native 부팅에는 전혀 영향을 주지 않습니다.

요약하면, Fake MBR을 사용함으로써 가상머신 부팅과 Native 부팅이 모두 가능해지는 것입니다.

Fake MBR.png
▲ Fake MBR 이식 개념도

 

Fake MBR 생성

sudo apt-get install mbr
install-mbr -e12 --force ./fakembr.mbr

-e12 옵션은 1, 2번 파티션을 사용하겠다는 의미입니다. 추가적으로 사용할 파티션이 있으면 이 옵션에 기재하도록 합니다.

 

가상 디스크 생성

다음 명령어를 입력해서 물리 디스크 파티션을 참조하는 디스크 이미지를 생성합니다.

VBoxManage internalcommands createrawvmdk \
-filename ./Windows7-RawDisk.vmdk
-rawdisk /dev/sdX \
-partitions {파티션 목록} \
-mbr {fakembr.mbr의 경로} -relative

예: /dev/sda의 1, 2번 파티션을 사용하려는 경우:

VBoxManage internalcommands createrawvmdk \
-filename ./Windows7-RawDisk.vmdk \
-rawdisk /dev/sda \
-partitions 1,2 \
-mbr ./fakembr.mbr -relative

생성한 가상 디스크를 가상머신의 Storage에 등록합니다.

Attach Virtual Disk.png
▲ 가상 디스크 등록

 

MBR 복구

가상 디스크에 이식한 Fake MBR에는 아직 아무런 정보도 기록되어 있지 않은 상태입니다. Windows 7의 설치 패키지에 포함된 fixmbr을 이용하여 Fake MBR에 가상 머신의 환경에 부합하는 정보를 입력할 수 있습니다.

가상머신의 CD/DVD 드라이브에 Windows 7 설치 ISO 파일을 집어넣고 설치 화면으로 진입합니다. 설치 초기 메뉴화면이 나타나면 [Shift]+[F10]을 눌러서 CMD창을 띄우고 다음과 같이 입력합니다.

bootrec /FixMbr

fixmbr.png
▲ FixMbr 실행 완료

 

디스크 고유 식별자 등록

FixMbr에서 귀찮은 작업을 모두 처리해 주면 좋겠지만, 그렇지 않습니다. (으으 M$...) 위에서 설명한 디스크 고유 식별자를 찾아서 수동으로 등록해 주어야 합니다.

CMD창에서 dir 명령을 이용하여 Windows 7이 설치되어 있는 파티션이 어느 드라이브에 마운트 되었는지 찾아냅니다. 목록에 Windows나 Users, Program Files 등이 보이면 바로 그 드라이브가 맞을 것입니다. 가상 디스크 파티션을 개성넘치게(?) 구성한 경우가 아니라면, 대개 D:\에 마운트 되어 있을 것입니다.

이제 다음 명령을 쳐서 레지스트리 정보를 로드하고 레지스트리 에디터를 실행합니다. (Guest Edition이 설치되지 않은 상태이므로 복붙이 동작하지 않습니다. 천천히 인내심을 갖고 명령을 입력하세요..^^)

reg load HKLM\Computer_System D:\Windows\system32\config\system
regedit

Load registery.png

레지스트리 편집기에서 HKEY_LOCAL_MACHINE\Computer_System\MountedDevices로 찾아 들어갑니다.

오른쪽 목록을 잘 살펴보면 \DosDevices\C: 항목이 있는데, 이 항목의 데이터값 앞 4Byte(8자리)를 기억해 두도록 합니다. 이 4자리가 바로 MBR에 등록되는 디스크 고유 식별자입니다.

Check disk unique ID.png
▲ 디스크 고유 식별자 확인

이제 다시 CMD창으로 돌아가서 diskpart를 이용해서 디스크 고유 식별자를 등록하도록 합니다.

이 때, Endian을 뒤집어서 Unique ID를 입력해야 합니다. 즉, 위에서 확인한 디스크 고유 식별자 8자리를 2개씩 묶어서 순서를 반전시키도록 합니다. 예를 들어, 위 그림과 같은 디스크 고유 식별자인 경우 다음과 같이 순서를 바꿔서 입력하면 됩니다. (공백은 입력하지 않습니다.)

ex) 823b0a74 → 740a3b82

diskpart
DISKPART> select disk 0
DISKPART> uniqueid disk id={Endian 반전된 디스크 고유 식별자}
DISKPART> exit

 

존재하지 않는 하드웨어 장치들에 대한 서비스 시작 방지

다시 레지스트리 편집기로 돌아와서 다음 항목들을 모두 0으로 바꿔줍니다.

이 서비스들을 공통적으로 가상머신에서 지원하지 않는 하드웨어 장치의 드라이버를 로드하려고 시도하는데, 부팅과정에서 이들 서비스가 시작되지 않도록 설정해줘야 올바르게 부팅이 됩니다.

  • HKEY_LOCAL_MACHINE\Computer_System\ControlSet001\services\msahci\start
  • HKEY_LOCAL_MACHINE\Computer_System\ControlSet001\services\atapi\Start
  • HKEY_LOCAL_MACHINE\Computer_System\ControlSet001\services\intelide\Start
  • HKEY_LOCAL_MACHINE\Computer_System\ControlSet001\services\pciide\Start

 

여기까지 모두 마쳤으면 다음 명령어를 입력하여 레지스트리를 Unload합니다.

reg unload HKLM\Computer_System

 

이제 가상머신을 재부팅하면...

Boot Logo Show.png
▲ 두근두근...

여담이지만, 이젠 어떤 컴퓨터에서라도 Windows 7을 부팅할 때 이 Booting Logo Show에서 항상 긴장을 하게 되었습니다...

Boot Succeed.png
▲ Windows 7 물리 디스크 부팅 성공!

이렇게 부팅이 완료되면 성공입니다. (Aㅏ... 이 화면을 보기 위해 얼마나 많은 시간과 곶통과 노력이!!ㅠㅠ)

만약 위에서 본 파란 화면의 Crash가 또다시 발생한다면, 위에서 소개한 절차를 다시 한 번 잘 밟아보시기 바랍니다. MBR도 제대로 고쳤고, 디스크 고유 식별자도 잘 입력했다면, 중단해야 될 서비스가 더 남아있는 경우입니다. 위에서 제시한 4개의 서비스 목록은 제가 지금까지 찾아서 나열한 것이고, 메인보드에 내장된 하드웨어에 따라 중단해야 될 서비스가 더 있을수도 있습니다.

 

서비스 선택
이용중인 SNS 버튼을 클릭하여 로그인 해주세요.
SNS 계정을 통해 로그인하면 회원가입 없이 댓글을 남길 수 있습니다.
댓글
?
Powered by SocialXE


List of Articles
번호 분류 제목 글쓴이 최근 수정일 조회 수
161 Python [Django Tutorial] 6. Database 연동하기 - Model설계, Migration file TUW 2017.06.16 30164
160 Python [Django Tutorial] 5. Static 파일 사용하고 관리하기 file TUW 2017.06.16 9272
159 Python [Django Tutorial] 4. URL Config, Template 및 View의 동작에 대한 이해 file TUW 2017.06.16 9211
158 Python [Django Tutorial] 3. 프로젝트 및 App 생성, settings.py수정(DB연동, Migration), Runserver file TUW 2017.06.14 12320
157 Python [Django Tutorial] 2. 개발 환경 세팅하기 - pyenv 및 virtualenv 활용 TUW 2017.02.26 6609
156 Python [Django Tutorial] 1. 파이썬 기반 웹 프레임워크 Django에 대한 소개 2 TUW 2017.02.26 10946
155 Python VirtualEnv를 통한 Python Sandbox 개발환경 구축하기 file TUW 2017.06.02 4434
154 Python pyenv를 이용하여 여러 버전의 Python 동시에 사용하기 3 TUW 2016.07.12 14711
153 Linux 한글 입력기 나비(Nabi)에서 한/영 키가 인식되지 않는 경우 file TUW 2017.06.02 2694
152 Linux [VirtualBox] 가상머신 Windows 7 에서 Aero 기능 활성화하기 file TUW 2017.06.02 3799
» Linux [VirtualBox] Windows 7 물리 디스크 부팅 (Raw Disk Booting or Native Booting) - 방법 1 file TUW 2017.06.14 3510
150 Linux [VirtualBox] Windows 7 물리 디스크 부팅 (Raw Disk Booting or Native Booting) - 배경 file TUW 2017.06.02 5967
149 일반 [GIT] Submodule (Nested Repository) 사용하기 file TUW 2020.08.28 11532
148 Linux [Linux] Screen 터미널 에뮬레이션 프로그램 사용하기 TUW 2015.08.19 3321
147 일반 정규식(Regular Expression)에 대한 소개와 입문, 튜토리얼 1 file TUW 2017.12.11 36610
146 Linux Intelli Backup: File system 및 Database 백업 자동화 Bash 스크립트 TUW 2017.06.14 3537
목록
Board Pagination Prev 1 2 3 4 5 6 7 ... 13 Next
/ 13

Powered by Xpress Engine / Designed by Sketchbook

sketchbook5, 스케치북5

sketchbook5, 스케치북5