[ 一日30分 인생승리의 학습법] Qemu를 이용한 가상화 기초

1. QEMU에 관심을 가진 이유

지금 uCloud의 프로젝트를 진행하고 있습니다. uCloud는 Xen을 기반으로 하고 있는데, Xen은 반가상화와 전가상화 (HVM)를 모두 지원합니다. Xen은 완전 가상화를 위해서 Qemu를 이용합니다. 결국 Xen 전 가상화를 이해하려면 Qemu를 살펴봐야 되겠다는 생각이 들더군요. Qemu를 살펴보게된 이유입니다.

 

2. QEMU에 대하여

Qemu는 PC 환경을 위한 프로세스 에뮬레이터로 프로세스뿐만 아니라 각종 주변기기까지를 에뮬레이터 합니다. 하나의 가상 컴퓨터를 구축해 주는 소프트웨어입니다. vmware, Xen, Virtualbox와 같은 가상화(:12) 솔루션의 하나로 보시면 됩니다.

 

Qemu는 HVM 방식을 지원합니다. Guest 운영체제가 하드웨어 자원에 대한 접근을 요청할 때, 이 요청을 Qemu로 요청을 보냅니다. 요청을 받은 Qemu는 이명령을 변환해서 하드웨어로 전달을 해서 요청을 처리합니다. 완전한 하드웨어 애뮬레이션 위에서 guest 운영체제가 작동하는 방식이기 때문에, 커널 수정 없이 운영체제를 돌릴 수 있다는 장점이 있습니다. 진정한 하드웨어 가상 머신이라고 볼 수 있는 거죠.

 

대신 Qemu가 애뮬레이션하는 하드웨어의 지원 범위에 따라서 guest 운영체제의 성능이 제한될 수 있다는 장점이 있습니다. 예컨데 10 Gbits/sec의 대역폭을 가진 네트워크 디바이스가 꽂혀있다고 하더라도, Qemu가 100 Mbits/sec의 대역폭을 가지는 rtl8139 디바이스를 지원한다면 guest 운영체제는 100 Mbits의 대역폭만 사용할 수 있을 따름입니다.

 

XenServer의 경우 rtl8139만을 사용하도록 하드코딩된 Qemu를 사용합니다. 때문에 전가상화로 올라간 운영체제는 100Mbits/sec의 대역폭만을 사용할 수 있습니다. 왜 하드코딩을 했는지 모르겠습니다. 최근 출시된 Xenserver 6.0은 어떨지 모르겠습니다.

 

2.1. Qemu와 KVM

KVM은 리눅스 커널기반의 HVM 방식을 지원하는 하이퍼바이저로 유저 영역에서 가상화 기능을 사용할 수 있습니다. HVM을 위해서는 애물레이션이 필요한데, Qemu를 사용하고 있습니다. KVM의 가장 중요한 구성요소라고 할 수 있습니다. 커널 2.6.20 부터 리눅스 커널에 포함됐습니다. KVM을 한다는 것은 Qemu를 한다는 것과 동일하다고 보시면 됩니다. 실제 /usr/bin/kvm은 qemu의 심볼릭 링크입니다.

 
$ ls -al /usr/bin/kvm
lrwxrwxrwx 1 root root 18 4 13 07:02 /usr/bin/kvm -> qemu-system-x86_64
 
 
 
 

 

3. QEMU 설치

qemu 설치 환경입니다.

  • ubuntu 11.10 i386

개발 용도로 사용하는 리눅스 노트북에 설치한 운영체제입니다.

  • kernel : 3.0.0-13-generic

우분투 패키지 관리자로 qeme를 설치합니다.

 
# apt-get install qemu
 
 
 
 

qemu를 설치하면 아래와 같은 부가 패키지들이 함께 설치됩니다.

  • bridge-utils
  • libaio1
  • qemu-common
  • qemu-kvm
  • seabios
  • vgabios

4. GUEST 운영체제 올리기

