가상화(Virtualization) 기술 소개

출처 : IBM   http://www.ibm.com/developerworks/kr/library/l-linuxvirt/index.html

가상화 방식, 아키텍처, 구현 개요

M. Tim Jones, Consultant Engineer, Emulex
2007 년 2 월 20 일
가상화(Virtualization)는 사람들마다 그 의미도 다양합니다. 현재 가상화의 큰 초점은 서버 가상화 또는 단일 호스트 컴퓨터 상에 여러 개의 독립적인 OS를 호스팅하는 것에 맞춰져 있습니다. 이 글에서는 가상화 개념을 설명하고, 가상화를 실현하는 여러 가지 방법들을 논합니다. 또한, 리눅스 OS 가상화 같은 다양한 가상화 기술들을 살펴봅니다.

가상화는 특정한 형태로 있는 것을 또 다른 형태로 나타내는 것을 뜻한다. 컴퓨터를 가상화 한다는 뜻은 다중 컴퓨터 또는 완전히 다른 컴퓨터로 보이게 한다는 것을 의미한다.
또한, 가상화는 많은 컴퓨터들을 하나의 컴퓨터처럼 보이게 하는 것을 의미할 수도 있다.
이것은 일반적으로 server aggregation 또는 그리드 컴퓨팅(grid computing)이라고 한다.

그럼, 가상화의 기원부터 살펴보도록 하자.

가상화의 역사

가상화는 새로운 주제가 아니라 이미 40년 전부터 시작되었다. 최초의 가상화는 IBM® 7044, Massachusetts Institute of Technology (MIT)가 개발한 IBM 704상의 Compatible Time Sharing System (CTSS), 디맨드 페이징(demand paging)과 수퍼바이저 호출(supervisor calls)을 선도했던 Manchester University의 Atlas 프로젝트(최초의 수퍼컴퓨터 중 하나) 등이 있다.

하드웨어 가상화

IBM은 System/360™ Model 67 메인프레임을 개발하면서, 1960년대에 이미 가상화의 중요성을 인식했다. Model 67은 Virtual Machine Monitor(VMM)을 통해 모든 하드웨어 인터페이스들을 가상화 했다. 초기 컴퓨팅 시절에, 이 OS는 수퍼바이저(supervisor)로 불렸다. 다른 OS상에서 OS들을 실행할 수 있는 기능을 겸비하면서 하이퍼바이저(hypervisor)라는 이름도 얻게 되었다. (이 용어는 1970년대에 만들어졌다.)

VMM은 기반 하드웨어에서 직접 실행되기도 하고, 다중의 가상 머신(VM)들도 실행할 수 있다. 각각 VM은 고유의 OS 인스턴스를 실행할 수 있다. 초기에는 이것을 CMS(또는 Conversational Monitor System)라고 불렀다. VM은 계속 성장했으며, 요즘에는 System z9™ 메인프레임에서 실행된다. System/360 계열 제품들과도 백워드 호환이 된다.

프로세서 가상화

또 다른 초기 가상화에는 P-code (또는 가상 코드 pseudo-code) 머신도 있다. P-code는 물리적 하드웨어가 아닌 가상 머신에서 실행되는 머신 언어이다. P-code는 1970년대 초반, University of California, San Diego (UCSD) Pascal 시스템으로 유명해진 것으로서, Pascal 프로그램을 P-code로 컴파일 한 다음, P-code 가상 머신에서 실행한다. 따라서 P-code 프로그램은 뛰어난 이식성을 갖추게 되고, P-code 가상 머신을 사용할 수 있는 곳 어디에서나 실행된다.
  • Java Virtual Machine (JVM)

자바™ 언어는 가상 머신에 P-code 모델을 따랐다. 따라서, JVM으로 간단히 이식하기만 해도 무한한 아키텍처에 자바 프로그램들을 제공할 수 있었다.
C 언어의 조상 격인 1969년대의 Basic Combined Programming Language (BCPL)에도 같은 개념이 적용되었다. 이 때에는 컴파일러가 BCPL 코드를 O-code 라고 하는 중간 머신 코드로 컴파일 한다. 두 번째 단계로, O-code는 대상(target) 머신의 네이티브 언어로 컴파일 되었다. 이 모델은 현대적인 컴파일러에 의해 사용되어, 새로운 대상 아키텍처로 컴파일러를 이식할 때 유연하다. (중간 언어(intermediate language)에 의해 프론트엔드와 백엔드를 구별한다.)


