반가상화
더 많은 작업
- Paravirtualization; PV, 준가상화
- 게스트 운영체제의 커널을 고쳐, 특권이 필요한 작업을 하드웨어에 직접 하지 않고 하이퍼바이저에 하이퍼콜로 요청하게 만드는 가상화 방식
반가상화에서는 하이퍼바이저가 실제 하드웨어와 똑같은 가상 하드웨어를 흉내 내지 않는다. 대신 실제 하드웨어와 비슷하지만 똑같지는 않은, 가상화하기 쉬운 인터페이스를 게스트에게 제공한다. 게스트 운영체제는 자기가 가상 머신 위에 있다는 것을 알고, 이 인터페이스에 맞게 커널을 고쳐서 실행한다. 하드웨어를 완전히 흉내 내는 전가상화보다 하이퍼바이저가 할 일이 줄어 성능 부담이 작다.
반가상화를 대표하는 것은 Xen이다. Xen 논문(Barham 외, SOSP 2003)은 전가상화의 단점을 피하기 위해 기반 하드웨어와 비슷하지만 똑같지 않은 가상 머신 추상화를 제공하며, 이 접근을 반가상화(paravirtualization)라고 부른다고 설명한다. 성능은 좋아지지만 게스트 운영체제를 수정해야 한다는 대가가 따른다. ADP 교재는 CPU 가상화를 설명하면서 반가상화를 전가상화와 비교한다.
게스트 커널이 페이지 테이블 변경 같은 특권 작업을 하려면, 하드웨어 명령을 직접 실행하는 대신 하이퍼콜(hypercall)로 하이퍼바이저에 요청한다. Xen 논문은 하이퍼콜을 도메인(게스트)이 하이퍼바이저로 동기적인 소프트웨어 트랩을 일으켜 특권 작업을 수행하는 방식으로, 일반 운영체제의 시스템 콜과 비슷하다고 설명한다. 즉 애플리케이션이 커널에 시스템 콜을 하듯, 게스트 커널이 하이퍼바이저에 하이퍼콜을 한다.
Xen 논문에 나오는 x86 반가상화 방식은 다음과 같다.
| 대상 | 반가상화 방식 |
|---|---|
| 특권 수준 | x86의 네 특권 링 가운데 Xen이 링 0을 쓰고, 게스트 커널은 링 1에서, 애플리케이션은 원래대로 링 3에서 돈다. 게스트가 특권 명령을 직접 실행하면 실패하며, 특권 작업은 Xen이 검증한 뒤 대신 수행한다. |
| 메모리(페이지 테이블) | 섀도 페이지 테이블을 두지 않고, 게스트의 페이지 테이블을 MMU에 직접 등록한다. 게스트는 페이지 테이블을 읽기만 할 수 있고, 변경은 하이퍼콜로 요청하면 Xen이 검증 후 반영한다. |
| 인터럽트 | 하드웨어 인터럽트를 가벼운 이벤트(event) 메커니즘으로 대신한다. Xen에서 게스트로 가는 알림은 비동기 이벤트로 전달된다. |
| 시간 | 게스트는 실제 시간과 가상 시간을 모두 안다. |
| 장치 입출력 | 네트워크·디스크 등은 단순한 가상 장치로 제공하고, 데이터는 비동기 I/O 링(ring)으로 주고받는다. 게스트에는 Xen용 가상 장치 드라이버를 넣는다. |
수정 대상은 커널뿐이다. 애플리케이션 바이너리 인터페이스(ABI)는 그대로이므로 게스트 위의 응용 프로그램은 고치지 않고 실행된다. Xen 논문은 리눅스를 Xen에 이식하면서 수정·추가한 코드가 약 3,000줄(2,995줄)로, x86 코드 전체의 1.36% 정도였다고 밝혔다. 또 리눅스와 윈도 XP를 함께 올려도 성능 부담이 가상화하지 않은 경우에 비해 많아야 몇 퍼센트라고 보고했다.
- x86에서 하드웨어 가상화 지원(Intel VT-x, AMD-V)이 없던 시절, 반가상화는 바이너리 번역 방식의 전가상화보다 오버헤드가 작아 성능이 원래 하드웨어에 가까웠다.
- 섀도 페이지 테이블을 유지하는 비용이 없고, 장치를 에뮬레이션하지 않고 단순한 인터페이스로 입출력을 처리하므로 입출력 성능이 좋다.
- 하드웨어 지원 가상화가 보급된 뒤에는 CPU 쪽의 성능 차이가 줄었다. 그래도 입출력 장치에서는 반가상화 드라이버가 에뮬레이션보다 빠르기 때문에, 전가상화 게스트에서도 virtio 같은 반가상화 드라이버를 널리 쓴다.
- Xen PV: Xen 설정 문서는 PV 도메인을 Xen을 아는(Xen-aware) 게스트 운영체제를 위한 형태라고 설명한다. 이와 함께 하드웨어 지원으로 완전 가상화하는 HVM, 장치 모델 없이 가볍게 하드웨어 지원을 쓰는 PVH 유형도 있다.
- 반가상화 드라이버: KVM의 virtio처럼 CPU는 전가상화로 돌리고 디스크·네트워크만 반가상화 드라이버를 쓰는 방식이 일반적이다. 자세한 내용은 I/O 가상화 문서를 참고한다.
- 반가상화 인터페이스: VirtualBox 문서는 게스트에 KVM·Hyper-V 반가상화 인터페이스를 노출해 반가상화된 시계(clock) 등을 쓸 수 있게 한다고 설명한다. 이 경우 게스트 OS가 그 인터페이스를 인식하고 써야 효과가 있다.
| 항목 | 전가상화 | 반가상화 |
|---|---|---|
| 게스트 OS 수정 | 필요 없음 | 커널 수정 필요 |
| 게스트가 가상화를 아는가 | 모름 | 앎 |
| 특권 명령 처리 | 하이퍼바이저가 트랩으로 가로채거나 바이너리 번역, 또는 하드웨어 지원(VT-x/AMD-V) | 게스트가 하이퍼콜로 하이퍼바이저에 직접 요청 |
| 하드웨어 지원 필요 | x86에서는 바이너리 번역을 쓰지 않는 한 필요 | 필요 없음 |
| 성능 | 하드웨어 지원이 없으면 번역 비용이 큼 | 오버헤드가 작아 원래 성능에 가까움 |
| 지원 OS | 윈도 같은 상용 OS를 포함해 거의 모든 OS | 커널을 고칠 수 있는 OS 위주(리눅스 등) |
| 메모리 가상화 | 섀도 페이지 테이블 또는 하드웨어 보조(EPT/NPT) | 게스트 페이지 테이블을 직접 쓰되 갱신은 하이퍼콜로 검증 |
| 예 | VMware ESXi, KVM, Hyper-V, Xen HVM | Xen PV |
- 반가상화는 게스트 OS 커널을 수정해야 하고, 전가상화는 수정하지 않는다는 구분이 가장 기본이다.
- 반가상화에서 게스트는 하이퍼콜로 하이퍼바이저에 특권 작업을 요청한다. 하이퍼콜은 시스템 콜에 빗대어 이해한다.
- 대표 사례는 Xen이며, 반가상화는 하드웨어 지원 없이도 성능이 좋지만 수정할 수 없는 상용 OS는 올리기 어렵다는 장단점을 비교한다.
- ADP 교재 분류로는 CPU 가상화의 하위 내용이며, 메모리 가상화·I/O 가상화와 함께 클라우드 인프라 기술로 묶인다.