먼저 guest 운영체제를 올릴 디스크 이미지를 만듦니다. 디스크 이미지의 형식은 vdi로 선택했습니다. vdi는 virtualbox에서 사용하는 가상 디스크 형식입니다. 4기가 바이트 크기로 만들었습니다.

 
# qemu-img create -f vdi ubuntu11-server.vdi 4G
 
 
 
 

 

앞서 만든 디스크 이미지에 우분투 리눅스를 설치합니다. cdrom 형식으로 iso 파일을 읽도록 했습니다.

 
# qemu-system-i386 -cdrom ubuntu-11.04-server-i386.iso -k en-us ubuntu11-server.vdi
qemu-system-i386: pci_add_option_rom: failed to find romfile "pxe-rtl8139.bin"
 
 
 
 

설치는 잘 되는데, "pxe-rtl839.bin" 롬파일을 찾지 못했다는 메시지가 거슬립니다. guest 운영체제에서 이더넷 카드를 사용하려면 해당 롬파일을 올려야 합니다. kvm-pxe 패키지를 설치하면 됩니다. rtl8139를 비롯해서 몇 개의 이더넷 카드 롬이 함께 설치되는 군요.

 
# sudo apt-get install kvm-pxe
# dpkg -L kvm-pxe
/usr/share/qemu/pxe-rtl8139.bin
/usr/share/qemu/pxe-pcnet.bin
/usr/share/qemu/pxe-virtio.bin
/usr/share/qemu/pxe-ne2k_pci.bin
/usr/share/qemu/pxe-e1000.bin
 
 
 
 

 

설치를 끝내고 guest 운영체제를 실행했습니다.

 
$ qemu-system-i386 -k en-us ubuntu11-server.vhd
 
 
 
 
보낸 사람 Linux

 

4.1. 지원하는 vhd 형식

qemu에서 지원하는 vhd 형식입니다.

  • raw
  • cloop
  • cow

copy-on-write 형식으로 윈도우 Qemu에서는 사용할 수 없습니다. 역사적인 이유로 지원한다는 걸로 봐서 그다지 사용하지 않는 형식인 것 같습니다.

  • qcow2
  • vmdk

VMware의 vhd 형식

  • vdi

virtualbox의 vhd 형식

 

4.2. 이미지 생성과 관리

게스트 운영체제를 만들기 위해서는 게스트 운영체제를 올리기 위한 디스크가 있어야 합니다. 이미지는 qemu-img로 만들 수 있습니다. qcow2 형식의 3G이미지를 만들었습니다.

 
# qemu-img create -f qcow2 myLinux.img 3G
 
 
 
 

 

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

이제 만든 디스크에 운영체제를 설치하면된다. 운영체제를 설치하는 가장 손쉬운 방법은 iso 파일을 cdrom에 구워서 부팅하는 것이다. ubuntu-server-11.10.iso를 설치하는 방법으로, 설치시 사용할 메모리로 256M을 할당했다.

 
# qemu -m 256 -hda myLinux.img -cdrom ubuntu-server-11.10.iso -boot d
 
 
 
 

 

iso 파일이 아닌, 컴퓨터 시스템의 CD나 DVD를 이용해서 설치할 수도 있습니다.

 
# qemu -m 256 -hda myLinux.img -cdrom /dev/cdrom -boot d
 
 
 
 

 

4.3. 여러 이미지 사용하기

Qemu는 게스트 운영체제에 최대 4개의 이미지 파일을 줄 수 있습니다. 이들 이미지 파일은 다음의 용도로 사용할 수 있습니다.

  • 추가적인 물리 디스크
  • 만약 호스트 운영체제가 여러 개의 디스크를 가지고 있다면, 이미지 파일을 물리적으로 분산할 수 있을 겁니다. 그러면 게스트 운영체제에도 물리적으로 나뉜 디스크를 제공할 수 있습니다. aa
     
    # qemu -m 256 -hda myLinux.img -hdb temp.img -hdc db.img
     
     
     
     

4.4. Copy on Write

