QEMU 란?

zerolism ㅣ 2012. 11. 6. 14:08

SMALL

QEMU는 완벽한 PC를 위한 오픈 소스 에뮬레이터입니다. 프로세서를 에뮬레이션하는 이외에 QEMU는 네트워크, 비디오 하드웨어와 같은 필요한 모든 하위 시스템을 흉내냅니다. 또한 (255개 CPU까지 지원하는) SMP와 같은 최신 개념, ARM이나 PowerPC와 같은 다른 프로세서 아키텍처도 에뮬레이션합니다. 이 기사는 QEMU와 아키텍처, 리눅스(Linux®) 호스트에서 게스트 운영체제를 에뮬레이션하는 방법을 설명합니다.

 

QEMU는 무엇인가?

가상화가 오늘날 뜨거운 관심을 받는 기술이라 말하면 이는 아주 공손한 표현이다. 오늘날 구글에서 가상화(virtualization)라는 단어를 검색해보면 1800만 건이 넘게 나온다. 예를 들어, 한 달 동안에, EMC는 VMware 상장을 발표했고, Citrix System은 혜성처럼 등장한 가상화 신생 기업인 XenSource 구입 계획을 밝혔다. 새로운 틈새는 알고 보니 엄청난 규모를 자랑하는 대중적인 시장이라는 사실이 속속 밝혀지고 있다. 하지만 오늘날 가상화를 둘러싼 상장이나 흡수 합병 소식을 듣다 보면 몇몇 다른 가상화 기술이 이미 우리 곁에 와 있다는 사실을 잊어버리기 쉽다.

이 기사에서는 오늘날 뉴스 머리 기사를 장식하지는 못하지만 가장 흥미로운 가상화 응용 프로그램으로 알려진 QEMU를 설명한다. QEMU는 다양한 설정을 지원하는 응용 프로그램이다. 게스트 운영체제 가상화로 사용하거나 호스트 CPU나 다른 CPU 아키텍처를 목표로 운영체제를 돌리는 완벽한 에뮬레이터로 사용할 수도 있다.

가상화에 대한 간단한 소개

QEMU를 위한 무대를 마련하기 위해 가상화에 대한 간단한 소개부터 시작하자.

이 기사 맥락에서 가상화는 실제로 플랫폼 가상화다. 물리적인 하드웨어에서 제어 소프트웨어는 호스트 운영체제나 하이퍼바이저가 될 수 있다(그림 1 참조). 몇몇 경우에는 호스트 운영체제가 하이퍼바이저다. 게스트 운영체제는 하어퍼바이저에 자리잡는다. 어떤 경우에는 게스트 운영체제가 제어 소프트웨어와 동일한 CPU를 대상으로 하고, 어떤 경우에는 다른 CPU를 대상으로 한다(예를 들어, x86 하드웨어에서 동작하는 PowerPC 게스트를 생각해보자).


그림 1. 플랫폼 가상화의 기본 아키텍처
그림 1. 플랫폼 가상화의 기본 아키텍처

다양한 방식으로 가상화를 달성하지만, 가장 흔히 세 가지 중요한 가상화 방법을 사용한다. 첫 번째 방법은 완전 가상화다. 완전 가상화에서는 게스트 운영체제에서 물리 하드웨어를 분리하는 식으로 하이퍼바이저가 격리를 위한 기본 구성 요소를 구현한다. 이는 1966년 IBM® CP-40 가상 기계/가상 메모리 운영체제에서 처음으로 시연되었고, VMWare ESX 서버도 사용하는 개념이다.

또 다른 인기있는 가상화 기법은 의사 가상화다. 의사 가상화에서는 제어 프로그램이 게스트 운영체제가 사용하는 하이퍼바이저 API(Application Program Interface)를 구현한다. 의사 가상화는 Xen과 리눅스 KVM(Kernel-based Virtual Machine) 양쪽에서 사용한다.

세 번째로 유용한 기법은 에뮬레이션이다. 에뮬레이션은 이름이 의미하듯이 완벽한 하드웨어 환경을 에뮬레이션하는 방법으로 게스트 플랫폼을 가상화한다. 에뮬레이션은 다양한 방법으로 구현이 가능하며, 심지어 같은 소프트웨어 내에서도 자신을 돌리는 작업도 가능하다. 에뮬레이션을 통한 가상화 예는 QEMU와 Bochs다.