명령어 가상화

최근의 가상화 추세는 명령어 가상화(instruction set virtualization) 또는 바이너리 변환이다. 이 모델에서, 가상(virtual) 명령어는 기반 하드웨어의 물리적 명령어로 동적으로 변환된다. 실행될 코드가 있을 경우 코드 세그먼트에 변환이 이루어진다. 분기(branch)가 발생하면, 새로운 코드 세트가 변환된다. 이것은 메모리에서 빠른 로컬 캐시 메모리로 명령어 블록을 이동하는 캐싱 연산과 매우 비슷하다.

이 모델은 최근 Transmeta에서 설계된 Crusoe CPU에서 사용되었다. 이 아키텍처는 Code Morphing 이라는 이름으로 바이너리 변환을 구현했다. 비슷한 예로 권한이 있는 명령어를 찾아서 리다이렉션 하는 전체 가상화(full virtualization) 솔루션에서 사용되는 런타임 코드 스캐닝이다. (특정 프로세스 명령어와 관련된 이슈를 해결한다.)
  • 가상화와 게임
가상화를 다루는 글에서 Multiple-Arcade Machine Emulator (MAME)을 언급하지 않을 수 없다. MAME은 이름에서 함축하듯 과거의 많은 아케이드 게임의 머신 에뮬레이터이다. 그러한 게임에 사용되는 프로세서를 가상화 하는 것 외에도, 사운드와 그래픽 하드웨어와 컨트롤을 포함하여 전체 머신이 가상화 된다. MAME은 애플리케이션 규모가 크지만 소스를 정독해 보는 것도 유익하다.

가상화의 유형

가상화 같은 경우, 단 한 가지 방법만 있는 것은 아니다. 사실, 다양한 레벨의 추상화(abstraction)를 통해서 같은 결과를 얻을 수 있다. 이 섹션에서는 리눅스의 가장 일반적인 가상화 방식 세 가지를 소개하고, 이들의 장단점을 비교해 볼 것이다. 가끔씩 같은 가상화 방식을 설명하는 경우에도 다른 용어를 사용한다. 이 글에서는 가장 일반적인 용어를 사용하도록 하겠다.

하드웨어 에뮬레이션(emulation)

가장 복잡한 가상화는 그림 1처럼 하드웨어 에뮬레이션에 의해 제공된다. 이 방식에서, 하드웨어 VM은 호스트 시스템에서 생성되어 해당 하드웨어를 에뮬레이트 한다.
  • 에뮬레이션과 개발
하드웨어 에뮬레이션에서 가장 흥미로운 사용법 중 하나는 펌웨어와 하드웨어의 공동 개발(co-development)이다. 실제 하드웨어를 사용할 수 있을 때까지 기다리는 대신, 펌웨어 개발자들은 대상 하드웨어 VM을 사용하여 시뮬레이트 할 때 나타난 실제 코드에 대해 유효성 검사를 할 수 있다.

그림 1. 하드웨어 에뮬레이션은 VM을 사용하여 필요한 하드웨어를 시뮬레이트 한다.
사용자 삽입 이미지

여러분도 잘 알겠지만, 하드웨어 에뮬레이션의 가장 큰 문제는 극도로 느려질 수 있다는 점이다. 모든 명령어들이 기반 하드웨어에 시뮬레이트 되어야 하기 때문에, 100배 정도 느려지는 것은 다반사이다. 사이클 정확성(cycle accuracy), 시뮬레이트 된 CPU 파이프라인, 캐싱 작동을 포함한 하이파이(high-fidelity) 에뮬레이션의 경우, 실제 속 차이는 1000배나 더 느려질 수도 있다.
하드웨어 에뮬레이션은 장점도 있다. 예를 들어, 하드웨어 에뮬레이션을 사용하면, PowerPC®용의 수정되지 않은 OS를 ARM 호스트에서 실행할 수 있다. 다른 프로세서를 시뮬레이트 하는 여러 개의 가상 머신들을 실행할 수도 있다.

전체 가상화(Full virtualization)

