관리 메뉴

공부공부 공부공부내용

가상화 개념정리*(퍼옴) 본문

클라우드 구성 및 관리/가상화 인프라 관리 [ovirt]

가상화 개념정리*(퍼옴)

wkdth04 2020. 6. 24. 00:18

1. 가상화

가상화란 한 대의 시스템 하드웨어를 논리적으로 분할하여 가상의 시스템에 활용하는 개념이다. 가상 시스템들은 서로 독립적인 하나의 시스템으로 인지되기 때문에 주어진 하드웨어 리소스를 효율적으로 사용할 수 있다. 새로운 하드웨어 자원을 구비하고 시스템을 구축하는 것 보다 있는 자원을 활용하기 때문에 비교적 간결하고 쉽게 시스템을 올릴 수 있다. 호스트 OS를 기저에 두고 호스트를 중앙 시스템으로 하는 중앙 집중형의 서비스를 구축하기에 적절하다. 가상화를 이야기 하려면 하이퍼바이저(Hypervisor)를 빼 놓을 수 없는데, 가상 OS와 실제 하드웨어 자원 사이에 위치하며 둘 사이의 괴리를 조정해주는 역할을 하는 것으로 볼 수 있다. 이 과정을 '추상화'라고 하는데, 물리적인 하드웨어 자원을 소프트웨어적으로(가상으로)나누고, 나누어진 가상의 하드웨어를 진짜 하드웨어처럼 인지시키는 과정을 의미한다.

2. 시스템 가상화(System Virtualization)

우리가 하려는 것은 시스템 가상화이다. 가상 머신을 만들어서 운영체제를 설치하고 서비스를 구성한다. 지금 사용하는 이러한 가상화 기술은 2000년대 초반에 VMware사에서 내놓았다. 가상화의 아이디어는 메인프레임 시절부터 존재했는데, 일반 PC는 하드한 작업을 하지 않으면 CPU나 메모리가 놀게 되고 전력도 적게 공급된다. 하지만 서버 시스템은 언제나 최상의 성능을 내야 하기 때문에 전력도 최대로 공급된다. 어차피 최대 전력이 공급된다면 CPU와 메모리가 놀도록 여유를 두는 것 보다는 동시에 여러개의 어플리케이션(웹서버, DB서버, DNS, DHCP...)을 동시에 동작시키고 싶었을 것이다. 그러나 이렇게 하나의 서버시스템에서 모조리 관리하게 되면 서버가 다운되었을 때 모든 서비스가 중단되는 위험이 있다. 여기에서 가상화의 개념이 출발했다.

가상화의 핵심은 Isolation이다. 하나의 물리적 장치를 논리적으로 격리시킨다는 것이다. 제대로 격리가 이루어진다면 해당 가상 시스템 안에서 문제가 발생해도 그 밖의 영역으로 영향을 미치지 않는다는 장점을 가진다.

메인프레임 시절의 하드웨어 가상화와는 달리 현재 쓰이는 소프트웨어적인 가상화 기술을 Hipervisor라고 한다. HiperVisor를 사용하는 여러 가상 프로그램으로 VMware, VirtualBox 등이 있었다.

3. Protection ring

Ring3 = 어플

커널을 접근해야지 하드웨어를 사용할 수 있다.

3은 2를, 2는 1을 통해서만 다음 링에 접근할 수 있도록 하는 개념. MS의 x86 시스템은 이 구조로 만들어져있다.

4. 가상화 유형

Ring protection을 바탕으로 운영체제의 동작상태를 계층적으로 표현해보면, 일반적인 x86시스템은 좌측과 같은 상태이며 유닉스 메인프레임에서는 아직도 우측과 같은 하드웨어 기반의 가상화 기술을 사용하고 있다.

1) 하이퍼바이저 배치에 따른 분류

=우리가 사용하는 가상화는 Hypervisor 기반으로, Hypervisor는 소프트웨어에 의해 논리적으로 나누어진 하드웨어를 커널에게 인지시켜 나눠주는 역할을 한다. 이 하이퍼바이저에는 두 가지 형태가 있다.

[1] Baremetal(Native) Hypervisor(Type 1)