QEMU 아키텍처

QEMU로 가상화를 달성하는 방법을 살펴보자. 이 절에서는 QEMU 운영 모드 두 가지와 QEMU 동적 변환기에 대한 몇 가지 흥미로운 측면을 설명한다.

기본 QEMU 운영 모드

QEMU는 사용자 모드 에뮬레이션과 시스템 모드 에뮬레이션이라는 두 가지 운영 모드를 지원한다. 사용자 모드 에뮬레이션은 (호스트 CPU로 동적 변환 과정을 수행하고 리눅스 시스템 호출을 적절히 바꾸는 방법으로) 특정 CPU용으로 만들어진 프로세스를 다른 CPU에서 수행하도록 만든다. 시스템 모드 에뮬레이션은 프로세서와 관련 주변 장치를 포함한 전체 시스템을 에뮬레이션하도록 만든다.

x86 코드를 x86 호스트 시스템에서 에뮬레이션할 때 QEMU 가속기라는 컴포넌트를 사용해서 거의 실제 기계에서 동작하는 성능을 발휘한다. 이 가속기는 (커널 모듈을 통해 리눅스에서) 에뮬레이션하는 코드를 호스트 CPU에서 직접 실행한다.

하지만 기술 관점에서 QEMU를 흥미롭게 만드는 요소는 빠르고 이식성이 높은 동적 변환기다. 동적 변환기는 에뮬레이션을 제공하기 위해 목표(게스트) CPU를 호스트 CPU용 명령으로 실행 중에 바꿔준다. (특정 CPU에서 다른 CPU로 명령을 하나씩 사상하는) 단순무식한 방식을 동원하지만, 항상 쉬운 작업만은 아니며, 몇몇 경우에는 변환 대상 아키텍처에 기반을 두고 행동 방식을 바꾸거나 여러 명령어를 요구하는 경우도 있다.

QEMU는 목표 명령어를 우선 마이크로 연산자로 바꾸는 방식으로 동적 변환을 수행한다. 이 마이크로 연산자는 목적 파일로 컴파일된 C 코드 조각이다. 그리고 나서 핵심 변환기가 만들어진다. 핵심 변환기는 목표 명령어를 동적 변환을 위한 마이크로 연산자로 사상한다. 효율도 높을 뿐더러 호환성도 좋다.

QEMU에서 제공하는 동적 변환기는 또한 변환 부하를 최소로 만들기 위해 변환될 코드 블록을 캐시한다. 목표 코드 블록을 처음 만나면, 이 블록을 변환한 다음 변환 형식으로 저장한다. QEMU는 가장 최근에 사용된 변환 블록을 16MB 블록에 캐시한다. 심지어 QEMU는 캐시에 있는 변환된 블록을 무효화하는 방법으로 자기 자신을 변경하는 코드도 지원한다.

QEMU와 동적 변환기에 대한 내부 설명이 궁금하면 Fabrice Bellard가 작성한 흥미로운 논문을 (QEMU 저자인) 참고자료 절에서 찾은 다음 읽어보기 바란다.

지원하는 주변 장치

PC 시스템 에뮬레이터로 QEMU는 다양한 주변 장치를 제공한다. 예상되는 표준 주변 장치는 VGA(Video Graphics Array) 에뮬레이터, PS/2 마우스와 키보드, IDE(Integrated Development Environment) 하드 디스크와 CD-ROM 인터페이스 에뮬레이션을 포함한다. 추가로 QEMU는 NE2000 PCI(Peripheral Controller Interconnect) 네트워크 어댑터, 직렬 포트, 다양한 사운드 카드, (가상 USB 허브와 함께) UHCI(PCI Universal Host Controller Interface) USB(Universal Serial Bus) 컨트롤러를 위한 에뮬레이션을 포함한다. 또한 255개 CPU까지 프로세서 SMP(Symmetric MultiProcessing)를 지원한다.

