##### 가상화


가상화 != 에뮬레이션




1. Application 가상화

~ JVM


2. H/W 가상화

~ Hypervisor


3. Desktop 가상화

~ VNC, X-Window, Remote Desktop, Virtua Box, VMware, ...


4. Network 가상화

~ VPN, VLAN, SDN, ...


- 가상 NIC, 고유한 MAC addres 제공(IEEE에 등록된 실제 MAC) 

- 가상 스위치와 Auto Negotiation으로 연결

- 가상 Switch(MAC기반의 L2 스위치)

- Port Group (가상머신용, 서비스콜용, VMKernel용)


5. Server 가상화

~ 하드웨어 에뮬레이션, 전가상화/반가상화/OS자체 가상화



- Full-Virtualization : Guest OS는 하이퍼바이저의 존재를 알지 못함. Binary Transration기법으로 가상화

- Para-Virtualization : 하이퍼바이저에서 인식이 가능한 시스템콜(hyper-call)을 사용해 가상화

but, Windows에서는 커널 내부에 hypercall을 처리하지 않으므로 Guest OS커널을 수정해야 할 필요가 있음

=> Intel-VT, AMD-V 등 하드웨어 지원기술이 생김

but, H/W바로위에서 작동이 안되는 문제가 있음

=> VMI (Virtual Machine Interface) 등장


< 메모리 가상화 >

- PTE, Page Table Entry

- MMU (Memory Management Unit)

- TLB(Translation Looaside Buffer)


=> VMware의 VMKernel은 이 세가지를 Shadow Page Table로 관리한다. 

이 기능이 추후 memory overcommit기술로 발전한다.


a. TPS (Transparent Page Sharing)

: VM들이 사용하는 파일 중 공유 가능한 것들(겹치는 것들)을 공유할 수 있도록 하는 기술

작동중인 VM 몇개를 뽑아서 게스트 물리메모리 기반으로 Hashing을 수행함.

이를 Host의 물리메모리와 비교하여 같은 경우에 매핑주소를 수정하여 공유하도록 함


b. Memory Ballooning

- VMware Tool 중에 vmmenctl(메모리 컨트롤러 드라이버)

VMKernel과 private 채널로 메모리 상황을 공유

-  Host의 물리 메모리 부족 시, VM 들에게 있는 각 vmmenctl 드라이버에게 메모리 팽창을 요구

- VM들은 영문은 모르지만 일체 swapping을 수행하여 물리메모리를 확보


c. 하이퍼바이저 스와핑

: 가상머신 생성시, 메모리와 동일한 크기의 스왑파일을 생성하여 물리메모리 부족시 스와핑 수행


6. 스토리지 가상화

 ~ VMFS, VMDK, 논리적인 스토리지 pool 사용





##### QEMU


- 고속의 동적바이너리 변환기법(Dynamic Binary Translation)을ㅠ 사용

- x86이 아닌 하드웨어에서 x86기반의 리눅스를 실행하려는 목적으로 개발

- x86, power PC, SPARC, ARM 등의 프로세서를 지원


* note) Binary Translation ?

하나의 명령어 세트를 다른 명령어 세트로 변환해주는 처리

- Static Binary Translation : 모든 실행파일의 코드를 대상 아키텍처에서 한번에 변환

- Dynamic Binary Translation : 기본 실행 블럭의 단위만큼만 읽어서 변환


- GNU GPL, LGPL, BSD or GNU GPL v2, ...

- Hosted 방식의 가상화를 지원 : 전체시스템 에뮬레이션 / 사용자 모드 에뮬레이션


<기능>

a. 에뮬레이터 기능 : 물리적인 H/W 아키텍쳐 번환 없이 OS나 Program을 다른 H/W에서 돌아가도록 중계 역할을 수행

=> 소프트웨어적인 변환작업이 필요하므로 무조건 한번은 성능저하(최악)

b. 하이퍼바이저 기능 : KQEMU(or QUM86)을 통해 게스트 OS의 코드를 Host System의 CPU에서 직접 실행

=> 높은 성능

커널 코드는 동적 바이너라 변환을 통해 실행시키고, 사용자 코드는 네이티브 모드에서 실행하는 가속 모드를 지원

c. Xen이나 KVM 가상화 서포트 수행(변형된 형태의 QEMU가 지원함)


<구성요소>

- CPU 에뮬레이터

- 디바이스 에뮬레이터

- 일반 디바이스 처리기

- 머신 기술자

- 사용자 인터페이스




### KQEMU

: Guest/Host OS 아키텍처가 동일한 경우, 