전체 가상화(네이티브 가상화) 또한 가상화 방식이다. 이 모델은 게스트(guest) OS들과 네이티브 하드웨어 사이를 중재(mediate)하는 가상 머신을 사용한다. (그림 2) “중재(Mediate)”는 핵심적인 단어이다. VMM이 게스트 OS와 베어 하드웨어 사이를 중재하기 때문이다. 보호를 받고 있는 특정 명령어들은 하이퍼바이저 내에서 트랩핑(trap) 및 핸들되어야 한다. 기반 하드웨어는 OS가 소유한 것이 아닌, 하이퍼바이저를 통해서 공유되기 때문이다.

그림 2. 전체 가상화는 하이퍼바이저를 사용하여 기반 하드웨어를 공유한다.
사용자 삽입 이미지 
  • 오래된 하드웨어의 하이퍼바이저
x86 같은 일부 구형 하드웨어는 가상화의 전체 메소드에 대한 문제들을 만든다. 예를 들어, VMM에 의해 핸들되어야 하는 특정 명령어들은 트래핑 하지 않는다. 따라서, 하이퍼바이저가 이러한 문제를 처리하려면 권한 모드(privileged-mode) 코드를 동적으로 스캐닝 및 트래핑 해야 한다.


전체 가상화는 하드웨어 에뮬레이션 보다는 빠르지만, 하이퍼바이저 중재 때문에 실제 하드웨어 보다는 성능이 낮다. 전체 가상화의 가장 큰 장점은 OS를 수정하지 않고 실행될 수 있다는 점이다. 유일한 제한 사항은 OS가 기반 하드웨어(예를 들어, PowerPC)를 지원해야 한다는 것이다.

Paravirtualization

Paravirtualization은 전체 가상화와 약간 유사한 대중적인 기술이다. 이 방식은 기반 하드웨어로의 공유 액세스에 하이퍼바이저를 사용하지만, 가상화 인식 코드를 OS로 통합한다. (그림 3) 이 방식은 재컴파일이나 트래핑(trapping)을 할 필요가 없다. OS 그 자체로 가상화 프로세스에 협력하기 때문이다.

그림 3. Paravirtualization은 프로세스를 게스트 OS와 공유한다.
사용자 삽입 이미지

앞서 언급했던 것처럼, Paravirtualization은 게스트 OS들이 하이퍼바이저에 맞게 수정되어야 한다. 이것이 단점이다. 하지만, Paravirtualization은 가상화 되지 않은 시스템 성능에 가까운 성능을 보인다. 전체 가상화와 마찬가지로, 여러 다른 OS들이 동시에 지원된다.

OS 레벨 가상화

마지막 기술인 OS 레벨 가상화는 지금까지 다루어왔던 것과는 다른 기술을 사용한다. 이 기술은 그림 4처럼 OS에서 서버들을 가상화 한다. 이 방식은 하나의 OS를 지원하고, 서버들을 분리시킨다.

그림 4. OS 레벨의 가상화는 서버들을 분리시킨다.
사용자 삽입 이미지
 
OS 레벨 가상화는 OS 커널을 수정해야 하지만, 장점은 성능이 우수하다는 점이다.


왜 가상화가 중요한가?

리눅스에서 사용할 수 있는 가상화 옵션들을 보기 전에, 가상화의 장점부터 살펴보도록 하자.
비즈니스 관점에서 볼 때, 가상화를 사용해야 하는 이유는 많이 있다. 대게는 서버 통합(server consolidation)이 주요한 이유이다. 사용도가 낮은 많은 시스템들을 하나의 서버에 가상화 할 수 있다면, 파워, 공간, 냉각, 서버 관리 등에서 뚜렷한 절감 효과를 볼 수 있다. 서버 활용도를 결정하는 것은 어렵기 때문에, 가상화 기술은 라이브 마이그레이션(Live migration)이라는 것을 지원한다. 라이브 마이그레이션으로 OS와 애플리케이션들은 새로운 서버로 마이그레이션 되어 가용 하드웨어에 대해 로드를 조정할 수 있다.

가상화는 개발자에게도 중요하다. 리눅스 커널은 하나의 어드레스 공간을 차지하는데, 커널 또는 드라이버의 오류가 전체 OS 충돌이라는 결과를 가져올 수도 있다는 의미이다. 가상화를 통해서 여러 OS들을 실행할 수 있고, 버그로 인해서 한 OS가 고장이 나더라도, 하이퍼바이저와 다른 OS들은 계속해서 실행될 수 있다. 이로서 사용자 공간(user-space) 애플리케이션을 디버깅 하는 것과 비슷한 커널 디버깅이 가능해진다.