Copy on Write는 컴퓨터 공학의 여러 분야에서 사용 합니다. fork에서 자식 프로세스를 만들기 위해서 사용하며, STL의 string에서 문자열 복사에도 사용하죠. 데이터 변경이 일어나면, 변경이 일어난 부분을 다른 부분에 복사한 다음 쓰는 방식입니다. 소프트웨어 개발에서는 메모리를 대상으로 하겠고, 파일 시스템이라면 디스크를 대상으로 합니다.

 

Qemu의 "cow"와 "qcow2"는 copy on write를 지원하는 디스크 포멧으로, 원본 디스크 이미지를 copy on write 방식으로 해서 새로운 디스크 이미지를 생성할 수 있습니다. 주로 소프트웨어 개발과 테스팅을 위한 개발 환경을 만들기 위해서 사용합니다. 원본 디스크 이미지에 개발 환경을 세팅해 놓은 다음 copy on write 이미지를 생성하면, 원본 개발환경을 그대로 유지한체 다양한 방식으로 테스트 할 수 있기 때문입니다.

 

ubunt11-server 이미지로 웹서버용 테스트 이미지인 ubunt11-webserver.img를 만들었습니다. -b 옵션뒤에 원본 이미지를 명시하면 됩니다.

 
$ qemu-img create -f qcow2 -b ubuntu11-server.vdi ubuntu11-webserver.img
 
 
 
 

테스트를 해본결과, 디스크 용량을 크게 줄일 수 있지만 상당히 느리다는 느낌을 받았습니다. 디스크 공간을 낭비하더라도 원본을 복사해서 사용하는게 낫다는 생각입니다.

 

4.5. 디스크 이미지 마운트 하기

때때로 디스크 이미지를 호스트에서 마운트해서 사용해야할 때가 있습니다. 예를 들어 게스트 운영체제가 네트워크에 연결되지 않았는데, 파일을 옮겼으면 할 때가 있습니다. 혹은 패스워드를 잃어버려서 초기화하는 등의 작업도 필요합니다. 이럴 때 디스크 이미지를 loopback로 마운트 해서 파일 작업하듯 작업하면 됩니다. .

 
# mount -o loop,offset=32256 Centos.img /mnt/mpoint
 
 
 
 

하지만 디스크 이미지가 LVM등을 사용하고 있다면 mount 명령으로 마운트할 수 없습니다. 이 경우 qemu-nbd 명령을 이용해야 합니다.

 
# modprobe nbd max_part=16
# qemu-nbd -c /dev/nbd0 Centos.img
# partprobe /dev/nbd0
 
 
 
 

 

이제 fdisk로 Centos.img 디스크의 파티션 정보를 확인할 수 있습니다.

 
# fdisk /dev/nbd0
 
Command (m for help): p
 
Disk /dev/nbd0: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders, total 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0009a4f6
 
Device Boot Start End Blocks Id System
/dev/nbd0p1 * 2048 1026047 512000 83 Linux
/dev/nbd0p2 1026048 4194303 1584128 8e Linux LVM
 
 
 
 

nbd0p2는 LVM 파티션이므로 mount 명령으로 마운트 할수 없습니다. LVM 명령을 이용해서 마운트 해야 합니다.

 
# vgscan
Reading all physical volumes. This may take a while...
Found volume group "CentOSVolGroup" using metadata type lvm2
 
 
 
 

 

볼륨 그룹이름으로 mount 합니다.

 
# mount /dev/CentOSVolGroup/lv_root /mnt/mpoint2/
# cp mydata.txt /mnt/mpoint2/home/yundream
 
 
 
 

 

4.6. 이미지 정보 얻기

 
# qemu-img info CentOS.img
image: CentOS.img
file format: raw
virtual size: 2.0G (2147483648 bytes)
disk size: 1.1G
 
 
 
 

 

5. QEMU와 HVM

Xen과 KVM은 Qemu를 이용해서 전가상화를 구현하고 있습니다. virtualbox의 경우 운영체제 레벨에서 전가상화를 지원하는데, 역시 QEMU를 이용하고 있습니다. Xen, KVM, VirtualBox의 구조에 대해서는 따로 위키페이지를 만들어서 공부해볼 생각입니다.

 