Baremetal은 깡통 시스템이다. 운영체제를 포함한 그 어떤 소프트웨어도 설치되지 않은 상태이다. 하드웨어 위에 Hypervisor 단이 있고 그 위에 VM들이 각각의 커널을 가지고 올라간다. Baremetal, Native, Type1 모두 같은 말임.

[2] Hosted Hypervisor(Type 2)

또다른 형태로는, 호스트OS에 올라가는 여러 어플리케이션 중에 하나로서 Hypervisor가 있고 그 Hypervisor 위에 VM이 만들어진다. 당연히 VM에는 그들만의 커널이 있고 그 위에서 어플리케이션이 돈다. 이와 같은 형태를 Hosted Virtualization이라고 한다. Hoted, Type2는 같은 의미이다.

[3] 비교

여기에서 HostOS와 GuestOS를 구분해보면 다음과 같다.

그림을 보면 가상화를 적용하면서 Application ring에서 Hardware ring까지 도달하는데 단계가 늘어났다. 장점도 있지만 그만큼 단점이 된다. Baremetal의 경우 원래 성능의 80%, Hosted의 경우는 60%정도의 효율밖에 내지 못한다.

비교를 위한 예를 들어보면 KVM은 리눅스 커널에서 제공하는 Hypervisor로서, 기능을 켜고 끌 때마다 재부팅이 필요 없지만 Windows의 Hyper-V는 실행하기 위해 체크/체크해제 할 때마다 재부팅을 해야 한다. 이는 KVM은 리눅스 커널 단에서 지원하는 기능이기 때문이고, Windows의 Hyper-V는 Hardware 위에 Hyper-V가 위치하고 그 위에 Windows OS가 올라가는 형태이기 때문이다. 즉, KVM은 Baremetal(Native) Hypervisor이고 Hyper-V는 Hosted Hypervisor이다.

2)Full Virtualization & Para Virtualization

Baremetal Hypervisor(Type 1)을 다시 두 가지로 분류할 수 있다. 전체를 가상화하느냐, 일부만 가상화하고 나머지는 실제 하드웨어를 그대로 사용하느냐에 따라 구분한다. 2000년대 후반까지 가상화 기술이 급속도로 발전하면서 Full virtualization에는 VMware, Para Virtualization에는 Xen가 대표주자로서 대립하는 양상을 띄었으나 현재에 와서는 결국 전 가상화와 반 가상화를 모두 지원하기에 이르렀다.

[1] 전 가상화(Full Virtualization)

전 가상화를 통해 만들어진 가상 머신의 커널은 자신이 가상 머신의 커널인지 인지하지 못 한다. 전 가상화에서 Hypervisor의 역할은 '하드웨어를 전부 가상화 시켜주고 가상의 하드웨어 정보를 VM의 커널에게 전달해서 하드웨어 요청이 필요하면 실제 하드웨어에게 요청할 필요 없이 가상의 하드웨어에 요청'할 수 있도록 하는 것이다. 그러나 이 때 Hypervisor는 일반 OS처럼 패키지를 설치하는 등의 추가동작은 하지 않는다. 정확히 정해진 동작만 수행하는 minimal OS로 보면 이해가 쉽다.

즉, 전 가상화는 모든 하드웨어를 전부 가상화 시켜서 논리적으로 배분하는 것이다. 하드웨어와 VM 커널 사이에 Hypervisor단이 있기는 하나, 이미 VM은 가상화된 하드웨어를 진짜 하드웨어로 인지하고 있기 때문에 실제 물리 자원에 대한 요청을 보낸다고 생각한다. VM이 보는 시점에서 Hypervisor 레벨이 커널-하드웨어 레벨로 보이게 되며, 실제로도 Hypervisor 단에서 트랩과 에뮬레이션을 처리하게 되는데 이 과정에서 오버헤드가 발생한다. 원래 시스템콜에 의해 발생해서 앱->커널->하드웨어 순으로 갔어야 흘러갔어야 하는 트랩을 Hypervisor 단에서 처리하게 되고, 하드웨어의 논리적 분배를 위한 소프트웨어적인 동작인 에뮬레이션(Emulation)까지 처리하면서 발생하는 성능저하이다.