리눅스 관련 가상화 프로젝트

표 1은 리눅스에 적용할 수 있는 가상화 방식들로서 주로 오픈 소스 솔루션에 초점을 맞추었다.

표1. 리눅스 관련 가상화 프로젝트

프로젝트 유형 라이센스
Bochs         Emulation                          LGPL
QEMU         Emulation                          LGPL/GPL
VMware         Full virtualization                 Proprietary
z/VM         Full virtualization                 Proprietary
Xen         Paravirtualization               GPL
UML         Paravirtualization                     GPL
Linux-VServer    Operating system-level virtualization GPL
OpenVZ         Operating system-level virtualization GPL

기타 솔루션에 대한 내용은 참고자료 섹션을 참조하라.

Bochs (에뮬레이션)
Bochs는 x86 컴퓨터 시뮬레이터로서 이식성 있고, x86, PowerPC, Alpha, SPARC, MIPS를 포함한 다양한 플랫폼에서 실행된다. Bochs의 장점은 이것이 프로세서만 시뮬레이트 하는 것이 아니라, 키보드, 마우스, 비디오 그래픽 하드웨어, 네트워크 인터페이스 카드(NIC) 장치들 같은 주변 기기를 포함하여 전체 컴퓨터를 시뮬레이트 한다는 점이다.
Bochs는 구 Intel® 386으로서 설정되거나, 486, Pentium, Pentium Pro, 64-bit 계열의 후기 프로세서로서 설정될 수 있다. 심지어는 MMX와 3DNow 같은 그래픽 명령어들도 에뮬레이트 한다.

Bochs 에뮬레이터를 사용하여, 리눅스에서 리눅스, Microsoft® Windows® 95/98/NT/2000 (그리고 다양한 애플리케이션), Berkeley Software Distribution (BSD) OS(FreeBSD, OpenBSD 등)을 실행할 수 있다.

  • 라이브러리 레벨( Library-level) 가상화
이 글에서는 다루지 않지만, 라이브러리를 통해 OS의 부분들을 에뮬레이트 하는 가상화 방식은 라이브러리 레벨 가상화이다. Wine (a partial Win32 API for Linux)과 LxRun (a partial Linux API for Solaris)이 라이브러리 레벨 가상화에 속한다.




QEMU (에뮬레이션)

QEMU는 Bochs와 비슷한 애뮬레이터이지만, 몇 가지 차이가 있다. QEMU는 두 개의 연산 모드를 지원한다. 첫 번째는 Full System Emulation 모드이다. 이 모드는 프로세서와 주변 기기를 포함하여 전체 개인용 컴퓨터(PC)를 에뮬레이트 한다는 점에서 Bochs와 비슷하다. 이 모드는 x86, x86_64, ARM, SPARC, PowerPC, MIPS 같은 많은 프로세서 아키텍처들을 에뮬레이트한다. 동적 변환을 사용하기 때문에 속도도 빠르다. 이 모드를 사용하면 Windows OS(XP 포함)와 Linux on Linux, Solaris, FreeBSD를 에뮬레이트 할 수 있다. 다른 많은 OS 결합 역시 지원된다. 참고자료).
QEMU는 User Mode Emulation 모드도 지원한다. 리눅스에서만 호스팅 될 수 있는 이 모드에서, 다른 아키텍처용 바이너리도 시작될 수 있다. 예를 들어 이것은 MIPS 아키텍처용으로 컴파일 된 바이너리가 x86에서 실행되는 리눅스에서도 실행될 수 있다. 이 모드에서 지원되는 기타 아키텍처로는 ARM, SPARC, PowerPC 등이 있고, 더 많은 것들이 개발 중이다.

VMware (전체 가상화)

VMware는 전체 가상화용 상용 솔루션이다. 하이퍼바이저는 추상 레이어(abstraction layer)로서 게스트 OS와 베어 하드웨어 사이에 놓인다. 이러한 추상 레이어에서는 다른 게스트 OS를 알지 못해도, 어떤 OS라도 하드웨어 상에서 실행될 수 있다.
VMware는 또한 가용 I/O 하드웨어를 가상화 하고, 고성능 장치용 드라이버들을 하이퍼바이저에 배치한다.
전체 가상화 된 환경은 파일로서 저장되기 때문에, 전체 시스템(게스트 OS, VM, 가상 하드웨어)는 로드 밸런싱을 위해 새로운 호스트로 쉽고 빠르게 마이그레이션 될 수 있다.

