이 글에서 다룰 주제인 'Windows 7 물리 디스크 부팅'이라는 특대형 삽질의 시초는 약 4년 전으로 거슬러 올라갑니다... 그 즈음 썼던 글: https://tuwlab.com/161
(글 ID가 161밖에 안 되는 것으로 보아, 홈페이지를 오픈하고 얼마 안 된 시기에 포스팅에 재미를 붙여가던 때 쓰던 글이었던것 같습니다. 심리즈 모드에 관해서 설명하고 있네요.ㅎㅎ)
당시 저는 Ubuntu에 익숙해지기 위해 여러 가지 다양한 시도들을 해 보고 있었습니다. 윈도우가 아닌 리눅스에 처음으로 서버를 구축하고 운영을 막 시작하려던 시기였고, 지금 보고계신 이 홈페이지도 그 부산물 중 하나입니다. 이 글에서 집중적으로 다룰 VirtualBox를 이용해서 Hypervisor가 리눅스인 환경에서 Windows 7을 Guest OS로 부팅시켜서 실용적인 목적으로 활용하려는 시도도 이 때부터 이루어졌습니다.
보통 가상머신을 실험용이 아닌 실용적인 목적으로 사용하는 경우, Hypervisor가 Windows이고 Guest OS가 리눅스인 경우가 많습니다. 특히 컴퓨터공학을 전공하는 경우 리눅스 환경에서만 할 수 있는 작업을 해야 하는 경우가 종종 있는데, 이럴 경우 가상머신에 리눅스를 올려서 사용하면 번거로운 파티션작업이나 듀얼부팅 환경 구축을 하지 않아도 되므로 요긴합니다.
듀얼부팅 방식의 문제점
Windows와 Linux를 모두 사용해야 하는 경우, 디스크의 서로 다른 파티션에 각각 설치해서 부팅시에 OS를 선택해서 부팅하는 듀얼부팅 방식을 주로 많이 사용합니다. 하지만, 이 경우 OS를 전환하기 위해서는 PC를 재부팅 해야 하는 불편함을 감수해야 합니다. 이로 인해서 작업 흐름의 단절이 발생하고, OS간 정보 공유(e.g. 클립보드)가 원활하게 이루어지지 않는 문제정이 있습니다.
듀얼부팅의 이러한 근본적인 불편함 때문에 한때는 '앞으로 리눅스만 쓰면서 살아보자'는 굳은 다짐을 하고 리눅스만 설치해서 리눅스의, 리눅스에 의한, 리눅스를 위한 컴퓨팅을 꿈꾸기도 했지만 얼마 지나지 않아서 다시 윈도우를 설치하고 있는 본인을 발견하게 됩니다. [...]
아무래도 우리나라 환경에서 리눅스 전용을 고집하는것은 여전히 시기상조인 것으로 보입니다. 대표적인 원인으로 아직도 사라지지 않은 암덩어리 ActiveX가 버젓이 활개를 치고 있고, 주류로 사용하는 워드프로세서(한글, 워드 등)나 전문 설계 프로그램(OrCAD, PSpice, AutoCAD 등)은 Windows 전용으로 개발되는 경우가 태반입니다.
그렇다고 평소 하는 작업들의 특성상 Windows만 사용을 할 수가 없어서 저는 딜레마에 빠졌습니다. 워드프로세서나 설계 프로그램, (+게임)과 같은 작업은 Windows에서만 할 수 있는 반면, 선호하는 개발 환경으로는 콘솔 환경에서 다양한 작업을 처리할 수 있는 리눅스를 선호했기 때문입니다.
물리 디스크 부팅
저도 처음에는 실험적인 목적으로 리눅스 환경에서 가상머신 위에 Windows 7을 올려서 사용했으나, 점차 실용적인 목적으로 사용하면서 원하는 바가 점점 많아졌습니다. 그 중 하나가 바로 '물리 디스크 부팅'입니다. 물리 디스크 부팅은 실제 디스크에 존재하는 파티션을 가상머신에서 부팅시키는 기법으로, 디스크 이미지 파일을 이용해 부팅을 하는 방식과 비교하여 세팅 절차부터 다르고 좀 더 복잡합니다.
제가 주로 사용하는 가상화 소프트웨어는 VirtualBox인데, 여기에서는 고급 사용자 옵션으로 실제 디스크 파티션을 참조하는 디스크 이미지를 생성하는 기능을 제공합니다. 이 디스크 파일은 실제 디스크 파티션과 가상머신을 연결하는 어댑터 역할을 하며, 이를 가상머신에 붙여서 부팅을 하면 바로 물리 디스크 부팅이 되는 것입니다. (VMWare에서도 역시 같은 기능을 제공하고 있습니다.)
뒤에서 살펴보겠지만, 이런 특수 디스크 이미지 파일을 생성하려면 GUI Interface가 아닌, 콘솔에서 특수한 명령어(createrawvmdk)를 사용해야 합니다. 이렇게 절차가 다소 복잡한 이유는 이 기능이 고급 사용자 옵션이기 때문입니다.
가상머신이 실제 디스크 파티션을 참조해서 구동되기 때문에 일반 디스크 이미지를 사용할 경우와 비교하여 좀 더 주의해야 합니다. 일반 디스크 이미지로 부팅한 가상머신은 아무리 잘못 동작해도 결국 하나의 파일에 불과한 디스크 이미지에만 영향을 줍니다. 반면, 물리 디스크로 부팅한 가상머신을 잘못 조작하면 실제 디스크 파티션이 손상될 수 있고, 심각한 경우 Hypervisor의 Crash까지도 초래할 수 있습니다.
따라서, 물리 디스크로 부팅한 가상머신은 가상머신이 아니라 실제 머신이라고 생각하고 사용해야 불상사를 방지할 수 있습니다. 예를 들어, 컴퓨터 전원을 끄기 전에 가상머신 먼저 정상적으로 완전히 종료시켜야 합니다. 비슷한 이유로 저는 물리 디스크로 부팅한 가상머신에 대해 Suspend 기능도 사용하지 않고 있습니다. Suspend 이후 VirtualBox를 종료하면 물리 디스크가 Hypervisor에 반환되는데, 이후 물리 디스크에 쓰기 동작이 발생할 경우 Resume시에 데이터의 불일치로 인해 문제가 발생할 수 있기 때문입니다. (예: PC를 완전히 종료 후 가상머신에서 사용했던 파티션으로 Native Booting을 시도하는 경우)
왜 물리 디스크 부팅이 필요한가?
아마 제가 리눅스로 부팅한 뒤, 가상 디스크 이미지에 설치한 Windows를 가상머신으로 사용하는 것에 아무런 문제를 느끼지 못했다면 예초에 물리 디스크 부팅에 그렇게 집착하지는 않았을 것입니다.
가상 디스크 이미지 부팅으로 그동안 쭉 잘 써 오다가, 문득 가상머신으로 부팅하는 Windows를 경우에 따라 Native 부팅도 할 수 있었으면 좋겠다는 생각이 들었습니다.
경우에 따라서 재부팅과 작업 흐름의 단절을 감수하더라도 Guest OS인 Windows가 전체 시스템 자원을 사용하도록 Native 부팅할 필요가 생긴 것입니다. Guest OS에서 고성능 처리가 필요한 시뮬레이션이나 합성을 해야 하거나, 가상머신 환경과 충돌이 발생하는 일부 프로그램(esp. 은행 보안 프로그램), 또는 게임을 고성능으로 즐기고 싶을 때(^^) 등을 예로 들 수 있습니다.
오늘날 가상화 소프트웨어가 많이 좋아졌고 CPU에서도 본격 가상화를 위한 H/W적 장치들을 지원하기 시작했지만(Intel VT-x, AMD-v 등), Guest OS의 입장에서 Hypervisor가 성능의 병목으로 작용하는 현상은 근본적으로 피할 수 없는 현상입니다. 즉, 아무리 최적화를 잘 해도 Guest OS가 시스템의 전체 자원을 사용하도록 할 수는 없습니다.
요약하면, Guest OS를 가상머신 부팅과 Native 부팅 모두 가능하게 할 필요가 있었습니다.
그냥 시도해보기, 그리고 실패
다음 명령어를 사용하면 물리 디스크 파티션을 참조하는 디스크 이미지를 만들 수 있습니다.
VBoxManage internalcommands createrawvmdk \ -filename ./Windows7-RawDisk.vmdk \ -rawdisk /dev/sda \ -partitions 1,2 -relative
위 명령을 실행하면 /dev/sda 디스크의 1, 2번 파티션을 참조하는 디스크 이미지가 생성되며, 이를 VirtualBox의 가상머신의 Storage에 등록해서 물리 디스크 부팅을 할 수 있습니다.
문제는 디스크 생성 과정이 이렇게 간단한 반면, 가상머신 부팅을 온전하게 성공시키기 위해서는 약간 귀찮은 과정을 거쳐야 한다는 점입니다.
좀 더 정확히 말하면, Windows 7이 설치된 파티션을 가상머신으로 부팅하려고 할 때 문제가 발생합니다. 반면, 리눅스를 물리 디스크 부팅하는 경우 별다른 문제가 발생하지 않습니다.
▲ Windows 7 가상머신 물리 디스크 부팅에 실패한 아름다운 상황
지금이야, 결국 성공해서 이렇게 가볍게 포스팅을 하고 있지만, 방법을 찾아다니며 이런저런 민간요법(?)을 하나하나 시도해 볼 때는 답답해서 미칠지경이었습니다. [...]
근본적인 원인은 '세상에 운영체제는 Windows밖에 없어!'라는 철학을 바탕으로 제품을 개발하는 M$의 문제가 크다고 봅니다. Windows를 재설치하는 과정이나 일부 업데이트 과정에서 기껏 듀얼부팅으로 잘 세팅해 놓은 Grub을 심심치않게 날려먹는 경우만 봐도 말이죠.
이번에도 또 서론이 길어졌는데, 이어지는 다음 글에서 본격적으로 Windows 7이 설치된 물리 파티션을 가상 머신 부팅과 Native Booting이 모두 가능하게 하는 방법을 다루도록 하겠습니다.