3. Hypervisor
• 가상화의 핵심 소프트웨어
• 한대의 호스트 컴퓨터에서 다수의 운영체제를 동시에 실행하기 위한 논리적 플랫폼
• VMM(Virtual Machine Monitor)라고도 부름
4. Hypervisor
Linux
H/W
Window
Host OS
H/W
Hypervisor
Linux Window
Host OS
Process
Type 1 (Native or Bare metal)
• 하드웨어 바로 위에서 하이퍼바이저가 동작
• 그 위로 다양한 게스트 OS가 위치
• Xen 이나 VMware의 서버용 하이퍼 바이저 제품군
Type 2 (Hosted)
• 하드웨어 바로 위에 호스트 운영체제가 존재
• 호스트 운영체제 위에 하이퍼바이저가 동작
• 그 위로 다양한 게스트 OS가 위치
• KVM, VirtualBox, VMware의 데스크톱 제품군
Hypervisor 위치에 따른 분류
5. Hypervisor
Unmodi
fied OS
H/W with Virtualization Extension
Unmodi
fied OS
H/W
Hypervisor
Modified
OS
Modified
OS
전가상화 (Full-Virtualization)
• 하드웨어에서 가상화를 지원해줘야 함 (vmx, svm)
• 하드웨어를 완전히 가상화하기 때문에 게스트 OS를 수정할 필요가
없음
• 가상 머신 에뮬레이션 필요 (QEMU)
• 물리적인 가상화 기술을 이용(Inter-VT, AMD-V)
반가상화(Para-Virtualization)
• 하드웨어 가상화를 이용하지 않는 방식
• 게스트 OS는 하이퍼바이저를 통해서만 하드웨어를 제어 가능
• 게스트 OS의 커널을 일부 수정해서 게스트의 커널 함수를 호출하면
호스트의 컨널로 전달
• 커널을 수정해야 하기 때문에 오픈소스 OS에 한정
가상화 방식에 따른 Hypervisor 분류
6. KVM (Kernel based Virtual Machine)
• 전가상화를 지원하는 리눅스 커널 기반의 가상화 도구
• Linux kernel 2.6.20 버전부터 Linux mainline 에 포함 (2007.02.05)
• 리눅스 자체를 호스트 OS로 이용하고 하이퍼바이저를 서브 모듈로 취급
• 리눅스를 하이퍼바이저로 쓸 수 있도록 만들어 줌
7. KVM (Continue)
• KVM 은 가상머신을 인스턴스화 하기 위해 일부 수정된 QEMU(Emulator)를 사용
• 가상머신 인스턴스가 실행되게 되면 이 가상머신은 일반적인 프로세스 처럼 동작
• 따라서 kill, top, taskset 등과 같은 일반적인 리눅스 명령들을 사용할 수 있음
virsh에서 확인한 인스턴스 목록
ps명령으로 확인한 인스턴스 프로세스 목록
8. QEMU
• PC 환경을 위한 프로세스 에뮬레이터
• 각종 디바이스 에뮬레이션
• KVM과 Xen이 전가상화를 위해 QEMU를 이용한 에뮬레이션을 구현
9. Emulation & Virtualization
• Emulation
특정 시스템에 의존적인 소프트웨어 또는 플랫폼을 실행시키기 위한 가상의 환경을 만들어 주는 것
에뮬레이션할 디바이스 드라이버를 모두 S/W 적으로 구현해주어야 함
ex) QEMU, Android Emulator, iOS Emulator …
• Virtualization
컴퓨팅 자원을 효율적으로 사용하기 위한게 목적
컴퓨팅 자원을 풀로 사용하고 이를 바탕으로 여러개의 독립적인 가상머신을 만들어 사용
ex) Hypervisor
참고: https://powermore.dell.com/technology/emulation-virtualization-whats-difference/
10. Virtualization Extension (x86)
Host Linux Kernel
KVM
Host Userspace
QEMU
Linux
Applications
Virtual Machine
QEMU
Windows
Applications
Virtual Machine
Linux
Applicatons
QEMU-KVM Architecture
수정되지 않은 OS
머신 에뮬레이팅
QEMU가 가상화된 CPU와 메모리를
사용할 수 있도록 인터페이스 제공
KVM이 CPU와 메모리를 가상화할 수
있도록 허용
11. libvirt
• 가상화 플랫폼(하이퍼바이저)을 관리하는 오픈소스 라이브러리
• 다양한 하이퍼바이저 환경을 통합적으로 관리하기 위해 탄생
• KVM/QEMU, Xen, VMware, Hyper-V, VirtualBox 등 다양항 하이퍼바이저 지원
12. libvirt (Continue)
Node
Linux Host
Hypervisor Hypervisor
Guest OS Guest OS
libvirt
Management
Application
• libvirt는 다양한 하이퍼바이저를 통합할 수
있는 API 를 제공
• 기본적으로 virsh이라는 쉘 환경의 도구를
지원
• libvirt API 를 이용한 oVirt, kimchi 등 다양한
GUI 기반의 툴들이 만들어 짐
13. libvirt (Continue)
목록 (카테고리) 설명
libvirt-domain-snapshot 도메인(인스턴스)의 스냅샷들을 관리하는 API
libvirt-domain 도메인(인스턴스)들을 관리하는 API
libvirt-event 도메인(인스턴스)의 이벤트들을 관리하는 API (모니터링)
libvirt-host 호스트 및 하이퍼바이저를 관리하는 API
libvirt-interface 인터페이스들을 관리하는 API
libvirt-network 네트워크를 관리하는 API
libvirt-nodedev 노드들의 디바이스를 관리하는 API
libvirt-nwfilter 네트워크 필터들을 관리하는 API
libvirt-secret 보안과 관련된 관리를 하는 API
libvirt-storage 스토리지와 관련된 관리를 하는 API
libvirt-stream 스트림 (데이터 전송)과 관련된 API
virterror 에러 핸들링 인터페이스
14. How does Nova use KVM
nova-api
nova-compute
libvirt + KVM
nova-scheduler
nova-conductor
DB
AMQP
REST API
1
2
3
4
15. Next
• libvirt 를 통해 인스턴스에 대한 자원의 상세설정을 해줄 수 있을 것 같은데...
노드상의 자원들에 대한 Bandwidth 설정 등등…
머신의 자원들을 가상화해서 여러개의 논리적 서버로 만들 수 있게 해주는 녀석이 하이퍼바이저
Type 1 에서는 하이퍼바이저가 서버 가상화를 위한 일종의 운영체제로 동작
Type 2 에서는 하이퍼바이저가 서버 가성화를 위한 일종의 어플리케이션으로 동작
가상화 방식에 따른 분류
- 전가상화(Full Virtualization): 하드웨어를 완전히 가상화 하는 방식.
하드웨어에서 가장화를 지원해줘야 함 (CPU: vmx, svm)
하드웨어를 완전히 가상화하기 때문에 게스트 OS에 아무런 수정 없이 다양한 OS를 사용할 수 있음.
시스템 전체를 완전히 가상화하여 시스템의 BIOS 부터 CPU, Memory, I/O 등을 완전히 시뮬레이션하여 가상화하는 방법을 사용
물리적인 가상화 지원 기능, 즉 CPU의 VT(Virtualization Technology)를 이용 (Intel-VT, AMD-V)
CPU의 가상화 기능을 직접 사용하기 때문에 상대적으로 오버헤드가 많이 발생해서 성능이 저하
또한 모든 디바이스 환경에 대한 에뮬레이팅을 해줘야 함
- 반가상화(Para Virtualization): 하드웨어를 완전하게 가상화 하지 않은 방식
게스트에 올라갈 OS 커널을 수정해서 커널 함수를 호출하면 그게 바로 호스트의 커널로 전달시키도록 만든 방식이라 오버헤드가 적다.
게스트 OS가 직접적으로 하드웨어를 제어할 수 없고 하이퍼바이저를 통해서만 제어가 가능
게스트 OS의 커널의 일부분을 수정해야한다는 단점
따라서 이용할 수 있는 게스트 OS는 오픈소스에 한정
Hypervisor에서 자원을 관리하기 때문에 상대적으로 오버헤드가 적다.
에뮬레이션 방식의 가장 큰 장점은 가상의 디바이스를 제공함으로써 게스트 도메인의 드라이버를 수정 없이 그대로 쓸 수 있다는 점
하지만 디바이스를 소프트웨어로 모두 구현해야하므로 구현이 복잡하고, 하드웨어를 소프트웨어로 동작시켜야 하므로 오버헤드가 커서 성능이 저하됨
예를 들어 모든 저 수준의 I/O 명령을 하이퍼바이저가 에뮬레이션 해주어야 하고 이 때 게스트와 하이퍼바이저 사이에 컨텍스트 스위치가 항상 발생
게스트 운영체제를 수정할 수 있다면, 좀 더 효율적으로 I/O 가상화를 구현할 수 있다.
게스트와 하이퍼바이저 사이에 I/O 디바이스에 대한 새로운 상위 수준 인터페이스를 정의해 게스트가 직접 하이퍼바이저에게 I/O를 요청
예를 들어 네트워크 디바이스의 경우 디바이스 에뮬레이션은 모든 저 수준 I/O 명령어를 있는 그대로 에뮬레이션 해야 한다.
그리고 패킷 하나를 네트워크 카드를 통해 전송하려면 많은 저 수준 I/O 명령어를 요구하는데 이는 에뮬레이션을 실행할 때의 오버헤드 뿐만 아니라, 게스트와 하이퍼바이저 사이에 많은 수의 컨텍스트 스위치를 일으키며 이때 발생하는 오버헤드도 상당하다.
따라서 반가상화를 통해 게스트와 하이퍼바이저 사이의 인터페이스를 정의할 때는 좀 더 상위 수준의 인터페이스로 정의한다.
이렇게 하면 사용자의 저 수준 I/O 명령을 send_packet과 같은 한 번의 요청으로 처리할 수 있다. 게스트와 하이퍼바이저의 컨텍스트 스위치는 단 한번으로 충분하고, 디바이스 에뮬레이션을 실행할 필요도 없으므로 더 높은 성능의 I/O 가상화를 구현할 수 있다.
Type 2 형태의 하이퍼바이저
사실 반가상화도 지원을 해주고 있으나 오늘은 전가상화 기능만 이야기하겠다.
전가상화 모드로 사용할 때는 CPU가 가상화를 지원해줘야 함 (Intel: vmm, AMD: svm)
KVM 은 가상머신을 인스턴스화 하기 위해 일부 수정된 QEMU 에뮬레이터를 사용하는데
이렇게 인스턴스화 되어 실행된 가상머신은 리눅스의 일반적인 프로세스 처럼 동작
실제로 ps 명렁어를 통해 인스턴스 프로세스를 확인할 수 있고
kill 명령을 통해 인스턴스를 중지 시킬수도 있다.
각 인스턴스 별로 uuid 값이 있는데 이 uuid 값을 grep으로 잡으면 해당 인스턴스 프로세스를 확인할 수 있다.
Emulation의 뜻 모방
에뮬레이션은 특정 시스템에 의존적인 소프트웨어나 플랫폼을 다른 시스템에서도 동일하게 동작시키기 위한 기술
일반적으로는 게임기 에뮬레이터, 안드로이드 에뮬레이터, iOS 에뮬레이터 등등
에뮬레이터는 이 시스템에 필요한 디바이스 드라이버를 모두 SW 적으로 구현해주고 있다.
일종의 하드웨어와 소프트웨어를 연결해주는 브릿지인 샘
가상화는 컴퓨팅 자원을 효율적으로 사용하기 위한게 목적
컴퓨팅 자원을 가상화하여 일종의 풀로 사용하고 이를 바탕으로 여러개의 독립적인 가상머신을 만들어 사용
libvirt 를 이용하면 다음 그림과 같이 다양한 하이퍼바이저를 통합해서 관리할 수 있다.
libvirt 자체는 이를 통합하는 API 를 지원해주고 이를 이용하는 툴을 사용하거나 구현해야하는데 기본적으로 virsh 이라는 쉘 환경의 도구를 지원해주고 있고
추가적으로 ovirt나 kimchi 같은 윈도우 기반의 프로그램을 이용할 수 도 있다.
원격에 있는 하이퍼 바이저의 경우 libvirt와 함께 설치되는 libvirtd를 통해 이루어 짐
libvirt 를 이용하면 다음 그림과 같이 다양한 하이퍼바이저를 통합해서 관리할 수 있다.
libvirt 자체는 이를 통합하는 API 를 지원해주고 이를 이용하는 툴을 사용하거나 구현해야하는데 기본적으로 virsh 이라는 쉘 환경의 도구를 지원해주고 있고
추가적으로 ovirt나 kimchi 같은 윈도우 기반의 프로그램을 이용할 수 도 있다.
노바는 대시보드나 콘솔에서 호출하는 nova-api로부터 시작됨. nova-compute는 하이퍼바이저 라이브러리를 통해 하이퍼바이저에게 인스턴스를 생성하라는 명령어를 다시 전달
nova-api는 메시지큐(AMQP)를 인스턴스 생성 명령을 전달
nova-scheduler는 인스턴스 관련 명령을 대기하고 있다가 자체 스케쥴링을 통해 nova-compute에 인스턴스를 생성하라는 명령어를 전달
이때 nova-conductor를 통해 Database에 관련 내용을 저장하게 되고
nova-compute는 libvirt를 통해 하이퍼바이저에게 인스턴스를 생성하라는 명령어를 다시 전달
그 때 하이퍼바이저가 인스턴스를 생성
사용자는 nova-api를 통해 Database의 정보를 조회할 수 있다.
QEMU의 QoS 설정 기능을 libvirt에서 인터페이스를 제공해주고 있는 것 같은데…
이 부분에 대한 추가적인 조사
KVM에서 QoS에 대한 제어를 할 수 있는지 확인 (CPU, Memory, Network, I/O)