x86기반의 게스트 OS에 대해 하드웨어 지원을 받아 유저모드와 일부 커널모드를 호스트 머신의 CPU에서 직접 실행

=> I/O등은 Host에서 적용되어 게스트OS의 성능을 향상



### QEUM KVM

: KVM에 최적화되어 qemu-kvm이라는 변형된 버전이 실행되며 x86 시스템에 대한 에뮬레이터 역할을 수행



### QEMU & Xen

: qemu-dm이라는 변형된 버전이 실행되며 XEN-HUM에서 디바이스 에뮬레이션과 일반 디바이스 간의 통신을 담당하여 I/O요청을 처리




### 네트워크 모드

: 에뮬레이션 된 NIC를 통해 VLAN을 생성할 수 있음(사용자 네트워킹, Tap 네트워킹, 소켓 네트워킹, VDC 네트워킹)


1. 사용자 네트워킹

: 기본적으로 생성되는 네트워크


- Host/Bridge 방식으로 가상의 인텔 E1000 PCI NIC 한개를 에뮬레이션

- 성능 낮음, ICMP 지원안됨, 외부에서 게스트로 직접접근 할 수 없음(포트포워딩이 필요함)


2. Tap 네트워킹

- 호스트 OS에서 먼저 생성한 뒤 게스트 OS에서 사용해야 함

- 성능 높음, root권한으로 QEMU를 실행해야 함


3. 소켓 네트워킹

- TCP/UDP 소켓을 이용해 게스트 OS사이에 VLAN을 생성


4. VDC 네트워킹

- 게스트 OS 사이에 virtual Distributed Ethernet 인프라를 사용





#####  KVM

: Kernal-based virual Machine


- 전가상화 방식을 사용하므로 하드웨어 지원이 필요함 (Intel-VT, AMD-V)

- x86 기반의 리눅스에서 구동

- 커널 모듈로 포함되어 있으며 Host에서는 하나의 프로세스로 간주되어 오버헤드가 적음


<구성>

- kvm.ko : 가상화 인프라스트럭쳐 코어를 위한 커널모듈

- kvm-intel.ko(kvm-amd.ko) : CPU 의존적 커널모듈

=> /proc/cpuinfo에서 vmx|svm같은 CPU와 커스터마이징 된 qemu-kvm이라고 하는 qemu 유틸리티가 지원되어야 함

* 명령어 : "egrep '(vmx|svm)' /proc/cpuinfo"


- 거의 모든 종류의 OS를 지원

- 다양한 저장장치를 지원

- 서버의 로컬저장소 : 게스트관리, 백업, 마이그레이션 쉬움, 성능은 점점 감소

- 물리디스크 : 비용이 많이 들지만 성능 좋음

- 로컬로 연결된 물리적 LUN : RAID에 사용

- LVM : 논리적 파티션

- iSCSI : IP-Over SCSI 프로토콜을 사용하여 TCP/IP 네트워크 상에서 SCSI를 사용해 

스토리지의 물리적인 위치에 상관없이 기존의 고성능, 고안정성 스토리지를 구축 가능

(IPSAN이라고 총칭하기도 함)

- Fiber Channel 기반의 LUN : SAN에서 사용되는 표준화 채널로 이루어진 LUN.

로컬 기반 SCSI뒤를 잇는 차세대 고속 인터페이스.

DC와 최대 8.6km 떨어진 곳에도 스토리지셋을 설치할 수 있음

성능, 안전, 비용모두 높음

- 등등 ...


<KVM 패키지 설치 시 설치되는 기본 패키지 들>

 libvirt

 가상화 솔루션 제어를 위한 API

 virt-manage

 가상화 솔루션 관리 및 모니터링 프로그램

 virt-viewer

 가상화 된 게스트 이미지를 읽어서 실행시키는 프로그램

 (이하, 옵션패키지)

 Virtualization Guide

 가이드 문서를 로컬에 설치해서 빠르게 참조할 수 있음

 Development Package

 가상화 관련 개발환경을 구축할 수 있는 패키지

 Etherboot 

 네트워크 부팅을 지원하는 패키지

 KVM debuggings tools

 디버깅 툴

 log4cpp

 로그 관련 기능을 제공

 기타