표준 PC나 ISA PC(PCI 버스 없이)를 에뮬레이션하는 이외에, QEMU는 또한 ARM Versatile 기본 보드(926E를 활용하는)나 MIPS 보드와 같은 PC 하드웨어가 아닌 다른 하드웨어도 에뮬레이션할 수 있다. 파워 매킨토시 G3와 sun4u를 포함한 다른 다양한 플랫폼도 지원 작업을 진행하는 중이다.


QEMU 빌드와 설치

QEMU 빌드와 설치 작업은 표준 GNU 도구를 사용하므로 예상처럼 간단하다. QEMU 배포판을 내려받아 압축을 풀고, configure, make, make install만 하면 끝난다(Listing 1 참조).


Listing 1. QEMU 에뮬레이터 빌드하기

                
$ wget http://fabrice.bellard.free.fr/qemu/qemu-0.9.0.tar.gz
$ tar xfvz qemu-0.9.0.tar.gz
$ cd qemu-0.9.0
$ ./configure
$ make
$ make install
$

이런 과정을 마치면 현재 목표 아키텍처를 위한 qemu 실행 이미지뿐만 아니라 ARM, MIPS, PowerPC, 68k, SPARC을 포함한 다른 아키텍처용 이미지 집합도 만들어진다. 이렇게 얻은 이미지로 다양한 아키텍처용으로 만들어진 리눅스 커널을 시작할 수 있다.

호스트와 게스트 운영체제가 동일한 프로세스 아키텍처를 대상으로 한다면, QEMU 가속기(KQEMU)를 사용해서 거의 실제 기계에 버금가는 속력을 올릴 수 있다. KQEMU는 (리눅스를 위한 커널 모듈) 드라이버로 사용자 영역 코드와 커널 코드가 호스트 CPU에서 직접 실행하도록 만든다. QEMU 가속기는 QEMU 자체 빌드와 똑같은 방법으로 빌드한다(Listing 2 참조).


Listing 2. QEMU 가속기 빌드하기

                
$ wget http://fabrice.bellard.free.fr/qemu/kqemu-1.3.0pre11.tar.gz
$ tar xvfz kqemu-1.3.0pre11.tar.gz
$ cd kqemu-1.3.0pre11
$ ./configure
$ make
$ make install

마이크로소프트(Microsoft®), FreeBSD®, 리눅스와 같은 다양한 운영체제에서 KQEMU를 컴파일하고 설치할 수 있다. QEMU 가속기 빌드가 끝나면, 다음 명령을 사용해 리눅스에서 설치하자.

$ insmod kqemu.ko
$


QEMU 활용하기

이제 QEMU를 활용해서 전형적인 데스크톱 GNU/리눅스 환경에서 다른 기계를 가상화하는 방법을 살펴보자. 다른 기계를 에뮬레이션하는 작업은 새로운 컴퓨터를 설치하는 방법과 비슷하다. 첫 단계는 운영체제 설치다. 새로운 컴퓨터는 운영체제를 설치할 공간이 있어야 하므로 하드 디스크가 필요하다.

QEMU는 qemu-img라는 하드 디스크 생성을 위한 특수 명령을 제공한다. 이 유틸리티는 다양한 형식으로 이미지를 만들 수 있는데, (qemu 용으로) 가장 좋은 형식은 qcow(qemu copy-on-write)다. 이 형식을 사용할 경우 디스크 이미지 크기가 이미지를 표현하는 물리 파일 이미지 크기와 같을 필요가 없다는 장점이 있다. 다시 말해, qcow 형식은 비어 있는 파일 시스템으로 좀더 조밀한 디스크 이미지를 만들어낸다. 예를 들어, 비어 있는 4GB짜리 디스크 이미지는 단지 16KB만 차지한다.

qemu-img는 생성(새로운 디스크 이미지 생성), 포맷(qemu 이미지 형식을 위한 qcow), 디스크 이미지 크기와 이름 확인 같은 기능을 제공한다. 플래시에서 사용하기 위해 작은 리눅스 배포판을 탑재한 기계를 에뮬레이션하려면 128MB짜리 디스크 이미지를 생성한다.

