KVM과 VirtualBox는 함께 사용할 수 없다고 알려져 있습니다. 정확히 말하면, KVM 모듈이 메모리에 로드되어 있는 동안에는 VirtualBox가 실행되지 않는 문제입니다. 흥미롭게도 KVM은 VirtualBox와 함께 잘 작동하기 때문에 사실상 일방적인 문제입니다. 다행히 해결 방법도 아주 간단합니다.
하지만 안타깝게도 인터넷에는 이 제품이나 저 제품을 삭제하라고 권하는 엉터리 튜토리얼이 너무 많습니다. 좀 더 합리적인 가이드들조차 대부분 rmmod 명령어로 모듈을 내리라고만 알려줄 뿐, 다시 원래 상태로 복구하는 방법까지는 설명해 주지 않습니다.
이 글에서는 어떤 프로그램도 삭제하지 않고, 사용할 때마다 재부팅하지 않고도 KVM과 VirtualBox를 나란히 사용하는 방법을 소개합니다. 충돌하는 상대방을 위해 각 제품을 비활성화하고 활성화하는 방법을 배우게 될 것입니다. 재부팅 없이 실시간으로 말이죠. 그럼 시작해 보겠습니다.
증상: VirtualBox가 실행되지 않음
VirtualBox를 실행할 때 다음과 같은 오류 메시지를 볼 수 있습니다:
"VirtualBox can't operate in VMX root mode. Please disable the KVM kernel extension, recompile your kernel and reboot." (VirtualBox가 VMX 루트 모드에서 작동할 수 없습니다. KVM 커널 확장을 비활성화하고, 커널을 재컴파일한 후 재부팅하십시오.)
잠깐만요, 너무 겁먹지 마세요. 이 메시지는 상당히 기술적이고 무섭게 들리지만, 실제로 무언가를 재컴파일할 필요는 전혀 없습니다. 해결하는 데 5초도 걸리지 않으며, 시스템에 전혀 손상을 주지 않습니다.
문제의 원인
VirtualBox와 KVM은 동시에 작동할 수 없습니다. 즉, VirtualBox를 실행하려면 KVM을 비활성화해야 합니다. 문제는 '어떻게' 하는가입니다. 그 답은 바로 커널 모듈을 삽입하고 제거하는 것입니다.
리눅스 운영체제는 재부팅 없이 실시간으로 커널 모듈을 삽입하고 제거할 수 있는 기능을 지원합니다. 즉, 커널 모듈을 메모리에서 자유롭게 적재하고 언로드할 수 있다는 의미입니다. 자세한 내용은 리눅스 명령어 관련 글이나 Crash Book을 참고하시기 바랍니다.
우리가 필요한 작업을 수행하기 위해 insmod와 rmmod 명령어를 사용할 것입니다.
모듈 제거하기
먼저 커널 공간을 살펴보겠습니다. lsmod 명령어를 실행하여 현재 메모리에 로드된 모듈들을 확인합니다:
# lsmod
결과를 보면, VirtualBox는 vboxdrv와 vboxnetflt 드라이버를 사용하고, KVM은 kvm과 kvm_intel 드라이버를 사용하고 있음을 알 수 있습니다. 참고로 kvm_intel은 Intel 아키텍처 전용이며, AMD 플랫폼에서는 kvm_amd를 사용합니다. 우리는 KVM 모듈을 언로드해야 합니다:
/sbin/rmmod kvm_intel
/sbin/rmmod kvm
큰 질문: 그런데 이제 KVM이 사라졌네요. 어떻게 다시 되살릴 수 있나요?
아주 좋은 질문입니다! 이제 복구 방법을 살펴보겠습니다.
모듈 다시 삽입하기
모듈을 제거했던 것처럼, 다시 삽입할 수도 있습니다. 디스크에서 해당 모듈의 위치를 찾은 후 삽입하면 됩니다. 의존성이 있는 경우 유용한 modprobe 명령어를 사용할 수도 있습니다.
먼저 모듈 위치를 찾아봅시다 (명령어 앞에 sudo를 붙이거나 root 권한으로 실행하세요):
updatedb
locate kvm
검색 결과가 매우 많을 것이므로, kvm.ko와 kvm-intel.ko로 검색 범위를 좁히는 것이 좋습니다.
이제 현재 실행 중인 커널에 맞는 모듈을 삽입합니다. uname -r 명령어로 커널 버전을 확인할 수 있습니다:
/sbin/insmod /lib/modules/`uname -r`/kernel/arch/x86/kvm/kvm.ko
/sbin/insmod /lib/modules/`uname -r`/kernel/arch/x86/kvm/kvm-intel.ko
실제 화면을 보면, 먼저 lsmod 명령어로 kvm 모듈이 로드되어 있지 않음을 확인한 후, kvm 모듈을 로드하고 다시 lsmod 명령어를 실행하여 확인하는 과정입니다.
참고로 스크린샷의 명령어는 위 코드 박스의 명령어와 약간 다릅니다. /sbin이 PATH에 포함되어 있다고 가정하여 간결하게 줄인 insmod 명령어를 사용했습니다. 동시에 전체 모듈 경로를 사용하여 실제 경로가 어떻게 생겼는지 보여주었습니다. 이 과정을 스크립트로 만들 계획이라면(만드는 것이 좋습니다), 전체 경로를 반드시 사용해야 하며, 모듈성을 높이기 위해 역따옴표(backtick)를 이용한 명령어 치환을 권장합니다.
자동화 스크립트
이제 이 과정을 자동화할 차례입니다. 두 개의 스크립트가 필요합니다. 하나는 KVM 모듈을 언로드하는 스크립트, 다른 하나는 로드하는 스크립트입니다. 더 철저하게 관리하고 싶다면, KVM 사용 중에는 VirtualBox 서비스를 중지하고, KVM 사용 후에는 다시 시작하도록 할 수도 있습니다.
따라서 VirtualBox를 활성화하고 KVM을 비활성화하는 샘플 스크립트는 다음과 같습니다:
#!/bin/bash
/sbin/rmmod kvm_intel
/sbin/rmmod kvm
/etc/init.d/vboxdrv start
반대로 KVM을 로드하고 VirtualBox를 중지하는 스크립트는 다음과 같습니다:
#!/bin/bash
/etc/init.d/vboxdrv stop
/sbin/insmod /lib/modules/`uname -r`/kernel/arch/x86/kvm/kvm.ko
/sbin/insmod /lib/modules/`uname -r`/kernel/arch/x86/kvm/kvm-intel.ko
AMD 기계를 사용한다면 kvm-intel.ko를 kvm-amd.ko로 교체하세요. 또한 이미 시작된 서비스를 다시 시작하려고 시도하지 않도록 하는 오류 검사(sanity check)가 필요합니다. 여기서는 추가하지 않았으니, 숙제로 삼아 직접 구현해 보시기 바랍니다.
마찬가지로 프로세서 아키텍처에도 주의하세요. 대부분의 경우 x86(x86_64 포함)이 작동하지만, SPARC, ARM, Itanium 등 다른 아키텍처를 사용할 수도 있으므로 그에 맞게 수정해야 합니다.
마지막으로 이 스크립트들에 연결되는 데스크톱 바로 가기를 만들어 두면 끝입니다. 특정 커널 버전 대신 uname을 사용하면 커널 업그레이드 후에도 스크립트가 계속 작동한다는 장점이 있습니다.
결론
보시다시피 현실은 생각보다 그렇게 어렵지 않습니다. 이 튜토리얼은 하나를 삭제하거나 계속 재부팅하지 않고도 VirtualBox와 KVM이 협력하도록 만드는 간단한 방법을 보여줍니다. 리눅스 아키텍처는 모듈의 실시간 삽입을 허용하기 때문에, 정말 재부팅이 필요한 경우는 커널 업그레이드뿐입니다.
이 튜토리얼을 통해 편의성과 사용성을 결합하는 영리한 방법, 커널 모듈을 삽입하고 제거하는 방법, 작업을 스크립트로 자동화하는 방법, 그리고 KVM과 VirtualBox를 나란히 사용한다는 목표를 달성하는 방법까지 여러 가지를 배울 수 있기를 바랍니다.
이 글이 도움이 되었기를 바랍니다. 감사합니다.