<KVM의 쉬운 운영을 위해 설치하는 패키지들>

 python-virtinst 

 게스트들을 쉽게 설치할 수 있도록하는 python 라이브러리로 구현된 프로그램인

 virt-install을 제공 

 libvirt

 리눅스 API

 Xen 및 KVM을 포함해서 다양한 가상화 기술 위에서 인터페이스를 제공 

 하이퍼바이저가 제공하는 공통된 기능들을 추상화 시킨 API를 제공

 (다양한 환경에서 사용이 가능)

 libvirt-python

 libvirt가 제공하는 기능을 파이썬에서 사용할 수 있게 API 제공 

 virt-manager

 가상머신 관리자

 가상머신을 운영하는데 필요한 기능을 GUI로 제공

 virt-install :CLI, virt-manager :GUI 

 virt io 패키지

 저장장치 및 NIC 제어를 지원해주는 패키지

 반가상화 드라이버 포함

 호스트를 통하지 않고 하드웨어를 직접 제어할 수 있음(I/O 지연 감소, 처리량 증가)

 KVM에서의 성능 저하를 해결할 수 있도록 도와줌



# 가상화 시스템 관리

- 가상화 보안

- 마이그레이션


1. 가상화 보안


- 사용할 서비스만을 설치하자. 서비스 최소화!

- 방화벽

- Do not touch Dom0 (user사용자로부터의 접근 허용을 X)

- 저장장치 보안 : 파티셔닝이나 LUM을 지정해 호스트 boot을 수정하지 못하게 해야함


2. 마이그레이션


- Load Balancing

- H/W failover

- 에너지 절감

- 기역간 Data Center migration


- offline migration : 실행중인 guest 들을 종료시킨 후 복제를 통해 마이그레이션

- live migration : 실행중인 게스트의 메모리 페이지를 모니터링 하면서 이전될 호스트 이미지 파일을 전송해야함.

최종적으로 아주 잠깐 Host를 중지시켜 dirty data(변경되는 값)을 일괄전송 후 마무리


* Host A -> Host B

(1) B를 연결하고 헤더 정보 전송, 리소스 분배 및 설정

(2) 마이그레이션 시작

(3) 메모리 내용을 최대한 비슷하게 이전

(4) iteration을 실행하여 반복적으로 변경되는 메모리를 B로 전송. 최대한 비슷할 때까지 계속 전송

(5) 거의 다 전송하면 잠깐 정지한 후 더티데이터 및 상태값 등을 전송

(6) 메모리 페이지 내용이 같아지면 Host B를 실행


* 마이그레이션 요구사항

- online으로 연결된 최소 두대의 호스트상에 설치된 게스트 일 것

- NFS, GFS2, TSCSI, Fiber Channel등은 공유 네트워크 저장장치를 사용하는 곳

- 동일한 OS, 동일한 버전, 동일한 업데이트 상태


* 체크리스트

네트워크로 연결된 상태들

공유네트워크 저장장치 사용

동일한 OS/버전/업데이트 상태

막히지 않은 포트, 동일한 브릿지 및 네트워크 상태

마운트 위치 및 디렉토리





##### XEN


- x86을 비롯해 다양한 프로세서 지원

- 반가상화(상대적으로 좋은 성능) 및 전가상화 지원

- 가상게스트를 관리하는 장치 드라이버를 Domain-0이라는 관리 가상 게스트에 부여하여,

하이퍼바이저가 동작함에 있어 오버헤드는 감소시키고 성능은 증가시킴

(Network Backend Driver, Block Backend Driver)



- Xen Hypervisor

- Domain 0

- Domain U



1. Xen Hypervisor

:  실행중인 게스트들의 CPU스케쥴링과 메모리 분배를 담당.

(게스트->H/W)로 가는 명령어를 처리하여 자신이 HW인 것처럼 보이게 함

네트워크, 외부저장장치, 오디오, 컴퓨터 시스템에 있는 일반적인 I/O는 지원하지 않음



2. Domain 0

: 수정된 리눅스 커널로 다른 가상 게스트들(도메인 U의 PV, HVM 게스트)과 통신하며 물리적 I/O 리소스에 접근 가능한 특별한 권한을 가진 가상 게스트

(Special Privileged Guest라고 함)


- Domain U의 시작, 중지, I/O 요청등의 모든 작업을 처리

- 하이퍼바이저에게 접근

- Domain U가 요청하는네트워크와 로컬 디스크 작업을 처리하는 드라이버인 Network Backend Driver와 Block Backend Driver를 제공


Network Backend Driver : Domain U로부터오는 모든 가상게스트들의 요청을 처리하는 로컬 네트워크 드라이버. H/W와 직접 통신

Block Backend Driver : Domain U의 요청에 따라 드라이브에서 데이터를 읽고 쓸 수 있는 로컬 스토리지와 통신


- Domain 0은 게스트들 보다 먼저 실행되어 있어야 함



3. Domain U

: 일반적으로 생성하는 Guest들로 I/O resource에 접근 권한이 없음


