리눅스 기초 다지기 사전준비 - 가상화(Virtualization)

 

1. 호스트 가상화

Hosted

etc-image-0

 

호스트 가상화

: Host OS 위에 Guest OS가 구동되는 방식으로 하드웨어 자원을 에뮬레이팅하여 제약사항이 적으나

네이티브 방식에 비하면 오버헤드가 큰 단점이 있습니다.

 

 

오버헤드(overhead)란?

: 프로그램의 실행 흐름에서 나타나는 현상 중 하나로, 프로그램의 실행 흐름 도중에 동떨어진 위치의 코드를 실행시켜야 할 때 추가적으로 시간, 메모리, 자원이 사용되는 현상입니다.

 

In computer science, overhead is any combination of excess or indirect computation time, 
memory, bandwidth, or other resources that are required to perform a specific task. It is 
a special case of engineering overhead

 

 

2. 하이퍼바이저 가상화

Native/Bare-metal

etc-image-1

 

 

하이퍼바이저 가상화

: 하이퍼바이저 가상화는 하이퍼바이저가 하드웨어 바로 위에 구동되는 방식입니다. 대표적으로 VMware ESXi, Citrix의 XenServer가 있습니다.

하드웨어를 직접 제어하기 때문에 자원을 효율적으로 사용할 수 있고, 별도의 Host OS가 없으므로 오버헤드가 적습니다. 또한 하이퍼바이저 가상화는 전가상화, 반가상화 방식으로 세분화할 수 있습니다. 하이퍼바이저를 통해 가상머신 내의 게스트 OS가 호스트 시스템을 활용한다는 점은 같지만, 하드웨어와 인터랙션하는 방식에 차이가 있습니다.

 

etc-image-2

 

 

2.1 전가상화

  • 게스트 OS를 호스트 시스템과 완전히 분리하여 실행
  • 게스트 OS는 하드웨어 자원을 요청하기 위해, 반드시 하이퍼바이저가 중재해야 함

etc-image-3

 

전가상화는 하드웨어를 모두 가상화하는 방식으로, 게스트 OS가 하이퍼바이저에게 하드웨어 시스템 제어를 요구하면 하이퍼바이저는 하드웨어에게 해당 요구사항을 전달합니다.

 

각 게스트 OS는 ‘DOM 0’ 관리 머신을 거쳐 하이퍼바이저와 통신하므로, CPU, RAM와 같은 I/O가 잦은 자원을 컨트롤 하기에는 번거롭습니다.

2.2 반가상화

  • 게스트 OS를 일부 수정하여 필요한 하드웨어 자원을 직접 요구할 수 있음

반가상화 방식은 하드웨어를 완전히 가상화하지 않습니다. 대신 게스트 OS 일부를 수정해 하드웨어와 인터랙션할 수 있도록 합니다. 대표적인 반가상화 방식으로 Xen이 있습니다. 게스트 OS는 Hyper call 명령어를 통해 하드웨어에 필요한 자원을 바로 하이퍼바이저에게 전달하고 하이퍼바이저는 하드웨어를 제어합니다.

 

etc-image-4

 

각각의 Guest OS는 필요한 자원을 직접 요청할 수 있으므로 모든 요청을 ‘DOM 0’을 통해 한꺼번에 처리하여 하드웨어를 제어하는 전가상화 방식에 비해 성능이 좋습니다.

 

다만, VT-x/SVM 기술로 전가상화와 반가상화를 나누는 경계가 없어졌습니다.

 

2.3 VT-x/SVM 기술의 발전

대표적인 전가상화 방식에는 VMware ESXi, Qemu가 있으며

반가상화 방식에는 Citrix의 XenServer가 있습니다.

전가상화 방식은 모든 CPU 명령어를 에뮬레이트하며, 반가상화 방식은 꼭 필요한 명령어만 가상화합니다.

xor ear, eax
mov cr0, eax

 

 

첫 번째 명령어는 범용 레지스터를 다루는 명령어이기 때문에 가상화 하지 않아도 되며, 해당 명령어는 실제 하드웨어를 그대로 사용하기 때문에 100% 성능을 냅니다.

 

두 번째 명령어는 컨트롤 레지스터를 갱신하기 때문에 반드시 가상화해야 합니다.

 

전자의 명령어처럼 하드웨어를 직접 활용하는 것을 Direct Execution이라고 합니다.

후자의 명령어처럼 중요한 명령어만 가상화하는 것을 Para Virtualization이라고 합니다.

 

반가상화(Para Virtualization)을 구현하기 위해서는 가상화해야 하는 명령어와 그렇지 않은 명령어를 구분할 수 있어야 합니다. 그래서 OS의 커널을 직접 수정하는 방식을 활용하여 mov cr0 eax와 같은 명령어를 찾아서 가상머신에게 가상화하도록 요청할 수 있게 커널코드를 직접 수정하였습니다. 이러한 방법을 하이퍼 콜(hyper call) 호출이라고 합니다.

 

그래서 Xen에서 리눅스를 올리려면, 전용 리눅스 커널을 사용해야 했습니다.

또한 Windows 같은 운영체제는 커널을 직접 수정할 수 없기 때문에 Para Virtaulization 방식의 제품은 Windows 운영체제를 지원할 수 없었습니다.

 

VT-x/SVM 이 나온 이후로는 반드시 가상화를 해야하는 명령어와 그렇지 않은 명령어를 CPU의 아키텍처에서 알아서 구분을 해주게 됩니다. 그리하여 하드웨어 가상화 기술이 나온 이후에는 Xen 또한 Windows를 가상화할 수 있게 되어 더이상의 전가상화, 반가상화 구분이 불필요하게 되었습니다.

 

3. 컨테이너

Container

etc-image-5

 

컨테이너 가상화

: 호스트 OS 위에 컨테이너 관리 소프트웨어를 설치하여, 논리적으로 컨테이너를 나누어 사용한다. 컨테이너는 애플리케이션 동작을 위한 라이브러리와 애플리케이션 등으로 구성되기 때문에 이를 각각 개별 서버처럼 사용가능하다.

 

작은 이미지 사이즈

  • 컨테이너는 레이어 개념으로 이미지에 파일을 추가/삭제하여 관리함
  • 레이어 사이즈를 최적화하여 이미지 사이즈를 최소화

빠른 시작 시간

  • 컨테이너는 분리된 프로세스 형식으로 OS 부팅이 필요 없기 때문에 부팅 시간을 최소화 할 수 있음

높은 이동성

  • 애플리케이션에 필요한 라이브러리나 의존 파일들을 이미지에 포함하기 때문에 환경에 의한 발행되는 문제가 거의 없음