본문 바로가기
Tip & Tech

가상화 (Virtualization)

by virgo81 2010. 1. 22.

최근 Windows 7의 등장과 XP-모드, x86 CPU

 

가상화 지원으로 인하여

 

가상화에 대한 관심이 높아지고 있습니다.

 

가상화는 매우 많은 의미로 사용되고 있지만

 

일반적으로 가장 많이 사용 되는 곳은

 

여러 운영체제를 한 시스템에 격리하여 사용하는

 

시스템 가상화(플래폼 가상화)를 의미합니다.

 

 

먼저 몇 가지 가상화 용어에 대해서 정리를 해보겠습니다.

 

 

가상 머신 모니터(Virtual Machine Monitor = 하이퍼바이저(Hypervisor))

가상 머신의 추상 개념을 제공하는 소프트웨어입니다.
가상 머신을 실행하고, 실제 하드웨어로부터 격리하는 역할을 합니다.
대표적인 소프트웨어로 VMware, Virtual Box, Xen, KVM 등이 있습니다.

 

가상 머신(Virtual Machine)

프로그램을 물리적인 머신처럼 실행할 수 있는 머신의 소프트웨어적 구현입니다.

 

전 가상화(Full virtualization)

소프트웨어를 수정 없이 가상 머신에서 실제 머신처럼 실행 가능합니다.
보통 전통적인 가상화에서 제공하며 x86의 경우 인텔의 VT AMD AMD-V 확장을 통해 제공합니다.
Windows 7
의 가상화 기능과 KVM 등이 전 가상화를 지원합니다.

 

반 가상화(Paravirtualization)

가상 머신에서 실행을 위해서는 소프트웨어의 수정이 필요합니다.
가상화 확장 이전의 x86에서 사용되었으며
반 가상화를 사용하는 가장 유명한 가상 머신 모니터로는 Xen이 있습니다.

 

 

용어를 몇 가지 살펴보니 가상화를 간단하게 이렇게도 말할 수 있을 거 같습니다.

 

 

가상 머신 모니터 소프트웨어를 이용하여 가상 머신을 만들어서 실제 머신에서처럼

 

가상 머신에서 소프트웨어를 실행하는 것이 가상화다.

 

 

그러면 왜 이렇게 번거로운 작업을 해야 할까요?

 

여러 가지 목적이 있겠지만 대표적인 몇 가지를 이야기하면 다음과 같습니다.

 

1. 여러 장비에 분산되어 있는 서버를 고성능 한 장비에 합칠 때
2.
한 컴퓨터에서 여러 프로그램을 실행하고 싶지만, 보안이나 기타 이유로 여러 운영체제가 필요할 때
3.
여러 운영체제에서 테스트가 필요할 때
4.
구형 하드웨어나 소프트웨어에 대한 지원이 필요할 때 (Windows 7 XP 모드의 주 목적입니다)
5.
클라우드 컴퓨팅과 같이 유연하게 자원을 사용하고 싶을 때

 

등등 많은 이유로 가상화에 대한 요구가 증가하고 있습니다.

 

그 동안 VMware Virtual Box등으로 가상화를 사용했던 거 같은데 뭐가 문제였길래

 

인텔이나 AMD가 가상화 지원 CPU를 출시하고 있을까요?

 

과거로 거슬러 올라가 보면 Popek Goldberg 1974년 논문

 

"가상화 가능한 3세대 아키텍처들을 위한 형식상의 요구사항"에서 VMM으로 고려되는

 

시스템 소프트웨어를 위한 3가지 필수 특징을 발표하였습니다.

 

 

3가지를 간단하게 정리하면 다음과 같습니다.

 

1. 효율(Efficiency)

    모든 위험하지 않은 명령들은 VMM의 간섭 없이 하드웨어로 직접 수행되어야 합니다.
2. 자원 통제(Resource control)

    VMM은 가상화된 자원에 대해 완벽한 통제를 해야 합니다.
3.
동등(Equivalence)

    VMM에서 실행되는 프로그램은 같은 머신에서 직접 실행되었을 때와 동일하게 수행되어야 합니다.

 

전통적인 가상화는 트랩-에뮬레이트를 통해 위 특성을 만족하는 가상화를 제공하였습니다.

 

하지만 최근까지 하드웨어의 지원 부족으로 x86 아키텍처는 전통적인 트랩-에뮬레이트 가상화를

 

허용하지 않았습니다.

 

다행스럽게도 최근 인텔 AMD가 전통적인 가상화를 지원하기 위해 아키텍처 확장을 소개했습니다.

 

그것이 인텔의 VT AMD의 AMD-V입니다.

 

 

그러면 x86 아키텍처가 가상화를 위한 어떠한 하드웨어 지원이 부족했을까요?

 

대표적인 문제가 특권 상태 접근 시에 폴트를 발생시키지 않는 문제입니다.

 

이전에는 x86이 많이 사용되는 PC 여러 운영체제를 동시에 사용하고자 하는 요구가 거의 없었습니다.

 

x86에서는 2비트(0-3) 특권 레벨(Privilege Level) 기반의 보호를 제공하는데

 

특권 레벨0은 가장 권한이 높은 소프트웨어(운영체제)가 사용하고

 

특권 레벨 3은 일반 응용프로그램이 사용합니다.

 