z/VM (전체 가상화)

IBM System z™는 새로운 브랜드 이름이지만, 1960년부터 유구한 전통을 갖고 있다. System/360은 1965년에 가상 머신들을 사용하는 가상화를 지원했다. System z는 더 오래된 System/360 계열과 백워드 호환성도 갖고 있다.
z/VM®은 System z용 OS 하이퍼바이저이다. 코어에는 Control Program (CP)이 있는데, 이것은 리눅스를 포함하여 게스트 OS에 물리적 리소스들의 가상화를 제공한다. (그림 5) 이것은 여러 프로세서들과 다른 리소스들이 많은 게스트 OS들을 위해 가상화 될 수 있도록 한다.

그림 5. z/VM을 사용한 OS 레벨 가상화
사용자 삽입 이미지
 

z/VM은 또한 서로 통신을 원하는 게스트 OS들을 위해 가상으로 게스트 로컬 영역 네트워크(LAN)을 에뮬레이트 할 수 있다. 이것은 하이퍼바이저에서 완전히 에뮬레이트 되며, 매우 안전하다.

Xen (paravirtualization)

Xen은 XenSource의 OS 레벨 Paravirtualization용 무료 오픈 소스 솔루션이다. Paravirtualization에서는 하이퍼바이저와 OS가 가상화에서 협업하고, OS는 변해야 하지만, 성능은 우수하다.
Xen은 협업(게스트 OS를 수정해야 한다) 이 필요하고, 패치 된 OS들만이 Xen을 통해서 가상화 될 수 있다. 전체 가상화 보다 더 나은 성능을 보이기 때문에, 그 자체가 오픈 소스인 리눅스 관점에서 볼 때, 합리적인 절충안으로 볼 수 있다. 하지만, 다른 비 오픈 소스 OS의 지원 같은 전체적인 지원 관점에서 볼 때는 이것이 단점이 될 수 있다.

Xen에서 Windows를 게스트로서 실행하는 것이 가능하지만, Intel Vanderpool 또는 AMD Pacifica를 실행하는 시스템에서만 가능하다. Xen을 지원하는 다른 OS로는 Minix, Plan 9, NetBSD, FreeBSD, OpenSolaris 등이 있다.

User-mode Linux (paravirtualization)

User-mode Linux (UML)는 리눅스 OS가 사용자 공간에서 다른 리눅스 OS를 실행할 수 있도록 한다. 각각의 게스트 리눅스 OS는 호스트 OS의 프로세스 안에 존재한다. (그림 6) 이것은 여러 리눅스 커널들이(고유의 제휴 사용자 공간 포함) 하나의 리눅스 커널 정황 내에서 실행될 수 있도록 한다.

그림 6. User-mode Linux에서의 리눅스 호스팅
사용자 삽입 이미지
 
2.6 리눅스 커널부터, UML은 메인 커널 트리에 존재하지만, 사용할 수 있으려면 재컴파일 되어야 한다. 이러한 변경 사항들은 장치 가상화를 제공하여 게스트 OS들이 블록 장치들(플로피, CD-ROM, 파일 시스템) 같은 물리적 장치들을 공유할 수 있도록 한다.

게스트 커널들은 애플리케이션 공간에서 실행되기 때문에 특별하게 컴파일 되어야 한다. 결국 호스트 커널(하드웨어)과 게스트 커널(호스트 커널의 사용자 공간에서 실행됨)이 생기게 되었다. 이러한 커널들은 심지어 중첩될 수 있고, 게스트 커널이 호스트 커널에서 실행되고 있는 또 다른 게스트 커널에서 실행될 수 있다.

Linux-VServer (OS 레벨의 가상화)

Linux-VServer는 OS 레벨 가상화를 위한 솔루션이다. Linux-VServer는 리눅스 커널을 가상화 하여 여러 사용자 공간 환경들, Virtual Private Servers (VPS)가 서로를 인식하지 못한 채 독립적으로 실행될 수 있도록 한다. Linux-VServer는 리눅스 커널로의 수정을 통해서 사용자 공간 고립화를 이룩한다.

