문제 상황
Windows 8은 곧 지원이 종료될 예정이지만, 오히려 그렇기 때문에 가상 머신의 게스트 운영체제로 활용하는 매력은 더욱 커지고 있습니다. 이 글을 찾아오신 분이라면 아마 비슷한 상황에 처해 있을 것입니다. VirtualBox에서 64비트 Windows 8.x 계열 운영체제(Windows 8 또는 그 이상 버전)를 게스트로 부팅하려는데, 부팅 시작 후 몇 초 만에 실패하고 가상 머신을 강제로 종료해야 하는 경우입니다. 이때 표시되는 오류 코드가 바로 0x000000C4입니다.
이 글에서는 이 까다롭지만 흥미로운 문제를 우회하여 VirtualBox 안에 Windows 8.1을 게스트 운영체제로 설치하는 방법을 소개합니다. 더불어 그 배경에서 일어나는 기술적인 원리도 함께 살펴보겠습니다.
문제 진단
증상은 단순합니다. Windows 8.1 DVD 또는 ISO 이미지로 구성한 가상 머신을 부팅하면 잠시 후 화면에 다음과 같은 메시지가 나타납니다. VirtualBox 4.0 이상의 모든 버전에서 동일하게 발생합니다.
Please hold down the power button.
Error Code: 0x000000C4
Parameters:
...
"PC를 다시 시작해야 합니다. 전원 버튼을 길게 누르세요."라는 꽤 무서운 메시지죠. 게다가 해당 가상 머신의 VirtualBox 창을 닫고 다시 시도해도 결과는 완전히 똑같습니다. 그렇다면 어떻게 해야 할까요?
해결 방법
먼저 오류 메시지를 읽고 이해해야 합니다. Windows BSOD(블루스크린)에 어느 정도 익숙하다면 낯설지 않은 형태일 겁니다. 이것은 머신 명령어 예외(machine instruction exception)로, 운영체제가 허가되지 않은 명령을 수행하려 한다는 의미입니다. 원인을 파악했다면 해결은 어렵지 않습니다.
VirtualBox 포럼, 티켓 데이터베이스 및 각종 온라인 자료를 검색해 보면 이 오류에 대한 언급을 꽤 많이 찾을 수 있습니다. 결론부터 말하면 CMPXCHG16B 명령어가 비활성화되어 있는 것이 원인이며, 이를 활성화해야 합니다. Windows 8.1이 부팅하기 위해서는 이 명령어가 필수적입니다. 위키피디아의 설명을 인용하면 다음과 같습니다.
초기 AMD64 프로세서에는 CMPXCHG16B 명령어가 없었습니다. 이는 대부분의 80486 이후 프로세서에 탑재된 CMPXCHG8B 명령어의 확장형입니다. CMPXCHG8B와 마찬가지로 CMPXCHG16B는 16바이트(옥텟 워드) 단위의 원자적(atomic) 연산을 가능하게 합니다. 이는 포인터 크기보다 큰 데이터에 대해 compare-and-swap 연산을 수행하는 병렬 알고리즘, 특히 락 프리(lock-free)·웨이트 프리(wait-free) 알고리즘에서 매우 유용합니다. CMPXCHG16B가 없으면 임계 영역(critical section)이나 다른 락 프리 기법 등의 우회 방법을 사용해야 하며, 64비트 Windows가 8TB를 초과하는 사용자 모드 주소 공간을 갖는 것도 불가능해집니다. 64비트 Windows 8.1은 이 기능을 필수적으로 요구합니다.
가상화란 결국 '가상 하드웨어'를 만드는 기술입니다. 호스트 CPU의 기능 중 일부만 게스트에 노출되는데, VirtualBox는 기본적으로 CMPXCHG16B 명령어를 게스트에 노출하지 않도록 설계되어 있습니다. 바로 이것이 우리가 직면한 문제의 원인입니다. 따라서 이 명령어를 활성화해야 하며, VirtualBox의 명령줄 도구인 VBoxManage를 사용하면 됩니다.
"<VirtualBox 설치 경로>\\VBoxManage.exe" setextradata "<가상 머신 이름>" VBoxInternal/CPUM/CMPXCHG16B 1단, 이 명령이 성공적으로 적용되려면 호스트 시스템의 프로세서도 어느 정도 최신형이어야 합니다. 만약 CPU에 NX/XD 비트가 없거나 BIOS에서 비활성화되어 있다면, 먼저 호스트 쪽에서 이 문제를 해결해야 다음 단계로 진행할 수 있습니다. 경우에 따라서는 해결이 불가능할 수도 있습니다.
명령 실행 후에는 해당 명령어가 사용 가능해지며, Windows 8.1이 정상적으로 부팅됩니다. 이후에는 일반적인 절차대로 시스템을 설치하고 설정하면 됩니다.
마치며
여기까지입니다. 생각보다 분량이 길었나요? Oracle 티켓 데이터베이스 링크 하나만 남길 수도 있었지만, 그것은 본질을 놓치는 일입니다. 문제를 제대로 이해하지 못한 채 검증되지 않은, 때로는 위험할 수 있는 명령을 맹목적으로 실행해서는 안 됩니다. 사실 이 명령은 BIOS/UEFI에서 옵션을 켜거나 끄는 것과 다름없습니다. 이제 원리를 이해하셨으니 훨씬 안심하고 사용할 수 있을 겁니다.
어쨌든 이번 기회에 CPU 아키텍처와 가상화 소프트웨어, VirtualBox의 작동 방식, 그리고 명령줄을 통해 숨겨진 기능과 설정을 제어하는 방법까지 조금 더 배우셨기를 바랍니다. 정말 유용한 팁이죠. 이쯤에서 마무리하겠습니다.
감사합니다.