본문 바로가기

Programming

Building KVM from source in Ubuntu

KVM 은 한마디로 QEMU 를 수정해서 만든 하이퍼바이저라고도 생각할 수 있을 정도로 QEMU 소스에 기반한다. 일단 KVM 의 동작방식은 리눅스 커널상의 kvm.ko, kvm_intel.ko 두개의 모듈과 /usr/bin/kvm 의 어플리케이션이 상호작용하면서 돌아가는 것으로 보인다. 여기서 kvm.ko 및 kvm_intel.ko 는 따로 생성할 수도 있지만 기본적으로 리눅스 커널 2.6.3 이상에 자연히 포함되어 있다.  실제로 find / -name kvm.ko 를 해보면 리눅스에 기본으로 들어가있다. KVM 관련 설치를 하고사너 lsmod 해보면 이들이 올라가있는 것을 확인 할 수 있다.

일단 KVM 을 컴파일하지 않고 직접 설치만 해서 사용하는것은 매우 간단하게 apt-get install 하나로 끝난다.


apt-get install ubuntu-virt-server python-vm-builder kvm-ipxe virtinst libcap2-bin

(http://www.mrxuri.com/2013/11/22/install-kvm-on-ubuntu-server-12-04-lts-and-create-a-virtual-machine.html 참조.)


설치하고난 뒤에 qemu 에 주던 인자를 그대로 단지 kvm 명령에 주면 qemu 로 OS 를 돌리던것과 똑같이 OS 를 돌릴 수 있다.  그러나 그 성능을 확인해보면 알 수 있지만 kvm 으로 돌리게되면 에뮬레이션이 아니라 가상화를 하기때문에 성능이 월등히 높다. 동일한 바닐라 커널에 대해서 아래의 stream 벤치의 성능차이를 보면 10배가까이 차이가 나는것을 볼 수 있다.

(QEMU)

(KVM)


이제 KVM 을 수정하기 위해서는 KVM 소스를 받아서 컴파일하여 설치를 해야하는데 KVM 소스는 다음 링크에서 구할 수 있다.

http://sourceforge.net/projects/kvm/files/

그리고 다운로드한 소스를 컴파일 하고 설치하는것은 아래의 문서를 참조하면 된다.

http://www.linux-kvm.org/page/HOWTO1


일단 문서를 참조해서 make 하면 kvm 이라는 바이너리가 생성되는것이 아니라 qemu-system-x86_64 처럼 qemu-system 어쩌고... 의 바이너리가 생성된다.  하지만 이는 사실 qemu 시스템바이너리가 아니라 qemu-kvm 바이너리이다. 결국 아래처럼 qemu 쓰던식으로 똑같이 KVM 을 사용하면 된다.

여기까지는 qemu-kvm 에 대한 부분이다. 실제로 KVM 의 하이퍼바이저 관련부분에 대한 소스는 kvm-kmod 의 커널모듈 소스로서 존재하는데, 이부분을 수정하고 모듈을 새로 올려야 KVM 의 기능을 수정할 수 있다. 일단 kvm-kmod 의 소스는 아래의 링크에서 다운받을 수 있다. (qemu-kvm 도 마찬가지)

http://sourceforge.net/projects/kvm/files/

테스트하는 리눅스 커널버전과 동일한 KVM 커널버전의 소스를 다운받고 아래처럼 컴파일한다... 

tar xjf kvm-kmod-release.tar.bz2
cd kvm-kmod-release 
./configure
make 

를 수행하면 x86 디렉토리에 kvm.ko, kvm-intel.ko 2개가 생성된다. (http://www.linux-kvm.org/page/HOWTO1 참고) 이렇게 생성된 ko 파일들을 원래의 ko 파일들 대신에 넣어주면 간단히 끝난다.


아래는 kvm-kmod 의 소스상에서 vmx.c 의 vmx_handle_exit 함수에 간단한 테스트 메시지를 찍어본 결과이다. 게스트 OS 가 VMExit 을 할때마다 로그가 나타나는 것을 확인 할 수 있다. 이제부터 KVM 소스코드를 분석하고 원하는대로 수정해서 여러가지 일들을 할 준비가 끝난것이다..!


이 모든 환경을 세팅하기위한 호스트 OS 는 Ubuntu12.04-64 이다. 커널버전은 3.5.0 이다. 참고로 kvm.ko 등의 KVM 모듈을 제거한 상태에서는 소스에서부터 컴파일한 qemu-kvm (qemu-system-x86_64) 는 No accelerator found! 를 찍고 종료하는 반면 바이너리로 설치한 kvm 바이너리는 kvm 으로서 작동하지 않는대신 일반 qemu 로서 돌아간다.




'Programming' 카테고리의 다른 글

Linux gdb ASLR disabling  (0) 2014.03.04
IDA/gdb Debugging After Attaching  (0) 2014.03.03
Linux Kernel compile and update  (0) 2014.01.07
QEMU Internals  (0) 2014.01.02
Secret of SET_FS and KERNEL_DS in Linux Kernel  (0) 2013.12.31