이전 글에서 가상화와 하이퍼바이저에 대해서 알아보았다.
하이퍼바이저는 다시 가상화 방식에 따라 Full Virtualization과 Para Virtaulization으로 분류된다.
Full Virtualization (전가상화)
하드웨어를 완전히 가상화하는 방식이다. 전부 가상화하기 때문에 Guest OS가 Host 시스템과 완전히 분리되어 실행된다. 따라서 Guest OS는 자신이 VM의 OS인지 인지하지 못한다. 그러므로 Guest OS는 하이퍼바이저의 존재를 알 필요가 없다.
Hardware와 Guest OS 사이에 Hypervisor가 분명 존재하지만, VM 입장에서는 가상화된 하드웨어를 진짜(물리) 하드웨어로 생각하고 있기 때문에, 실제 물리 자원에 대해 요청을 보낸다고 생각하게 된다. 원래 system call에 의해 App → Kernel → Hardware 순서로 서비스를 요청하는데, 이 과정을 하이퍼바이저 단에서 처리해 주는 것이다. 하이퍼바이저 관리용 가상머신이 실행되며, 모든 가상머신들의 하드웨어 접근이 해당 관리 머신을 통해 이루어진다.
Hardware Assisted Full Virtualization vs Software Assisted Full Virtualization
Full Virtualization을 구현하는 방법을 하드웨어 지원 전가상화와 소프트웨어적 전가상화로 나뉜다. 사실 전가상화는 하드웨어 지원 전가상화와 동일한 개념으로 언급된다.
하드웨어 지원 전가상화의 경우, Trap과 Emulation을 이용해 Guest OS의 Application이 직접 하드웨어의 리소스를 요청해 사용하는 구조이다.
소프트웨어적 전가상화를 처리하는 경우, Binary Translation을 이용해 각 단계에서 모든 명령에 대해 일일히 가상화하는 방법으로 진행된다.
Dual-mode operation
OS는 Dual-mode operation(이중 동작 모드)라는 것을 지원한다. 사용자와 OS는 시스템 자원을 공유하는데, 사용자가 메모리 내의 주요 자원들을 망가뜨릴 수 있기 때문에 이를 보호하고자 마련된 장치이다.
이중 동작 모드는 사용자모드와 커널모드로 구성되어 있다.
사용자가 사용하는 application이 사용자모드에서 작동되거나 OS에게 system call을 하는 경우, 커널모드로 바꿔 요청된 서비스를 실행한 후에 다시 사용자모드로 전환되는 구조이다.
Trap & Emulation
일단 pass
Binary Translation
Guest OS는 다양한 종류의 OS가 올라갈 수 있기에, 가상화된 하드웨어 요청을 할 때 OS마다 인터페이스가 각기 다르다. 이런 다양한 형식을 하나의 형식으로 번역해주는 작업 Binary Translation이라고 한다. 당연히 이 과정에서도 오버헤드가 발생한다.
Para Virtualization (반가상화)
Full Virtualization의 경우 거쳐야 할 단계가 많아 오버헤드가 발생하며, 성능이 느려진다. 그래서 이를 해결하고자 Para Virtualization이 등장했다.
반가상화의 핵심은 Hypercall이다. 반가상화에 사용되는 Guest OS는 Hypercall이라는 인터페이스를 통해 하이퍼바이저에게 직접 요청을 날린다. 방식은 사실 OS에서 application이 kernel에게 system call로 서비스를 요청하는 방식과 동일하다. 요청을 날리는 주체가 Guest OS이고, 받는 대상이 하이퍼바이저라는 점이 다를 뿐이다.
전가상화에서 Guest OS는 자신이 Guest OS인지 모른다. 하지만 반가상화에서는 Guest OS가 Hypervisor에 직접 Hypercall을 날려야 되므로, 자신이 Guest OS라는 사실을 인지해야 한다. 따라서 반가상화 하이퍼바이저에 올라가는 Guest OS는 커널을 수정해, Guest용 OS를 따로 만들어야 한다.
정리
하이퍼바이저 가상화(Type1)
- 전가상화 : Guest OS의 수정이 필요없도록 하드웨어 전체를 가상화하는 기술
- 반가상화 : Guest OS를 수정하여 특정 명령이 수행될 때 Hypercall을 호출하여 하이퍼바이저가 실행되도록 하는 기술
참고링크