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
여기까지는 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 |