사용자 공간의 분리는 콘텍스트의 개념으로 시작한다. 콘텍스트(context)는 VPS의 프로세스용 컨테이너이기 때문에 ps 같은 툴들은 VPS의 프로세스에 대해서만 안다. 초기 부팅 동안, 커널은 디폴트 콘텍스트를 정의한다. 스펙테이터(spectator) 콘텍스트 역시 관리용으로 사용된다. (실행되는 모든 프로세스들을 감시한다.) 여러분도 알다시피 이러한 가상화 방식을 지원하려면 커널과 내부 데이터 구조들이 수정되어야 한다.

Linux-VServer는 각 VPS용 루트 디렉토리를 분리시키기 위해 chroot을 사용한다. chroot은 새로운 루트 디렉토리가 지정되도록 하지만, VPS는 이것의 고립된 루트 디렉토리를 부모 디렉토리로 사라지지 않게 하려면 추가 기능(Chroot-Barrier)이 필요하다. 고립된 루트 디렉토리에서, 각 VPS는 고유의 사용자 리스트와 루트 패스워드를 갖는다.

Linux-VServer는 2.4와 2.6 커널에서 지원되고 x86, x86-64, SPARC, MIPS, ARM, PowerPC를 포함한 많은 플랫폼에서 실행된다.

OpenVZ (OS 레벨의 가상화)

OpenVZ는 Linux-VServer와 같은 또 다른 OS 레벨의 가상화 솔루션이지만, 몇 가지 재미있는 차이가 있다. OpenVZ는 고립된 사용자 공간 VPS와 관리용 사용자 툴을 지원하는 가상화 인식(수정된) 커널이다. 예를 들어, 명령어로 새로운 VPS를 쉽게 만들 수 있다.

  • Listing 1. 명령어로 VPS 생성하기

              
$ vzctl create 42 –ostemplate fedora-core-4
Creating VPS private area
VPS private area was created

$ vzctl start 42
Starting VPS …
VPS is mounted

vzlist 명령어를 사용하여 현재 생성된 VPS를 리스팅 할 수 있으며, 표준 리눅스 ps 명령어와 비슷한 방식 작동한다.

프로세스를 스케줄링 하기 위해, OpenVZ에는 두 레벨의 CPU 스케줄러가 포함된다. 우선, 스케줄러는 어떤 VPS가 CPU를 차지할 것인지를 결정한다. 이것이 결정된 후에 두 번째 스케줄러는 프로세스를 선택하여 표준 리눅스 속성을 실행한다.

OpenVZ에는 또한 beancounters라는 것도 포함된다. beancounter는 주어진 VPS에 대한 리소스 분배를 정의하는 많은 매개변수들로 구성된다. 이것은 VPS에 대한 제어 레벨을 제공하면서, 얼마나 만은 메모리를 사용할 수 있는지, 얼마나 많은 인터프로세스(interprocess) 통신(IPC) 객체들을 사용할 수 있는지 등을 정의한다.

OpenVZ의 유일한 기능은 하나의 물리적 서버에서 또 다른 서버로 체크포인트(checkpoint) 및 마이그레이션 하는 기능이다. 체크포인팅(Checkpointing)은 실행하고 있는 VPS의 상태가 동결되어 파일로 저장된다는 의미이다. 이 파일은 뷰 서버로 마이그레이션 될 수 있고, VPS를 온라인으로 불러올 때 복원된다. OpenVZ는 x86, x86-64, PowerPC 등 많은 하드웨어 아키텍처를 지원한다.


전체 가상화와 Paravirtualization에 대한 하드웨어 지원

IA-32 (x86) 아키텍처는 가상화와 관련하여 몇 가지 문제를 만들어 낸다. 특정 권한 모드 명령어는 트래핑을 수행하지 않고, 그 모드에 기반한 다른 결과를 리턴한다. 예를 들어, x86 STR 명령어는 보안 상태를 검색하지만, 리턴된 값은 특정 요청자의 권한 레벨에 기반하고 있다. 이는 다른 OS들을 다른 레벨로 가상화 할 때 문제를 만든다. 예를 들어, x86은 네 개의 보호 링(protection ring)을 지원하는데, 여기에서 레벨 0(가장 높은 권한)은 일반적으로 OS를 실행하고, 레벨 1과 2는 OS 서비스들을 지원하고, 레벨 3(가장 낮은 레벨)은 애플리케이션을 지원한다. 하드웨어 벤더들은 이러한 단점들을 인식하고, 가상화를 지원하고 가속화 할 수 있는 새로운 디자인을 만들어 냈다.

