Virtual Machine (가상 머신)
하나의 하드웨어(CPU, Memory등)에 다수의 운영체제를 설치하고, 개별 컴퓨터처럼 동작하도록 하는 프로그램
컴퓨터는 한대이지만 가상 머신이 마치 자신이 하드웨어 동작을 emulate(묘사)를 해서 가상 머신마다 운영체제를 설치할 수 있어서 마치 컴퓨터가 여러대인 것처럼 하는 것.
가성머신을 초창기에 구현할 때 어떻게 구현하는게 좋을지 연구하면서 나온 각각의 구현방식을 구분하기 위해서 크게 두 타입으로 나누었다.
- 하이퍼 바이저(또는 VMM): 운영체제와 응용프로그램을 물리적 하드웨어에서 분리하는 프로세스
- 하이퍼바이저 또는 버추얼 머신 모니터 (VMM)라고 하는 소프트웨어가 Hardware에서 직접 구동함
Virtual Machine Type2
- 하이퍼바이저 또는 버추얼 머신 모니터 (VMM)라고 하는 소프트웨어가 Host OS 상위에 설치됨
ex) VMWare, Parallels Desktop(Mac)
Full Virtualiation(전가상화) VS Half Virtualization(반가상화)
VMWARE
: 대중적인 가상머신 프로그램(Type2)
KVM
:AWS(아마존 클라우드 컴퓨팅 서비스)등에서 사용(Type1)
클라우드 서비스 100대의 컴퓨터를 설치해 놓고 1만명이 쓰게 하는 것. 각각의 만명이 100대의 컴퓨터를 볼 때 1만 대의 컴퓨터로 보이게 하기 위해 쓰는 것이 KVM.
KVM은 리눅스 커널의 기능을 사용하고 리눅스 커널에서 ioctl()이라는 시스템콜을 제공 (특징: 하드웨어의 직접 명령/제어가 가능하다). 이 명령을 사용해서 CPU에 가상 CPU를 만들 수 있다. CPU에서 이 기등을 제공해야 되기 때문에, 인텐 CPU에는 Intel-VT라는 명령세트가 있고 이걸로 가상 CPU만들 수 있다. 이 기능을 사용해서 KVM이라는 소프트웨어를 만들었다.
- CPU에는 protection ring있다 0커널 3응용프로그램
- CPU하나를 두고 가상머신 여러개를 사용하기 위해 VMX root/VMX non-root 모드를 만들었다.
- 각 모드별로 protection 0~3을 지원하고, 가상화 기능을 사용하지 않을 경우, VMX root모드 사용한다.
- kVM은 각 가상 시스템에 대응하는 KVM 프로세스 실행, KVM모듈(/dev/kvm)을 통해 vCPU사용
- KVM프로세스 기반 게스트 커널(VMX non-root/RING 0 사용), QEMU 장치 에뮬레이터(IO device 에뮬레이터)가 로드됨
- 게스트 커널 위에서 실행되는 응용 프로그램은 VMX non-root/Ring3을 virtual cpu상에서 사용
- 게스트 커널이 물리적 HW자원 필요시, VM exit가 발생 (일종의 인터럽트), KVM모듈에서 해당 요청 처리
- 일반 HW자원은 QEMU 장치 에뮬레이터에 하드웨어 자원 처리를 요청함
- QEMU장치 에뮬레이터가 IO device들을 에뮬레이터 하고 있기 때문에 해당 에뮬레이터 소프트웨어를 사용해서 해당 IO device로부터 데이터를 송신/수신할 수 있다. 그리고 그 장치를 게스트 커널에 엑세스 할 수 있기 때문에, 해당 데이터를 응용프로그램에 주게 된다.
- KVM이라는 가상화 기술이 결과적으로 CPU에서도 지원이 되야 한다는 것.
- KVM이라는 소프트웨어도 따지고 보면 LINUX 커널이다
- CPU protection ring이 가상 머신에서도 영향을 미치기 때문에 protection ring은 VMX root/VMX non-root로 구분해서 제어를 한다.
Docker
- 가상 머신은 컴퓨터 하드웨어를 가상화(하드웨어 전체 추상화)
- 하이퍼바이저 사용, 추가 OS필요 등 성능 저하 이슈 존재
- Docker는 운영체제 레벨에서 별도로 분리된 실행환경을 제공(커널 추상화)
- chroot라는 명령어를 취하면 컴퓨터에 분리된 공간을 만들어준다 (별도의 실행환경을 만들어 준다)
- 마치 리눅스 처음 설치했을 때와 유사한 실행환경을 만들어주는 리눅스 컨테이너 기술 기반
- 리눅스 컨테이너 기술이므로 macOS나 windows에 설치할 경우는 가상 머신 기반 제공
가상 머신 정리
- Bare-Metal 방식이 가장 성능이 좋음 (type1)
- 하드웨어 직접 엑세스하기 때문이고
- AWS(클라우드 컴퓨팅) 완경도 Bare-Metal기반 가상 머신 기술을 사용하고 있다(KVM)
- Docker는 경량 이미지로(리눅스가 밑에 있다는 전제하에, 별도로 리눅스 운영체제를 설치할 필요 없다) 실행환경을 통째로 백업, 실행 가능하다 (실무에 많이 사용됨)
- Data Engineering 에서 Docker로 시스템 환경 설정 + 프로그램을 한번에 배포
- 예) root 설립, ubuntu ID → 프로그램5개, 1개 데몬 프로그램 → 서버 24실행 가능하게 하는 것들을 통째로 백업, 실행 가능캐함
- 예) 프로그램 업데이트 → Docker 이미지 작성(실행환경 통째로 만들고) → Jenkins로 (하루에 한번씩 돌려서 해당 컴퓨터에 동작하는 프로그램을 만들어서 업데이트된 프로그램으로 서버에 동작하도록 하는 것) 배치잡 생성 및 실행(AWS EC2 재생성 및 Docker 이미지 설치, 실행)
Java Virtual Machine
- 가상 머신과는 다른 목적 (응용프로그램 레벨 가상화)
- Java 컴파일러는 CPU dependency를 가지지 않는 bytecode를 생성함
- 이 파일을 Java Virtual Machine에서 실행함
- 각 운영체제를 위한 Java Virtual Machine프로그램 존재
하드웨어를 추상화하는 가상 머신이나 docker와 같이 실행환경을 만들어 주는 가상 머신이 아니라 응용프로그램의 코드 실행을 가상 환경에서 실행할 수 있게금 하는 프로그램이다.