$ qemu-img create -f qcow disk.img 128M
Formating 'disk.img', fmt=qcow, size=131072 kB
$

윈도우, 리눅스, FreeBSD와 같은 범용 운영체제를 설치할 계획이라면, 좀 더 큰 디스크가 필요하다는 사실을 염두에 두자. 이런 명령 결과로 만들어지는 파일은 disk.img이며 에뮬레이션 과정에서 128MB짜리 디스크로 잡힌다.

하드 디스크를 만들었다면 여기에 새로운 운영체제를 설치한다. 예제 설명 목적으로, cfLinux라는 좀 더 작은 리눅스 배포판을 사용할 계획이다. cfLinux는 게이트웨이, 무선 접속 포인트, 방화벽, 라우터에 적합한 작은 임베디드 리눅스 기반 시스템이다. wget을 사용해 ISO 형식으로 만들어진 배포판을 내려받자.

wget ftp://ftp.cflinux.fu/pub/cflinux/iso/cflinux-1.0.iso

ISO 이미지는 공통 CD-ROM 형식이다(ISO 9660 파일 시스템으로도 알려져 있다).

이제 disk.img라는 에뮬레이션되는 디스크와 운영체제를 설치할 CD-ROM을 확보했다. 다음 단계는 하드 디스크에 운영체제 설치다. qemu를 사용해 다음과 같이 간단한 명령을 수행한다.

$ qemu -hda disk.img -cdrom /root/cflinux-1.0.iso -boot d
$

qemu 명령을 내릴 때 hda 옵션으로 하드 디스크 이미지를, cdrom 옵션으로 cdrom(ISO 이미지가 들어있는 파일)을 지정한다. 여기서는 boot 옵션을 지정하여 CD-ROM에서 시작하도록 만든다. 인수 d는 CD-ROM에서 시작하도록, 인수 a는 플로피에서, 인수 c는 하드 디스크(기본값)에서, 인수 n은 네트워크를 통해 시작하도록 지정한다. 이 명령을 내리면, 에뮬레이션 중인 기계를 대표하는 새로운 QEMU 윈도우가 화면에 뜬다(그림 2 참조).


그림 2. QEMU로 에뮬레이션되는 디스크에 cfLinux 설치 준비하기
그림 2. QEMU로 에뮬레이션되는 디스크에 cfLinux 설치 준비하기

CD-ROM에 탑재된 배포판 설치 과정을 따라서, 에뮬레이션된 하드 디스크에 ISO 이미지를 완벽하게 설치를 마친다. 설치가 끝나면 재시동이 필요하다. 이 시점에서 에뮬레이션을 끝낼 수 있다(qemu 윈도우에서 Ctrl-C를 누른다). 다음 명령으로 완전히 새로 설치한 운영체제로 컴퓨터를 시작하자.

$ qemu -hda disk.img
$
      

이 명령은 단순히 disk.img 이미지 파일이 지정한 하드 디스크로 표준 PC(기본 옵션)를 에뮬레이션하라고 지시한다. 리눅스 이미지는 에뮬레이션 중인 하드 디스크에서 시작해서 QEMU 윈도우에 올라온다. 그림 3을 참조하자.


그림 3. 새로 설치된 cfLinux를 에뮬레이션 중인 하드 디스크에서 시작하기
그림 3. 새로 설치된 cfLinux를 에뮬레이션 중인 하드 디스크에서 시작하기

더 이상 간단할 수 없다. 실제로 (리눅스 배포판, 윈도우 등) 다양한 운영체제를 설치해서 시작하기 위해 똑같은 방법을 적용할 수 있다.

Other emulators

비록 QEMU가 환상적인 에뮬레이션 환경이지만 다른 에뮬레이터도 연구할 가치가 있다. Wine은 윈도우 API를 오픈 소스 모델로 구현한 소프트웨어로, 윈도우 운영체제 없이 윈도우 프로그램을 돌리도록 만들어준다. 하지만 Wine Is Not an emulator라는 Wine 두문자어가 설명하듯, Wine은 에뮬레이터가 아니다. 대신 Wine은 x86 아키텍처를 위한 응용 프로그램 실행을 허용하는 API 집합을 구현했다. 이렇기 때문에 Wine에서 돌아가는 응용 프로그램은 잘 실행되는 편이다.