Intel은 x86 (VT-x)과 Itanium® (VT-i) 아키텍처용 하이퍼바이저를 지원할 새로운 가상화 기술을 만들고 있다. VT-x는 두 개의 새로운 형태의 연산을 지원하는데, 하나는 VMM (root)을 위한 것이고, 하나는 게스트 OS(non-root)를 위한 것이다. 루트 폼은 완전한 권한을 갖지만, 비 루트(non-root) 폼은 권한이 없다. (RING 0에서도 권한이 없다.) 이 아키텍처는 또한 VM(게스트 OS)이 VMM으로 종료하여 프로세서 상태를 저장하도록 하는 명령어를 정의할 때 유연성도 발휘하며, 이에 대한 추가 기능 또한 제공한다. 참고자료 섹션에서 확인하기 바란다.

AMD 역시 Pacifica라고 하는 하드웨어를 지원하는 가상화 기술을 만들고 있다. 무엇보다도, Pacifica는 특별한 명령어 실행 시 저장된 게스트 OS에 대한 컨트롤 블록을 관리한다. VMRUN 명령어는 또한 가상 머신(그리고 관련 게스트 OS)가 VMM이 컨트롤을 다시 얻을 때까지 실행되도록 한다. (이것 역시 설정 가능하다.) VMM은 각 게스트들에 대한 권한을 커스터마이징 할 수 있다. 또한, Pacifica는 호스트와 게스트 메모리 관리 단위(MMU) 테이블로 어드레스 변환을 수정했다.
이러한 새로운 기술들은 이 글에서 언급한 Xen, VMware, User-mode Linux 등 많은 가상화 기술들에 의해서 사용될 수 있다.

Linux KVM (Kernel Virtual Machine)

가장 최근의 리눅스 소식은 KVM이 리눅스 커널(2.6.20)로 통합되었다는 내용일 것이다. KVM은 리눅스 커널을 커널 모듈을 사용하는 하이퍼바이저로 전환한다는 점에서 전체 가상화 솔루션이라고 할 수 있다. 이 모듈은 다른 게스트 OS들이 호스트 리눅스 커널의 사용자 공간에서 실행될 수 있도록 한다. (그림 7) 커널의 KVM 모듈은 /dev/kvm 캐릭터 장치를 통해 가상화된 하드웨어를 노출한다. 게스트 OS는 PC 하드웨어 에뮬레이션에 대한 수정된 QEMU 프로세스를 사용하여 KVM 모듈과 인터페이싱 한다.

그림 7. Kernel Virtual Machine (KVM)을 이용한 가상화
사용자 삽입 이미지
 
KVM 모듈은 새로운 실행 모드를 커널에 도입했다. 바닐라 커널이 커널 모드와 사용자 모드를 지원하는 곳에, KVM은 게스트 모드를 도입한다. 게스트 모드는 모든 비 I/O 게스트 코드를 실행하는데 사용되고, 여기에서 일반 사용자 모드는 게스트용 I/O를 지원한다.

KVM을 도입했다는 것은 리눅스에 있어서 중요한 진보이다. 첫 번째 가상화 기술이 주류 리눅스 커널의 일부가 되었음을 시사하기 때문이다. 이것은 2.6.20 트리에 존재하지만, 2.6.19 커널용 커널 모듈로서 사용될 수 있다. 가상화를 지원하는 하드웨어에서 실행될 때, Linux (32-bit와 64-bit)와 Windows (32-bit) 게스트가 지원된다. KVM에 대한 자세한 내용은 참고자료 섹션을 참조하라.

요약

“새롭다”는 것의 의미가 40년이나 오래된 것까지 포괄할 수 있다면 리눅스 가상화는 분명 새로운 것이다. 그 동안 많은 정황들 속에서 사용되었지만, 이 글에서는 서버와 OS들의 가상화에 대해 설명했다. 리눅스의 경우, 가상화는 성능, 이식성, 유연성 측면에서 많은 옵션들을 제공하기 때문에 자신의 애플리케이션에 가장 잘 맞는 방식을 선택할 수 있다.
서진우

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

페이스북/트위트/구글 계정으로 댓글 가능합니다.