여기서 쓰이는 에뮬레이션이나 Binary translation은 같은 의미이다. 예를 들면 Guest OS는 다양한 종류의 OS가 쓰일 수 있다. 그런데 Guest OS에서 가상화된 하드웨어에 요청하려고 할 때 윈도우,리눅스가 서로 같은 형식으로 요청을 보내지는 않을 것이다. 이 형식을 Hypervisor가 알아들을 수 있는 하나의 형식으로 번역해주는 작업을 Binary Translation이라고 한다. 윈도우에 도커 데스크탑을 설치하다 보면 바이오스 화면에서 한 번쯤은 보았을 텐데, Intel CPU의 VT-x, AMD CPU의 AHD-V가 Binary translation을 가능하게 해준다. 다양한 OS를 올릴 수 있는 대신에 오버헤드라는 단점이 생기는 것으로 이해하면 된다.

*트랩이란 시스템콜 등에 의해 발생하는 소프트웨어 인터럽트임. Hypervisor 단에서 트랩을 처리하게 됨으로써 사실상의 커널이 되어버리는 셈.

*GuestOS와 커널 사이에서의 Binary Translation이라는 표현이 잘 이해되지 않을 수 있는데, 좋은 글이 있어 첨부함.

(https://m.blog.naver.com/alice_k106/220218878967)

[2] 반 가상화(Para Virtualization) ___kvm 에서는 virtIO 라고 불린다.

이에 반해, 반 가상화는 트랩과 에뮬레이션을 Hypervisor가 처리하지 않는다. Binary Translation 대신 Hyper call 개념을 도입했다. 반 가상화는 하드웨어 리소스를 전부 가상화 하지 않고 일부만 가상화해서 가상화된 만큼만 분배한다. VM 밖으로 벗어나지 않고 처리할 수 있는 부분은 Guest OS가 직접 처리하고 그 외의 부분은 Hypervisor에게 넘겨줘야 하는데 이 때 Hypervisor에게 보내는 요청이 Hyper call(App이 하드웨어 자원 접근을 위해 커널 레벨에 보내는 요청을 System call이라 하는데 나는 커널 대신 Hypervisor에게 보내는 개념으로 이해했음)이다. 이렇게 되면서 Hypervisor는 필요할 때만 요청을 처리해 주는 데 지나지 않으므로 전 가상화에서 발생했던 오버헤드를 줄일 수 있게 되었다.

문제는 어플리케이션이 하드웨어 레벨에 접근하기 위해서는 Hypercall을 보내야 한다는 점이다. 그러려면 어플리케이션은 자신이 가상화 상태에 있다는걸 알아야 한다. 자신이 VM인지 아닌지를 알아야 VM 커널에 System call을 보내서 자체적으로 처리할지, 하드웨어 자원에 접근하기 위해 Hyper call을 보낼지 결정할 수 있기 때문이다. 이를 위해서는 운영체제의 설계가 수정되어야 하며 이는 곧 커널 소스의 수정을 의미한다. 리눅스 계열은 오픈소스이기 때문에 커널 소스를 수정하면 그만이지만 Windows는 소스가 공개되지 않았으므로 개인단위로 수정할 수가 없었고, 결국 아직까지 Para virtualization을 제공하지 못하고 있다.(Xen - tool을 이용하면 된다고 하는데 그냥 개념적으로 이렇다고..)

그렇다고 해서 반 가상화에는 오버헤드가 없느냐 하면 그것도 아니다. 어쨌든 한 계층을 더 거치는 것은 피할 수 없기 때문에 일정량의 오버헤드는 전 가상화든 반 가상화든 피할 수 없다. 하이퍼바이저 기반의 가상화 기술에서 발생할 수 밖에 없는 이 오버헤드를 극적으로 줄이는 컨테이너 기반 가상화 기술을 이용해서 도커가 쉽고 간결하게 가상화할 수 있도록 함으로써 대 클라우드 시대가 열렸다고 한다요..

 

[출처] [리눅스 서비스 운영] 가상화 개념 정리|작성자 isnt