QEMU와 비슷한 에뮬레이터는 Bochs다. Bochs는 인텔(Intel®) i386™, i486™, 펜티엄(Pentium®), 펜티엄 프로, AMD64 CPU뿐만 아니라 디스크, 메모리, 디스플레이, 네트워크 장비와 같은 공통 PC 주변기기도 에뮬레이션한다. Bochs는 리눅스, 도스, 윈도우 95/98/XP/2000/NT® 운영체제를 에뮬레이션하기 위해 사용한다.


한걸음 더 나가면

QEMU를 에뮬레이터로 사용하면, 하드웨어 여분이 없더라도 다양한 운영체제를 경험해볼 수 있다. 좋은 예제가 ReactOS인데, 오픈 소스 윈도우 XP 호환 운영체제다(에뮬레이션 모습은 그림 4에 나와 있다). ReactOS는 윈도우 XP와 이진 호환성을 목표로 만들어지므로 윈도우 XP용으로 만들어진 응용 프로그램을 바로 ReactOS에서 돌릴 수 있다. 현재 지원하는 응용 프로그램 호환 목록은 참고자료 절을 참조하기 바란다.


그림 4. ReactOS를 위한 표준 PC 에뮬레이션하기
그림 4. ReactOS를 위한 표준 PC 에뮬레이션하기

Free Operating Systems Zoo(참고자료 절 참조)에서 ReactOS와 기타 운영체제용 QEMU 이미지를 찾아보자. 이 사이트는 라이브 CD 이미지, 플로피 이미지, (qcow 형식으로 만들어진) 디스크 이미지를 포함한다. QEMU는 설치에 필요한 시간 낭비 없이 새로운 운영체제 실험이 가능한 훌륭한 도구다.


참고자료

교육

제품 및 기술 얻기

  • QEMU 오픈 소스 프로세서 에뮬레이터와 QEMU 가속기는 Fabrice Bellard가 운영하는 웹 사이트에서 내려받는다. 그리고 나서 문서, API, QEMU 현재 상태를 확인한다.

  • cfLinux에 대한 정보: 저자는 이 조그마한 배포판으로 QEMU 기계에 운영체제를 설치하는 방법을 보여준다.

  • Free Operating Systems Zoo에서 미리 패키지가 끝난 이미지를 구해서 시간을 절약하자. 이 사이트에서는 표준 리눅스 배포판부터 (Plan 9, 오픈솔라리스, MINIX, ReactOS, 다윈, MenuetOS 등) 색다른 운영체제 배포판에 이르기까지 다양한 운영체제 이미지를 제공한다. 디스크 이미지를 내려받은 다음에 이 디스크 이미지로 가상 기계에서 바로 시동을 걸어보자.

  • ReactOS는 오픈 소스 윈도우 이진 호환 운영체제로 많은 윈도우 응용 프로그램 수행을 지원한다.

  • Wine은 리눅스와 같은 윈도우 운영체제가 아닌 운영체제에서 윈도우 응용 프로그램 실행을 지원하는 소프트웨어다.

  • Bochs는 완벽한 시스템 에뮬레이션을 제공하는 소프트웨어로 QEMU와 비슷하다.

  • IBM 평가판 소프트웨어: developerWorks에서 직접 내려 받아 다음번 리눅스 프로젝트에 활용하자.

토론

필자소개

M. Tim Jones 사진

M. Tim Jones는 임베디드 소프트웨어 아키텍트이자 GNU/Linux Application Programming, AI Application Programming, BSD Sockets Programming from a Multilanguage Perspective의 저자이기도 한다. Jones의 공학 배경은 정지 위성을 위한 커널 개발에서 시작해 임베디드 시스템 아키텍처와 네트워크 프로토콜 개발에 이르기까지 다양한 분야를 아우른다. Jones는 콜로라도 주, 롱몬트 소재 Emulex 사에서 컨설턴트 엔지니어로 활약한다.

 

 

출처 : http://www.ibm.com/developerworks/kr/library/l-qemu/

LIST