하지만 가상화에 대한 요구가 증대되면서 가상화를 시도하게 되었습니다.

 

가상화를 위해 VMM이 도입되어야 하는데, 자원통제를 위하여 VMM은 가장 높은 특권 레벨(0)에서

 

실행이 되어야 합니다. 하지만, 아뿔사! 이미 그 자리는 운영체제가 차지하고 있습니다.

 

그럼 어떻게 해야 하나요? 굴러온 돌(VMM)이 박힌 돌(OS)를 빼내야 합니다.

 

그래서 운영체제한테 특권 레벨 1이나 3으로 가라고 했습니다.

 

특권 레벨 0에 있던 운영체제가 특권 레벨 1 또는 3으로 갔는데 이게 잘 실행되었으면 하는 바램이 있지만

 

바램은 바램일 뿐입니다.

 

 

운영체제는 여러 특권 명령을 실행하게 됩니다. 특권 명령은 특권 레벨 0에서만 사용할 수 있는 명령입니다.

 

특권 명령을 다른 특권 레벨에서 사용하면 트랩이 발생하게 되고 이 트랩을 VMM이 처리를 해주면

 

말끔하게 문제가 해결될 거 같습니다.

 

하지만 애석하게도 x86의 일부 특권 명령은 다른 특권 레벨에서 실행하여도 트랩을 발생시키지 않습니다.

 

트랩을 발생 시켜야 VMM이 처리를 할 텐데 난감한 일이죠.

 

그 외에 링 앨리어싱, 주소 공간 축소, 게스트 시스템 호출의 부정적 효과, 인터럽트 가상화,

 

숨은 상태의 접근, 링 축소, 특권 자원에 대한 빈번한 접근 등의 문제가 있습니다.

 

 

이러한 문제를 하드웨어가 확장을 통해 지원 하기 전에는 소프트웨어로 해결했습니다.

 

VMware, Virtual Box와 같은 x86용 VMM들은 게스트 커널 코드의 바이너리 변환을 대신 사용했습니다.

 

또한 Xen과 같은 경우는 운영체제 코드 레벨 1에서 실행되도록 수정하고 반 가상화를 사용했습니다.

 

이러한 방법으로 가상화를 사용할 수 있지만, 코드를 변경하거나 VMM이 계속 개입해야 하는

 

문제 등이 있습니다.

 

 

이러한 문제를 하드웨어로 해결하기 위해 VT 또는 AMD-v

 

VMX root VMX non-root의 추가를 통해 아키텍처를 확장 했습니다.

 

 

양 모드 모두 0-3까지의 특권 레벨을 가지고 있습니다.

 

VMM VMX root 모드에서 실행되고, 게스트 운영체제는 VMX non-root 모드에서 실행됩니다.

 

 상태는 vm entry를 통해 VMX root에서 VMX non-root 모드로 전환되고

 

또한 vm exit를 통해 VMX non-root 모드에서 VMX root 로 전환됩니다.

 

VMX non-root 모드에서 운영체제는 기존처럼 특권 레벨 0에서 실행됩니다.

 

하지만 기존과 다르게 많은 명령어들과 이벤트들이 vm exit를 호출합니다.

 

이러한 개선을 통해 운영체제는 기존의 특권 레벨에서 실행되기에 특권 레벨 변화로 인한

 

대부분의 문제가 해결 되었습니다.

 

그리고 또한 특권 명령을 VMM이 처리할 수 있게 적절히 트랩도 발생하게 되었습니다.

 

, 이제 말끔하게 가상화를 위한 문제들이 해결된 거 같습니다.

 

그럼 성능도 항상 하드웨어 지원을 통한 가상화가 좋은 성능을 보일 것 같습니다.

 

 

하드웨어 지원 가상화 vs. 소프트웨어 가상화

 

하지만 하드웨어에서 지원해준다고 항상 좋은 것만은 아닙니다.

 

VMX root <-> VMX non root 변환 시 지연이 생각보다 길기 때문입니다.

 

2.66GHz Core 2 Duo 프로세서에서 vm entry 명령을 실행하는데 무려 937 CPU 사이클이 필요하고

 

vm exit 1186 CPU 사이클이 필요합니다.

 

많은 명령어들과 이벤트들이 vm exit를 호출하고 다시 vm entry를 통해 게스트 운영체제로 돌아오기에

 

보통 오버헤드가 아닙니다.

 

VMware 사에서 발표한 논문에 실험 결과를 참고해보면 어느 한쪽이 좋다고 쉽게 단정지을 수 없습니다.

 

하지만 하드웨어 개선을 통해 점점 상태 전환 시 필요 사이클은 줄고 있고

 

하드웨어 지원 가상화는 점점 더 큰 매력을 가지게 되고 있습니다.

 

 

 

가상화에 대해서 간단히 설명해보았는데, 가상화에 대한 이해에 도움이 되었으면 합니다.

 

 

 

참조 자료

 

Intel® Virtualization Technology: Hardware support for efficient processor virtualization

G Neiger, A Santoni, F Leung, D Rodgers, R Uhlig - Intel Technology Journal, 2006

 

A comparison of software and hardware techniques for x86 virtualization

K Adams, O Agesen - ASPLOS, 2006

 

Formal requirements for virtualizable third generation architectures

GJ Popek, RP Goldberg - Communications of the ACM, 1974

 

Virtualization and etc. - Wikipedia