이번 글에서는 이전 글에 이어서, 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가 발생합니다.
▲ MBR에 기록된 Unique ID의 불일치로 인해 발생하는 Crash
가상 디스크에 Fake MBR을 이식하는 방법으로 이 문제를 해결할 수 있습니다. 물리 디스크의 MBR을 그대로 연결해서 FixMbr을 해도 되지만, 그럴 경우 Native 부팅이 불가능해집니다. 이 Fake MBR은 가상머신에서 부팅할 경우에만 사용되므로 Native 부팅에는 전혀 영향을 주지 않습니다.
요약하면, Fake MBR을 사용함으로써 가상머신 부팅과 Native 부팅이 모두 가능해지는 것입니다.
▲ 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에 등록합니다.
▲ 가상 디스크 등록
MBR 복구
가상 디스크에 이식한 Fake MBR에는 아직 아무런 정보도 기록되어 있지 않은 상태입니다. Windows 7의 설치 패키지에 포함된 fixmbr을 이용하여 Fake MBR에 가상 머신의 환경에 부합하는 정보를 입력할 수 있습니다.
가상머신의 CD/DVD 드라이브에 Windows 7 설치 ISO 파일을 집어넣고 설치 화면으로 진입합니다. 설치 초기 메뉴화면이 나타나면 [Shift]+[F10]을 눌러서 CMD창을 띄우고 다음과 같이 입력합니다.
bootrec /FixMbr
▲ 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
레지스트리 편집기에서 HKEY_LOCAL_MACHINE\Computer_System\MountedDevices로 찾아 들어갑니다.
오른쪽 목록을 잘 살펴보면 \DosDevices\C: 항목이 있는데, 이 항목의 데이터값 앞 4Byte(8자리)를 기억해 두도록 합니다. 이 4자리가 바로 MBR에 등록되는 디스크 고유 식별자입니다.
▲ 디스크 고유 식별자 확인
이제 다시 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
이제 가상머신을 재부팅하면...
▲ 두근두근...
여담이지만, 이젠 어떤 컴퓨터에서라도 Windows 7을 부팅할 때 이 Booting Logo Show에서 항상 긴장을 하게 되었습니다...
▲ Windows 7 물리 디스크 부팅 성공!
이렇게 부팅이 완료되면 성공입니다. (Aㅏ... 이 화면을 보기 위해 얼마나 많은 시간과 곶통과 노력이!!ㅠㅠ)
만약 위에서 본 파란 화면의 Crash가 또다시 발생한다면, 위에서 소개한 절차를 다시 한 번 잘 밟아보시기 바랍니다. MBR도 제대로 고쳤고, 디스크 고유 식별자도 잘 입력했다면, 중단해야 될 서비스가 더 남아있는 경우입니다. 위에서 제시한 4개의 서비스 목록은 제가 지금까지 찾아서 나열한 것이고, 메인보드에 내장된 하드웨어에 따라 중단해야 될 서비스가 더 있을수도 있습니다.