6. 리눅스 KVM과 QEMU

리눅스는 KVM이라는 커널레벨의 가상화 환경을 지원합니다. 원래는 커널 패치형태로 지원이 됐는데, 2.6.20 버전부터 정식으로 커널에 포함됐으며, 공식 리눅스 패키지의 일부로 제공되고 있습니다. KVM은 Qemu를 기반으로 구현돼 있습니다.

 

 

7. 다음에 하고 싶은 것들

  1. 리눅스 KVM
  2. Qemu 네트워크

8. 참고 문헌

  1. Qemu 네트워크
  2. http://wiki.qemu.org

9. 히스토리

  • 2011년 12월 3일

[출처] https://www.joinc.co.kr/w/Site/cloud/Qemu/Basic

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
1115 [ 一日30分 인생승리의 학습법] 2023 네이버 다이어리 굿노트 템플릿으로 심플하게 새해 계획 file 졸리운_곰 2023.01.07 15
1114 [ 一日30分 인생승리의 학습법] 프로그래밍 스킴 Scheme 1 다운로드부터 문법 대부분을 314초만에 알려줄게요 졸리운_곰 2023.01.05 5
1113 [ 一日30分 인생승리의 학습법] ROBOCOPY(로보카피) 사용법 file 졸리운_곰 2023.01.05 10
1112 [ 一日30分 인생승리의 학습법] PHP, VBA and SQL Useful Scripts PHP, VBA 및 SQL 유용한 스크립트 file 졸리운_곰 2023.01.01 7
1111 [ 一日30分 인생승리의 학습법] KoELECTRA로 기계독해(MRC) API 개발 file 졸리운_곰 2023.01.01 7
1110 [ 一日30分 인생승리의 학습법] 일 안 해도 생기는 수입? 그런 ‘패시브 인컴’은 없다 file 졸리운_곰 2023.01.01 6
» [ 一日30分 인생승리의 학습법] Qemu를 이용한 가상화 기초 file 졸리운_곰 2022.12.31 5
1108 [ 一日30分 인생승리의 학습법] 파이토치로 딥러닝해야 하는 5가지 이유 졸리운_곰 2022.12.31 6
1107 [ 一日30分 인생승리의 학습법] 왜 ‘한국어’의 자연어처리(NLP)는 유독 어려울까? file 졸리운_곰 2022.12.31 10
1106 [ 一日30分 인생승리의 학습법] MinIO Windows Service 등록 졸리운_곰 2022.12.24 7
1105 [ 一日30分 인생승리의 학습법] Apache 2.2에서 2.4로 마이그레이션 시 발생하는 에러 및 해결책 정리 졸리운_곰 2022.12.18 6
1104 [ 一日30分 인생승리의 학습법] Git 사용 방법 정리(commit, push, pull request, merge 등) 졸리운_곰 2022.12.04 18
1103 [ 一日30分 인생승리의 학습법] [웹 기획] 화면 설계 용어 - 와이어프레임, 스토리보드, 프로토타입의 차이점 file 졸리운_곰 2022.12.03 6
1102 [ 一日30分 인생승리의 학습법] REST API 설계 (네이밍) 졸리운_곰 2022.11.26 24
1101 [ 一日30分 인생승리의 학습법] REST API URI 규칙 졸리운_곰 2022.11.26 12
1100 [ 一日30分 인생승리의 학습법 ] REST API URL 규칙 졸리운_곰 2022.11.26 9
1099 [ 一日30分 인생승리의 학습법 ] prolog 문법 : Prolog Syntax 졸리운_곰 2022.11.21 3
1098 [ 一日30分 인생승리의 학습법 ] noVNC 작동원리 file 졸리운_곰 2022.11.16 8
1097 [ 一日30分 인생승리의 학습법 ] 프로젝트 만들고 GitHub에 첫 Commit하고 Push하기 file 졸리운_곰 2022.11.15 4
1096 [ 一日30分 인생승리의 학습법 ] 우분투(리눅스) 에서 EBS 라디오 자동녹음 만들기 졸리운_곰 2022.11.11 9
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED