패스트캠퍼스

운영체제 - 가상머신의 이해

돌맹이시터 2020. 12. 28. 17:11

 

패스트캠퍼스-컴퓨터공학전공-운영체제-가상머신의이해

 

 

 

Virtual Machine (가상 머신)

 

하나의 하드웨어(cpu,memory 등)에 다수의 운영체제를 설치,

개별 컴퓨터처럼 동작하도록 하는 프로그램

 

패스트캠퍼스 강의자료

 

 

최근 인공지능이나, 클라우드 컴퓨팅에서 가끔 사용되는 기술이다.

운영체제 레벨에서는 다루는 비중이 적으며, 하드웨어를 emulate 하는 기술이라고 한다.

(소프트웨어를 이용해 하드웨어가 여러 개 인것처럼 보이게 하는 기술?)

-> 학사 과정 이후에 세부전공으로 다루는 내용이므로 대략적인 이해만 하면 될 듯

 

 

일반적인 컴퓨터에서 위 그림의 비가상 기계처럼 작동한다면

가상머신이라는 소프트웨어가 하드웨어의 동작을 emulate. (모방)

각 가상머신마다 운영체제를 설치할 수 있어서, 마치 컴퓨터가 여러 대 인것처럼 보이게 된다.

 

기준에 따라 type1, type2, 전가상화, 반가상화 등으로 구분될 수 있으며 각각 구현방식이 다르다.

( type1 vs type2 , 전가상화 vs 반가상화 )

 

 

 

 

 

Virtual Machine Type1 (native or bare metal)

 

 

패스트캠퍼스 강의자료

 

 

하이퍼 바이저(or VMM) : 운영체제와 응용프로그램을 물리적 하드웨어에서 분리하는 프로세스

하이퍼바이저 or 버추얼 머신 모니터(VMM)라고 하는 소프트웨어가 하드웨어에서 직접 구동

ex) Xen, KVM

 

 

하드웨어 바로 위에 '하이퍼바이버/버추얼 머신 모니터' 소프트웨어를 설치하고, 

그 위에 가상머신을 여러 개 구현하는 방식

 

 

 

 

Virtual Machine Type2

 

fastcampus 강의자료

 

하이퍼바이저 or 버추얼 머신 모니터(VMM) 소프트웨어가 Host OS 상위에 설치

ex) VMWare, Parallels Desktop(Mac)

 

 

하드웨어 위에 운영체제가 설치되어있는 상태에서

다른 App들처럼 하나의 프로그램인 것 처럼 '하이퍼바이저/버추얼머신모니터'를 설치해서

그 안에서 가상머신을 구동하는 방식

 

 

-> type1보다 type2가 거쳐야 하는 것들이 많기 때문에 

type1의 방식이 구현하는 속도가 더 빠를 수 있다. 

하지만 절대적인 결과가 아니라 구현하기 나름이다.

 

 

 

 

 

 

Full Virtualization (전가상화) vs Half Virtualization (반가상화)

 

 

 

* 전가상화 : 각 가상머신이 하이퍼바이저를 통해 하드웨어와 통신

 

 

패스트캠퍼스 강의자료

 

하이퍼바이저가 중간에서 가상머신 / 하드웨어 간의 통역을 해준다.

가상머신에 설치되어 있는 os는 기존 os를 사용하면 되고,

하드웨어에 어떤 요청을 할 경우, VMM이 해당 명령어를 변환해서 하드웨어에 전달해주고,

하드웨어에서 명령에 대한 응답이 오면 적절히 변형시켜서 해당 os에 전달해준다.

 

전체적으로 가상화하기 때문에 full virtualization 이라 한다.

 

 

 

 

* 반가상화 : 각 가상머신에서 직접 하드웨어와 통신

 

 

패스트캠퍼스 강의자료

 

 

가상머신에 설치되어 있는 os는 '가상머신'인 것을 인지하고,

각 명령에 하이퍼바이저 명령을 추가해서 하드웨어와 통신한다.

VMM은 여러 개의 가상머신이 원활히 작동할 수 있도록 리소스 관리 역할을 하게 된다.

 

ex) 3개의 가상머신에서 하드웨어의 100% 작동을 각각 요청하는 경우,

30%, 30%, 40%와 같이 나누어서 사용할 수 있도록 리소스 관리를 하게 되는 것이다. 

 

 

 

 

-> 통역과정을 거치는 full virtualization보다는 half virtualization의 방식이 조금 더 성능이 빠를 수가 있다.

하지만 명시적으로 '가상'명령을 내리기 위해서는 os의 수정이 필요하기 때문에

복잡도가 올라가게 되고, 결과적으로 성능이 떨어질 수 있다. 

 

두 가지 방식을 섞어서 사용하기도 하지만,

최근에는 하드웨어 성능이 높아졌기 때문에

os를 수정하지 않고 그냥 full virtualization 기술을 사용하는 경우가 더 많다고 한다.

 

 

 

 

 

 

VMWare : 대중적인 가상머신 프로그램 (Type 2)

 

fastcampus 강의자료

 

리눅스를 사용하고자 하는 경우 

대부분 windows 위에 vmware를 설치하고, 그 위에 리눅스를 설치해서 테스트하는 경우가 많다.

 

 

 

 

 

 

KVM : AWS(아마존 클라우드 컴퓨팅 서비스) 등에서 사용 (Type 1)

 

 

 

패스트캠퍼스 강의자료

 

 

•클라우드 컴퓨팅 서비스에서 많이 사용된다.

ex) 100대의 컴퓨터를 설치해서 10000명이 사용하게 함

 

 

•하드웨어 바로 위에 설치를 하고, 그 위에 가상머신들을 구현하는 방식이다. (type1)

 

•Intel-VT 등 가상화 기능을 가진 cpu에서는 VMX root/VMX non-root 모드 존재

 

KVM은 사실 리눅스 커널인데, ioctl() 라는 시스템콜을 제공하고,

이 시스템콜은 하드웨어에 직접 명령이 가능하다.

이 명령을 사용해서 가상cpu를 만들고 (cpu에서 이런 기능을 제공해야 가능)

intel-VT라는 명령어 set가 구성되어 있고 이런 명령어들을 이용해서 vCPU(가상cpu)를 만들 수 있고,

이러한 기능을 사용해서 KVM을 만들었다고 생각하면 된다.

 

•각 모드별로 protection ring 0~3 지원 (cpu에 있다. 0: 커널사용, 3: 응용프로그램 사용),

가상화 기능을 사용하지 않는 경우, VMX root 모드 사용

 

•KVM은 각 가상머신마다 KVM process 실행되며, KVM module(=ioctl(), /dev/kvm)을 통해 vCPU 생성

 

•KVM process 기반 guest kernal (VMX non-root / RING 0 사용), QEMU 장치 에뮬레이터가 로드됨

(QEMU : 리눅스에서 IO device들을 소프트웨어로 에뮬레이트 하는 장치)

 

•게스트 커널 위에서 실행되는 응용 프로그램은 VMX non-root / RING 3 사용해서 vCPU 상에서 실행된다.

 

•게스트 커널이 물리적 HW 자원 필요한 경우 VM exit라는 인터럽트가 발생한다.

이 인터럽트는 결과적으로 QEMU 장치 에뮬레이터에 하드웨어 자원 처리 요청을 하게 되고, 

QEMU 장치 에뮬레이터가 IO device들을 emulate하고 있기 때문에 해당 IO device들로부터 데이터를 송/수신하여 

게스트 커널에 access 할 수 있기 때문에 에뮬레이터를 통해 데이터를 받아오고, 응용프로그램으로 전달해주게 된다.

 

 

 

 

 

 

또다른 가상머신 : Docker (Virtual Machine vs Docker)

 

 

 

패스트캠퍼스 강의자료

 

 

 

* Virtual Machine : 컴퓨터 하드웨어를 가상화 (하드웨어 전체 추상화)

- 하이퍼바이저 사용, 추가 os 필요(guest kernal도 포함) 등 성능저하 이슈 존재

 

 

* Docker : os 레벨에서 별도로 분리된 실행환경 제공 (커널 추상화)

 

•리눅스 기술 : chroot 라는 명령어 -> 하나의 분리된 공간이 만들어지는데

root, filesystem 등이 따로 있는 식으로 완전히 분리된 운영체제 실행환경을 만드는 기능이다.

-> 리눅스 처음 설치했을 때와 유사한 실행환경을 만들어준다. (리눅스 컨테이너 기술 기반)

 

•리눅스 컨테이너 기술이므로 macOS나 windows에 설치할 경우는 가상머신 기반으로 제공

가령, VMWare는 어떤 os에도 설치할 수 있지만 Docker는 리눅스가 설치되어있어야 하므로 

windows/mac 등의 환경에서는 따로 리눅스를 설치해야한다.

 

 

 

 

 

 

 

 

 

Java Virtual Machine

 

 

 

패스트캠퍼스 강의자료

 

가상머신과는 다른 목적 (응용프로그램 레벨 가상화)

 

 

ex) c언어의 경우 각 os에서 사용하려면 컴파일 과정을 별도로 거쳐야 하고,

어떤 경우는 코드 자체를 수정해야 하기도 한다.

그런 문제점을 해결하기 위해 나온 것이 Java Virtual Machine이며

즉, 코드 하나만 작성하면 어떤 os환경에서도 실행 가능하다.

 

 

Java 컴파일러는 CPU dependency를 갖지 않는 bytecode를 생성하며,

이 파일을 Java Virtual Machine에서 실행한다.

각 os를 위한 Java Virtual Machine 프로그램이 존재하며,

각각의 os에 맞게 명령을 내려준다. 

 

 

 

 

 

 

 

 

정리

 

 

•가상머신 -> Bare-Metal 방식이 가장 성능이 좋다.

하드웨어에 직접 접근하기 때문,

AWS(cloud computing) 환경도 Bare-Metal 기반 가상머신 기술 활용 (ex:KVM)

 

•Docker -> 경량 이미지로 실행환경을 통째로 백업, 실행 가능 (실무에 많이 사용)

ex)

root 설정, ubuntu ID -> 프로그램 5개 & 1개 데몬 프로그램->서버 24시간 실행

위의 예를 가상머신으로 만드는 경우 매번 가상머신 만들 때마다 환경을 갖춰야 하는 등 번거로움이 있는 반면,

Docker를 사용할 경우 이 환경을 통째로 백업하여 동일하게 실행 가능

 

Data Engineering 에서 Docker로 시스템 환경설정+프로그램을 한 번에 배포 가능

ex)

프로그램 업데이트-> Docker로 실행환경을 만들어놓고, Jenkins(특정 프로그램)으로 배치잡 생성 및 실행

(AWS EC2 재생성 및 Docker 이미지 설치, 실행)

 

 

잘은 모르겠지만 아무튼 Docker는 실무에서 많이 사용한다 정도....