Younghun Go
가상화 기본 개념 본문
가상화를 공부하면서 새로 알게 된 내용을 정리해보려고 한다. 이 글에서 Guest와 가상 머신은 동일한 의미로 사용된다.
하이퍼바이저
Xen, KVM, QEMU가 자주 사용되고 언급되는 하이퍼바이저다. 하이퍼바이저는 Guest-OS에게 실제 물리 장치를 스케줄링하는 소프트웨어이다.
하이퍼바이저는 Type1과 Type2로 분류된다. 아래 그림처럼 TYPE1은 TYPE2와는 다르게 HARDWARE 바로 윗 단에 HYPERVISOR가 있지만, TYPE2는 HARDWARE와 HYPERVISOR 사이에 Host-OS가 중개 역할을 한다.
어느 타입이 성능이 더 좋을까? 결론부터 말하면 TYPE1이 더 성능이 좋다. HYPERVISOR가 HARDWARE에 바로 접근하기 때문이다. Type2는 윈도우 OS 위에서 virtualbox와 같은 하이퍼바이저로 ubuntu를 올리는 방식이라고 생각하면 된다. Type2는 몇 번 본 적이 있지만, Type1은 구축해본 적이 없다. KVM은 관점에 따라 TYPE1이기도, TYPE2이기도 하므로 참고하면 좋을 것 같다. Linux에서 KVM은 커널 모듈로 내장되어있기 때문에 TYPE을 정하기 애매하기 때문이다.
에뮬레이션 vs 시뮬레이션
KVM과 QEMU는 가상화를 공부하기 위해 꼭 알아야하는 내용이다. 오픈스택을 구축해보면 알겠지만, KVM과 QEMU는 서로 협업하면서 가상 머신을 만들어낸다. QEMU와 KVM의 차이를 알기 위해선 에뮬레이션과 시뮬레이션의 차이를 알아야한다.
에뮬레이션은 호스트 머신에 존재하지 않는 하드웨어를 VM에게 소프트웨어 방식으로 제공한다. 해당하는 스펙의 실제 물리 장치가 없어도 에뮬레이션을 사용하면 소프트웨어적인 방법으로 해당 스펙의 머신을 만들어낼 수 있다. 소프트웨어로 변환(Binary translation)하는 과정이 필요하기 때문에 성능이 썩 좋지는 않다. 예시로, Binary translation은 x86의 명령들을 ARM으로 변환하는 것을 말한다.
시뮬레이션은 호스트 머신의 스펙을 그대로 VM에게 제공한다. VM에서 생성된 명령들을 Binary translation과 같은 변환 없이 host 머신에서 즉각적으로 처리하게 되기 때문에 에뮬레이션 방식보다 성능이 좋다.
QEMU는 대표적인 에뮬레이터, KVM은 대표적인 시뮬레이터 중 하나이다.
전가상화 vs 반가상화
에뮬레이션과 시뮬레이션의 개념과 혼동될 수 있으므로 주의하자
전가상화는 말 그대로 모든 장치를 가상화한다. 모든 장치를 가상화 한다는 것은 가상 머신에서 생성된 모든 명령이 하이퍼바이저를 통해 변환되어 실제 물리 머신에 전달되는 것을 말한다. 전가상화는 모든 명령이 하이퍼바이저를 통해야하기 때문에 속도가 느리다.
가상 머신에서 네트워크 통신이 필요한 경우 네트워크 인터페이스 카드(NIC)를 Host에 설치하여 사용할 수 있는데, 이 때 전가상화의 경우 Guest-OS에서는 물리 NIC를 자신의 물리 장치처럼 인식한다. 즉, Guest 커널의 입장에서 본인이 Guest인지 Host인지 구분할 수 없으며, 외부에 무엇이 있는지 알지 못한다. 따라서 하이퍼바이저를 하드웨어라고 생각하고 하이퍼바이저로 데이터를 전송하게 된다. 전가상화의 경우 호스트의 물리 장치에 접근하기 위해서는 하이퍼바이저의 중개를 반드시 거쳐야하기 때문에 속도가 느리다.
반가상화는 반절만 가상화한다. 정확하게 말하면 모든 것을 가상화하지 않는다. 즉, 가상 머신 안에서 해결할 수 있는건 내부적으로 해결하고 나머지는 하이퍼바이저를 통해 처리하겠다는 말이다. 내부적으로 해결한다는 말은 커널의 코드를 수정한다는 이야기다. 반가상화는 전가상화의 성능 문제를 해결한다.
만약 VM에서 하이퍼바이저를 통하지 않고 물리 장치에 접근할 수 있다면 성능이 좋아지는 건 당연하다. 반가상화는 이 방식을 채택한다. 전가상화에서는 모든 명령이 하이퍼바이저를 거쳐야해서 성능 저하가 있었지만, 반가상화는 직접 물리 머신에 접근 가능하게 한다. 하지만 이를 달성하기 위해선 Guest의 OS 혹은 Device Driver를 수정해야한다. 하이퍼바이저가 API를 제공하면 가상 머신은 이 API를 사용하여 물리 장치에 접근할 수 있는 시스템 콜을 사용할 수 있는데, 이를 하이퍼 콜(Hyper call)이라 부른다.
KVM
KVM은 다른 VMM(Virtual Machine Manager, 혹은 하이퍼바이저)과는 다르게 Linux kernel 모듈로 동작한다. 또한 CPU의 가상화 기술에 의존하는데, Intel은 VT-x, AMD는 AMD-V 가상화 기술을 지원한다. 이 기술은 VMCS(Virtual Machine Control Structure)라는 것을 도입하여 root operation mode와 non-root operation mode를 구분하여 cpu 상태를 복원 가능하게끔 한다. 물리 cpu를 여러 가상 머신과 하나의 host가 공유하기 때문에 cpu state를 기억하는 것이 cpu 가상화에서 핵심 기술이기 때문이다.
VMM이 kernel 모듈로 동작하게 되면 다른 VMM 방식에 비해 VMM-mode와 Host-mode간의 mode switch가 적다. 또한 KVM에서는 Guest-OS를 하나의 Linux 프로세스로 본다. 따라서 Guest-Os의 스케줄링 기능과 메모리 관리 기능을 KVM에서 수행하지 않기 때문에 다른 VMM보다 KVM이 가볍다고 볼 수 있다.
[네이버클라우드 기술&경험] 가상화 개념 이해하기#1, QEMU vs KVM
Part.1에서는 QEMU와 KVM을 비교함으로써 가상화에 대한 기본 개념을 이해하고, I/O 가상화 작동 원리를 간략히 알아보고, Part. 2에서는 I/O 가상화의 성능을 높이기 위한 솔루션인 SPDK에 대해 알아보
medium.com
'클라우드 컴퓨팅' 카테고리의 다른 글
Virtio 개념 정리 (0) | 2021.08.26 |
---|---|
ubuntu KVM의 VM에서 마우스 포인터 인식 안될 때 (0) | 2021.07.30 |
ubuntu KVM에서 virsh console 안될 때(stuck) (0) | 2021.07.30 |