ㅈㅅㄹ

예전에 VMWare를 사용할 때는 실제 물리 디스크를 가상머신에서 사용할 수 있어서 아주 유용하게 써먹었었는데, VirtualBox에서는 지원하지 않는 것 같아 아쉬운 마음이 있었다. 그러나 VirtualBox에서도 물리 디스크 실제로 지원하고 있으며 다만 메뉴에서 간단하게 사용할 수 있는 것이 아닐 뿐이다. 메뉴에서 쉽게 클릭하면서 할 수 있는 게 아닌만큼 사용에 주의를 요하며, 아래쪽에 설명하는 항목들이 대충이라도 무슨 말인지 모르겠다면 따라하는 것을 삼가는 편이 좋다. 여기서는 Ubuntu host에서 다른 파티션에 깔려 있는 Windows guest를 사용하는 방법에 대해서 설명한다.


우선, fdisk 명령어로 디스크 파티션 환경을 확인하자. 내 경우는 /dev/sda2에 Windows 7이 깔려 있고 /dev/sda3이 Windows에서 사용하는 데이터 저장용 디스크이다. /dev/sda1은 왜 굳이 만드는 지 모르겠는 시스템 예약 파티션이다.

$ sudo fdisk /dev/sda

Welcome to fdisk (util-linux 2.26.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p
Disk /dev/sda: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0xf3719153

Device     Boot     Start       End   Sectors   Size Id Type
/dev/sda1  *         2048    206847    204800   100M  7 HPFS/NTFS/exFAT
/dev/sda2          206848 208728063 208521216  99.4G  7 HPFS/NTFS/exFAT
/dev/sda3       208728064 577368063 368640000 175.8G  7 HPFS/NTFS/exFAT
/dev/sda4       577368064 976773167 399405104 190.5G  5 Extended
/dev/sda5       641370112 944773119 303403008 144.7G 83 Linux
/dev/sda6       577370112 641370111  64000000  30.5G 83 Linux
/dev/sda7       944775168 976773167  31998000  15.3G 82 Linux swap / Solaris

Partition table entries are not in disk order.

VirtualBox에서 실제 디스크에 접근해서 사용하기 위해서는 해당 디스크 드라이버에 접근 권한이 있어야 한다. 가상머신 자체를 매번 root 권한으로 실행할 수는 없으니, 자신의 계정을 disk 그룹에 추가하자. 추가하는 방법은 고전적으로 /etc/group파일을 직접 수정해서 해도 좋고 아래의 명령어를 사용해도 좋다. group 수정 후 바로 정책이 적용 되지는 않으니 로그 아웃을 하든 리붓을 하든 재 로그인을 해줘야한다.

$ sudo usermod -a -G disk ysjang

이제 MBR 파일을 만들어 주어야 하는데, mbr 패키지의 install-mbr 명령어를 사용해서 MBR 파일을 만드는 방법도 있으나, 어차피 나중에 Windows Recovery를 사용해야 할 필요가 있으므로, 지금은 그냥 아래의 명령어로 2048 블럭 사이즈의 파일을 만들어서 쓰자.

$ dd if=/dev/zero of=boot.mbr count=2048
2048+0 records in
2048+0 records out
1048576 bytes (1.0 MB) copied, 0.0120378 s, 87.1 MB/s

이제 rawdisk를 가리키는 VMDK 파일을 생성해야 한다. 아래의 명령어로 생성할 수 있으며 -filename에는 생성할 VMDK 파일의 이름을, -partitions 옵션에는 사용할 파티션의 목록을, -mbr 옵션에는 아까 생성해 둔 boot.mbr 파일을 지정하자. -relative는 디스크 전체가 아닌 지정된 파티션만 접근이 가능하도록 하는 옵션으로 일종의 안정장치이다. 명령어 옵션에 관련한 자세한 사항은 VirtualBox 매뉴얼의 Advanced storage configuration 항목을 참조하자.

$ VBoxManage internalcommands createrawvmdk -filename win7.vmdk -rawdisk /dev/sda -partitions 1,2,3 -relative -mbr boot.mbr

주의할 점은, Windows가 설치된 파티션 이전의 모든 파티션을 추가해 주어야 한다는 점인데, 내 경우 두 번째 파티션에 Windows가 설치되어 있고 세 번째 파티션까지 사용해야하므로 1~3번 파티션을 추가하였다. 즉 Windows가 N번 파티션에 설치되어 있다면 1 ~ N-1번 파티션도 모두 리스트에 넣어 주어야 되는데, 이 이유에 대해서는 아래에서 설명하겠다.


이제 기존에 하던 것 처럼 Windows guest를 하나 작성하자. 절차는 별 다른 것 없지만, 기존 디스크를 사용하도록 해서 방금 만든 win7.vmdk을 사용하도록 해야 한다.


가상 머신의 디스크 선택


이후 부팅을 해보면 당연히 MBR이 제대로 되어 있지 않으므로 부팅이 제대로 되지 않을 것이다. 실제 Windows 설치 디스크나 설치 디스크 이미지를 가상 머신에 추가하여 설치 디스크로 부팅한 다음, 복구 모드로 들어가서 명령 프롬프트를 실행하자. 그 후 bootrec /FixMbr 명령어를 실행하면 MBR이 제대로 복구 될 것이다.


MBR 복구


그러나 MBR만 복구한다고 제대로 사용할 수 있는 것은 아니다. 실제로 MBR만을 복구한 채로 Windows를 재기동 해보면 Missing operating system이라는 오류를 내고 부팅이 제대로 되지 않을 것이다. 이는 Windows 부트로더가 disk signature를 통해 설치된 디스크를 인식하기 때문으로 이 signature 값이 달라져서 설치된 디스크를 제대로 찾지 못하는 것이다. 따라서 달라진 값을 가상 머신에서 바꿔주어야 하며 이를 위해 복구 모드의 명령 프롬프트가 필요한데, 어차피 MBR 복구를 위해 복구 모드로 진입했으니 리부팅 할 필요없이 계속 아래 절차를 진행하면 된다. 물론 아래 명령어를 실행하기 위해서는 복구모드 상태에서 어떤 드라이브 문자에 기존에 사용하던 Windows 파티션이 할당 되어 있는지 확인해야 한다. 내 경우는 D: 드라이브에 할당되어 있었다.


이제 아래의 명령어를 실행해야 하는 데, 위에서 말한 Windows가 설치되어 있는 경로를 인자로 주어야 한다. 내 경우는 D: 드라이브에 할당되어 있으므로 아래와 같이 지정한 것이고, 드라이브나 Windows의 설치 경로가 다를 경우 인자를 그에 맞춰 잘 넘겨 주어야 한다.

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

레지스트리 편집기에서 HKEY_LOCAL_MACHINE\Computer_System\MountedDevices 키 아래로 이동하여 \DosDrives\C: 값을 찾자. 이 값이 바로 각 드라이브의 파티션 정보를 저장해 놓은 값으로, 처음 4 바이트가 disk signature이고 이후에 그 디스크에서의 offset 값이 지정되어 있다. 앞서 말했듯이 굳이 사용하지 않는 파티션도 VMDK 생성시 추가한 이유가 이것으로, 만약 Windows가 설치된 파티션 이전의 파티션을 VMDK 생성시 빠뜨릴 경우 Offset 값이 맞지 않아서 제대로 부팅이 되지 않을 것이다.


Disk signature


다시 명령어 프롬프트로 돌아가서 아래의 명령어를 실행하여 disk의 uniqueid 값을 방금 확인한 disk signature로 바꿔 주어야 한다. 주의할 점은 레지스트리 편집기에서 확인한 값은 Little Endian이고, 명령어에 인자로 줄 ID 값은 Big Endian이라는 점으로, 레시스트리 편집기에서 53 91 71 F3이었으니 명령어 인자로는 F3719153을 주어야 한다.

diskpart
DISKPART> select disk 0
DISKPART> uniqueid disk id=F3719153
DISKPART> exit

레지스트리 편집기를 종료하고 아래의 명령어로 로딩해 놓은 레지스트리를 해제하자

reg unload HKLM\Computer_System

이제 다시 가상 머신을 재 기동하면 기존에 하드디스크에 설치해 놓은 Windows로 부팅 되는 것을 확인할 수 있을 것이다. 당연하겠지만 꼭 주의해야 할 사항은, 이런식으로 기존 하드디스크에 깔린 Windows를 사용하게 될 경우 가상 머신을 구동하고 있는 동안은 Host OS에서 mount 등을 통해 Guest OS, 즉 Windows 파일시스템에 접근하는 것을 절대 해서는 안된다는 것으로, 만약 이런식으로 사용하게 되면 파일 시스템이 깨져서 데이터가 날아가는 불상사가 일어날 수 있다. 꼭 유의하자.