##### 가상화
가상화 != 에뮬레이션
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도구, 가상머신 생성 및 관리