Researcher to Developer

08. 가상 머신의 이해 본문

코딩/Basic

08. 가상 머신의 이해

Probe29 2020. 12. 20. 22:00

#가상 머신(Virtual Machine) 
하나의 하드웨어(CPU, Memory등)에 다수의 운영체제를 설치하고, 개별 컴퓨터 처럼 동작하도록 하는 프로그램
하드웨어를 소프트웨어로 에뮬레이터하여 (모사)마치 여러 개처럼 보이도록 하는 기술

 

가상 머신 구조도





#가상 머신 Type1
하드웨어 위에 VMM을 설치
하이퍼 바이저(또는 VMM) : 운영 체제와 응용프로그램을 물리적 하드웨어에서 분리하는 프로세스
하이퍼바이저 또는 버추얼 머신 모니터 (VMM)라고 하는 소프트웨어가 Hardware에서 직접 구동
Xen, KVM
성능이 Type2 보다 빠를 순 있다.

 

가상 머신 Type 1

 

 

 

#가상 머신 Type2
하드웨어 위에 운영체제가 이미 설치되어 있는 경우
하이퍼바이저 또는 버추얼 머신 모니터라고 하는 소프트웨어가 Host OS상위에 설치

가상 머신 Type 2





#전가상화

각 가상머신이 하이퍼 바이저를 통해서 하드웨어와 통신(통역사의 역할)
하이퍼바이저가 마치 하드웨어인 것처럼 동작하므로, 가상머신의 OS는 자신이 가장 머신인 상태인지를 모름
가상 머신에 설치된 운영 체제들은 하드웨어에 뭔가 요청을 할때 VMM이 OS의 요청을 받아 하드웨어에 전달

 

전가상화

 

#반가상화

각 가상머신에서 직접 하드웨어와 통신
각 가상머신에 설치되는 OS는 가상 머신인 경우, 이를 인지하고, 각 명령에 하이퍼바이저 명령을 추가해서 
하드웨어와 통신
가상 머신에 설치된 OS가 하드웨어에 직접적으로 명령함
반가상화에서 VMM의 역할 : 리소스 관리, 가상 머신 마다 하드웨어에 요칭했을 때의 자원을 관리함

 

 

 

반가상화

 

다만, 이렇게 가상이라는 명령을 내려주기 위해서는 가상 머신 OS을 수정해야하고
그러면 복잡도가 올라간다는 단점이 있고, 성능이 떨어질 수 있다는 가능성이 있음

최근 HW 성능개선으로 전가상화 기술을 선호

 

 

 

#VMWare
대중적인 가상머신 프로그램 (Type2)
HOST 운영 체제 위에서 설치가 됨

 


#KVM(SW)
AWS(아마존 클라우드 컴퓨팅 서비스)등에서 사용(Type1)
하드웨어 바로 위에 설치하여 그 위에 가상 머신을 설치

KVM은 리눅스 커널, ioctl() 시스템 콜을 제공, 하드웨어 직접 제어가 가능
이 명령을 사용해서 CPU에 vCPU를 만들어 달라는 명령을 내릴 수 있음


 

#vCPU
Intel-VT등 가상화 기능을 가진 CPU에서는 VMX root/VMX non-root 모드 존재
각 모드별로 Protection ring 0~3 지원, 가상화 기능을 사용하지 않을 경우, VMX root 모드 사용
KVM이 설치가 되면 각 가상 시스템에 대응하는 KVM 프로세스 실행이 되고, KVM 모듈(/dev/kvm)을 통해 vCPU 생성하고

KVM 프로세스 기반에 게스트 커널을 설치할 수 있고(VMX non-root/RING 0 사용), QEMU 장치 에뮬레이터(IO Device 에뮬)를 프로세스 위에 로드함
게스트 커널 위에서 실행되는 응용 프로그램은 VMX non-root / RING 3 사용을 해서 vCPU 상에서 실행
게스트 커널은 VMX non-root / RING 0 사용을 사용해서 실행

게스트 커널이 물리적 HW자원 필요시, VM exit(일종의 인터럽트) 발생, KVM 모듈에서 해당 요청 처리
일반 HW 자원은 QEMU 장치 에뮬레이터에 처리를 요청
 QEMU 장치 에뮬레이터는 VMX root / RING 3를 통해 호스트 커널에 요청 후 해당 데이터는 공유 메모리를 통해
 KVM 게스트 커널과 공유

Intel-VT 명령어 SET - 이를 이용해 가상 CPU를 만들 수 있음







#Docker (또 다른 가상 머신)
가상 머신은 컴퓨터 하드웨어를 가상화 (하드웨어 전체 추상화)
 하이퍼바이저 사용, 추가 운영 체제 필요 등 성능 저하 이슈 존재

Docker는 운영 체제 레벨에서 별도로 분리된 실행 환경을 제공 (커널 추상화)
마치 리눅스 처음 설치했을때와 유사한 실행환경을 만들어주는 리눅스 컨테이너 기술 기반
리눅스 컨테이너 기술이므로 Mac OS나 Windows에 설치할 경우에는 가상 머신 기반을 제공
chroot



Type1 
Bare-Metal 방식이 가장 성능이 좋음
하드웨어 직접 엑세스하기 때문
AWS(클라우딩 컴퓨터) 환경도 Bare-Metal 기반 가상 머신 기술 활용(KVM)

Docker는 경량 이미지로 실행환경을 통째로 백업, 실행 가능(실무에 많이 사용됨)
Data engineering에서 Docker로 시스템 환경 설정 + 프로그램을 한 번에 배포
ex. 프로그램 업데이트 → Docker 이미지 작성 → Jenkins로 배치잡 생성 및 실행(AWS EC2 재생성 및 Docker 이미지
설치, 실행)

root 설정을 했고 ubunty ID 로 프로그램 5개를 생성했고, 그 중 1개 프로그램을 24시간 서버를 실행하게 한다면
Docker로 한 번에 백업 및 실행이 가능하다.



#Java Virtual Machine
응용 프로그램 코드를 가상 환경에서 실행하게 해주는 머신
가상 머신과는 다른 목적(응용 프로그램 레벨 가상화)
Java는 코드 하나만 만들어 놓으면 어느 운영 체제에서는 사용이 가능하다.
Java 컴파일러는 CPU dependency를 가지지 않는 bytecode를 생성함
이 파일을 Java Virtual Machine에서 실행함
각 운영 체제를 위한 Java Virtual Machine 프로그램 존재










'코딩 > Basic' 카테고리의 다른 글

Windows에서 AWS 사용하기  (0) 2020.12.23
09. LINUX 의 특징과 역사  (0) 2020.12.22
07. 부팅 시스템의 이해  (0) 2020.12.20
06. 파일 시스템의 이해  (0) 2020.12.20
05. 가상 메모리의 이해  (0) 2020.12.20