a. Domain U PV Guest (PV : Paravirtualized)

: 하이퍼바이저에게 게스트 OS가 동작하도록 OS를 수정H/W로 직접 접근하지 않고 하이퍼바이저를 통하도록 수정)해서 실행한 반가상화 게스트


   * 네트워크와 디스크에 접근하기 위해 드라이버가 존재하며 Domain 0에 요청



b. Domain U HVM Guest (HVM : Hardware-assisted Virtualization)

: 전가상화 게스트, OS 수정 없이 가상화하며 이를 위해 하드웨어 지원이 필요(Intel-VT, AMD-V)


- 가상화 된 게스트상에 PV드라이브가 없음

- Domain 0에 QEMU 데몬인 "qemu-dm"이 HVM게스트마다 실행되어 네트워크와 디스크 접근을 처리

- Xen Virtual Firmware(BIOS)를 통해 시스템 시작 시 Domain U HVM Guest를 초기화 함




4. 도메인 관리 및 제어 

: Domain 0은 다양한 데몬을 사용해 도메인을 관리/제어



- Xen 데몬 : Xen 환경의 System Manager 역할을 하는 파이썬 application.

 데몬에 의해 생성된 모든 요청은 Xm이 만든 XML RPC 인터페이스를 통해 전달


- Xm : 유저의 입력을 받아 XML RPC를 통해 Xen 데몬에게 전달하는 명령행 도구

- Xen 제어 library : Domain 0을 통해 데몬이 Xen Hypervisor와 통신할 수 있게하는 C library 

- qemu-dm : QEUM의 변형된 데몬으로 HVM 게스트들은 각각 Qemu demon이 필요함

네트워크, 디스크 요청을 처리해 완전한 가상 머신을 만듬 (네트워크, I/O에 접근하기위해 하이퍼바이저 외부에 Domain 0이 존재)





##### Xen Server

: Xen을 기반으로하는 서버 가상화 플랫폼


- Xen Hypervisor

- 다양한 OS와 HW를 지원

- GUI



1. XenCenter 

:  XenServer를 관리하는 콘솔 프로그램으로 CLI도 제공


2. XenServer Host 

: 게스트가 실행될 물리적 장비. XenServer Host의 CPU 및 메모리 자원을 이용해 게스트가 설치

로컬 스토리지를 제공(LVM, ext3), 원격 공유스토리지 (NFS. iSCSI)


3. Resource Pool

: 다수의 XenServer Host를 묶어서 관리. Migration, HA 등 값을 사용할 수 있음


* 스토리지 : 추상화된 계층구조를 가짐



- VDI 저장공간인 Storage Repository(SR)이 있음

- 로컬 스토리지(IDE, SATA, SCSI, SAS), 원격 스토리지(NFS, iSCSI, SAS, Fiber Channel)가 자원

- XenServer Host와 SR의 연결을 위해 PBD(Physical Block Devcice)를 사용 => 커넥터 역할을 수행

- 스토리지 저장소와 게스트간에 가상블록 장치(VBD, Virtual Block Device)를 게스트를 위한 가상의 볼륨 디스크를 제공


##### libvirt

: 가상화 플랫폼을 관리하는 Open Source API

다양한 가상화 기술에 사용(KVM, Xen, VMware, ESX, Hyper-V, LXC, ...)

C로 작성되었으며 다양한 언어에 바인딩 가능(Perl, Ruby, Java, PHP, ...)



* 원격의 가상머신 관리를 위해 libvirt는 libvirtd를 제공

=> 관리도구에서 로컬 libvirt와 원격의 libvirtd가 서로 통신하여 원격의 가상 머신에 관리 명령을 전달



##### virsh

: libvirt API를 바탕으로 만든 "virtual shell"

- CLI

- libvirt 설치 시에 함께 설치됨



##### XML Format

: libvirt나 virsh에서 가상머신, 스토리지, 네트워크를 생성하기 위해 명세를 XML 데이터를 설정

가상머신 관련, 네트워크 설정, 필터링 설정, 스토리지, 스토리지 암호화, 드라이버 적용, 호스트 장비 스냅샷



##### virt-install

: 가상머신 생성도구



##### virt-clone

: libvirt API를 이용해 가상머신 복제 도구



##### virt-viewer 

: 가상머신에 대한 원격 디스크가 탑제됨



##### virt-manager

: 하이퍼바이저와 가상화를 관리하는 GUI도구, 가상머신 생성 및 관리


 




'Virtualization + Cloud' 카테고리의 다른 글

CPU(x86) Ring Level  (0) 2015.12.29

+ Recent posts