"가상머신"의 두 판 사이의 차이
(→특징) |
|||
(사용자 3명의 중간 판 21개는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
− | '''가상머신'''( | + | '''가상머신'''<!--가상 머신, 가상머쉰, 가상 머쉰-->(VM; Virtual Machine)이란 실재하는 컴퓨터상에 가상으로 [[컴퓨터]]를 구동시키는 것이다. 물리적인 하드웨어를 가상화하여, 하나의 하드웨어에서 여러 대의 컴퓨터가 구동되는 것처럼 [[에뮬레이션]]하는 것이다.<ref name=“가상머신”>Namu(南無), 〈[https://studioxga.net/1408 가상 머신이란 무엇인가, 그 장점이 무엇이길래?]〉, 《시사공작소》, 2013-01-18</ref> '''가상기계''' 또는 '''브이엠'''(VM)이라고도 한다. |
− | == | + | ==개요== |
− | 가상머신은 시스템 | + | 가상머신은 [[소프트웨어]]를 이용하여 특정한 컴퓨터 시스템을 에뮬레이션한 것을 말한다. 에뮬레이션(emulation)이라는 소프트웨어 기술을 사용하여, 하나의 컴퓨터가 다른 기종의 컴퓨터와 동일한 방식으로 작동하는 것처럼 보이도록 만드는 것을 말한다. 가상머신 기술을 이용하면 하나의 물리적 [[하드웨어]] 시스템 위에 다수의 가상 환경을 구성하여, 복수의 [[운영체제]](OS)나 [[시스템]]을 운영할 수 있다. 대표적인 예로 [[자바]] 가상머신(Java Virtual Machine, JVM)이 있다. |
+ | == 특징 == | ||
+ | 이전에는 [[중앙 처리 장치]](CPU), [[메모리]] 등의 한계로 가상머신이 특별한 경우에만 사용되었지만, 시간이 갈수록 컴퓨터 사양이 높아져, [[서버]]와 개인용 [[데스크톱]]에서 사용하는 경우도 많아졌다. 현재는 서버용 운영체제에 거의 필수적으로 가상화 기술이 포함되어 있다.<ref name=“가상머신”></ref> 가상머신에서 소프트웨어를 사용할 경우, 가상머신 내부에서 작동하는 소프트웨어는 가상머신이 정해놓은 환경과 자원에 대한 제약을 받기 때문에 가상 세계를 벗어날 수 없다. 게스트 운영체제가 항상 포함되기 때문에 용량이 보통 수 GB에 해당하고, 애플리케이션을 실행할 때에도 먼저 가상머신을 띄우고 자원을 할당한 다음, 게스트 운영체제를 부팅하여 애플리케이션을 실행시켜야 한다. 가상머신은 호환성이 높아 일반적인 컴퓨터처럼 작동하기 때문에 기존 PC 또는 서버에서 하던 작업들을 그대로 할 수 있다. 그렇지만 가상머신은 격리성을 띄고 있어 컴퓨터와는 엄연히 다르기 때문에 하나의 가상머신이 [[바이러스]]에 감염되더라도 다른 곳에는 피해가 가지 않는다. 한 번 구성된 가상머신은 [[캡슐화]]를 통해 복제되어 여러 컴퓨터 또는 하나의 컴퓨터에서도 여러 개로 복제하여 쓸 수 있다. 이는 컴퓨터에 운영체제를 다시 설치할 필요를 줄여준다. 가상머신은 여러 종류의 하드웨어에서 사용하더라도 문제가 없기 때문에, 다양한 환경에서 사용된다. 일반적인 데스크톱 환경은 가상머신의 격리성과 캡슐화의 큰 도움을 받을 수 있다. 새로운 프로그램이나, 금융 관련 프로그램을 설치하여 어떤 문제가 생길지 모를 경우, 가상머신을 사용하면 그런 위험에서 벗어날 수 있다. 서버 환경에서는 앞에서 언급한 모든 장점을 사용할 수 있다. 기존 하드웨어에 구동되던 운영체제를 그대로 가상머신으로 바꾸어 구동할 수 있고, 하나의 서버에 여러 가상머신을 구동하여 하나의 하드웨어를 여러 서버로 구동시킬 수도 있다. 이러한 점들을 이용하여, 하드웨어에 영향을 받지 않고 서버를 쉽게 늘리거나 줄이고, 문제가 발생하였을 때 가상머신을 손쉽게 복제하거나 수정하는 것으로 서버 환경을 관리할 수 있다는 장점을 갖고 있다. <ref name=“가상머신”></ref> 하나의 컴퓨터에서 여러 개의 가상머신을 사용할 수 있기 때문에, 물리적 하드웨어 시스템에 대한 요구가 줄어 비용이 절감된다. 비슷한 맥락으로, 하드웨어를 보다 효율적으로 사용할 수 있고, 하드웨어 유지, 보수비용이 절감되고, 전력, 냉각의 수요가 감소한다. 가상화 하드웨어에는 장애가 발생하지 않기 때문에, 관리자는 가상 환경을 활용하여 백업, [[재해복구]](DR), 새로운 시스템 구축 및 기본 시스템 관리 작업을 간소화하여 수행할 수 있다. 반면 가상머신의 단점은 하나의 하드웨어의 중단으로 인해서 자원이 과도하게 사용되거나 여러 가상머신에서 운영이 중단되는 등 통합에 따른 위험이 존재한다는 것이다. 가상머신은 항상 실제 컴퓨터보다 느리고, 물리적 [[램]]이 작고, 그래픽 성능이 떨어지며, 저장 공간도 작다. [[USB]]나 [[플래시 드라이브]]를 추가하기 어렵고, 추가한다고 해도 여러 단계를 거쳐 짧지 않은 시간이 소요된다. 또한 항상 작동한다는 보장이 없다.<ref>Licoln Spector. 〈[https://www.itworld.co.kr/news/84100 단점을 중심으로 본 ‘가상 컴퓨터’에 대한 오해와 진실]〉, 《아이티월드》, 2013-10-11</ref> | ||
+ | |||
+ | ==종류== | ||
=== 시스템 가상머신 === | === 시스템 가상머신 === | ||
− | 시스템 가상머신(system virtual machine)은 각 운영체제를 실행하는 가상머신 사이의 기초가 되는 물리 컴퓨터를 다중화한다. | + | 시스템 가상머신(system virtual machine)은 하드웨어 가상머신이라고 하기도 하며, 각 운영체제를 실행하는 가상머신 사이의 기초가 되는 물리 컴퓨터를 다중화한다. 실제 기계의 대체재를 제공하고, 완전한 운영체계의 실행을 위해 요구되는 기능성의 수준을 제공한다. 시스템 가상머신을 사용하면 여러 운영체제를 쓰는 환경이 여러 개의 운영체제가 각각의 가상머신 안에서 고립된 채 같은 컴퓨터에서 존재할 수 있다. 가상머신은 실제의 컴퓨터가 제공하는 것과 다른 형태의 명령어 집합 구조(ISA)를 제공한다. 다양한 운영체제를 제공하기 위해 멀티 부팅의 어려움을 겪지 않아도 되고, 각각은 독립되어 있기 때문에 서로에게 영향을 미치지 않는다. 이는 관리가 용이하고, 외부의 위험으로부터 분리된 환경으로 다양한 테스트 환경에 적합하다는 것을 의미한다. 자신만의 운영체제를 실행하는 여러 개의 가상머신들을 게스트 운영체제라고 하며, 다른 장치가 충돌을 피하기 위해 각 장치에서 실행하기 위한 서버 통합에 사용되고, 각 가상머신은 같은 컴퓨터에서 사용된다. 이것을 제품 품질의 고립(QoS 고립)이라 한다. 다른 게스트 운영체제를 지원하기 위해 가상머신을 사용하는 것은 [[임베디드]] 시스템에서 인기를 끌고 있다.<ref>흉내쟁이. 〈[https://webdir.tistory.com/392 가상머신(Virtual Machine)의 이해]〉, 《티스토리》</ref> |
=== 프로세스 가상머신 === | === 프로세스 가상머신 === | ||
− | 프로세스 가상머신(process virtual machine)은 운영체제 안에서 일반 응용 프로그램을 구동하고 단일 프로세스를 지원한다. 프로세스가 시작하고, | + | [[프로세스]] 가상머신(process virtual machine)은 플랫폼에 독립적인 [[프로그램]] 실행 환경과 추상화를 제공하여 하나의 단일 프로그램(프로세스)을 실행하도록 설계되었다. 운영체제 안에서 일반 응용 프로그램을 구동하고 단일 프로세스를 지원한다. 프로세스가 시작하고, 끝내게 되어 파괴될 때 만들어진다. 목적은 어떤 플랫폼에서나 동일한 방식으로 실행되는 프로그램을 허용하고, 자바와 같이 독립적인 환경에서 컴퓨터 프로그램을 실행하기 위해 고안하는 것이다. 특별한 경우, 가상머신 프로세스는 잠재적으로 균일하지 못한 컴퓨터 [[클러스터]]의 통신 구조를 넘어 추출하는 시스템으로 사용된다. 이러한 가상머신은 단일 프로세스로 이루어져 있지 않지만, 클러스터에서 물리 컴퓨터마다 하나의 프로세스를 이룬다. 이것들은 병렬 응용 프로그램들을 프로그래밍하는 작업을 쉽게 하기 위해서 만들어져있다. 이로써 프로그램이 운영체제와 상호작용이 제공하는 통신 구조보다 알고리즘에 집중할 수 있다. 이것들은 통신이 일어난다는 사실을 숨기지 않고, 단일 병렬 컴퓨터로 클러스터를 제공하지 않는다. 다른 가상머신들과는 달리, 이런 시스템들은 특정한 프로그래밍 언어를 제공하지는 않지만, 기존의 언어에 통합되어 있어, 병렬 가상머신(Parallel Virtual Machine, PVM)이나 메시지 전달 인터페이스(Message Passing Interface, MPI)와 같은 여러 가지 언어를 위한 꾸러미들을 제공해야 한다. 원래 개발 목적은 중간 언어를 위한 추상 플랫폼으로, 1966년 BCPL [[컴파일러]]의 [[프론트엔드]]에서 발생한 목적 코드를 실행하기 위한 O-code머신을 예로 들 수 있다. 스몰토크-80, Deutsch/Schiffmann의 구현으로 상당한 진보를 이루었고, 프로세스 가상머신을 사용하는 구현 접근으로서 JIT 컴파일을 가속화시켰다. 현대의 가상머신은 컴파일을 위한 중간 대상으로서나 인터프리터에서 직접 구현할 플랫폼으로써 사용되는데, 그 예로 2013년에 공개된 안드로이드 런타임(ART)은 바이트코드를 네이티브 코드로 컴파일하며, 초기의 달빅 가상머신은 바이트코드를 해석한다. |
+ | |||
+ | ==하이퍼바이저== | ||
+ | 가상머신은 컴퓨팅 환경을 소프트웨어적으로 구현한 것을 말하는데, 보통 하드웨어를 가상화하면 그 하드웨어 위에서 다수의 가상머신들이 생성되어 각각 독립적인 운영체제 환경을 구동한다. 시스템 내의 가상머신들은 실제 가상화하기 전과 같은 수준의 실행 기능을 제공하는 것을 목적으로 하고, 가상머신들 간의 하드웨어를 공유하게 된다. 가상머신은 내부구조가 물리적인 서버의 컴퓨팅 환경과 매우 유사하다. 실제 서버처럼 CPU, 메모리, 저장소와 같은 하드웨어 자원을 활용하고, 내부에 운영체제를 구동시킬 수 있으며, 각종 응용프로그램을 구동 및 관장한다. 물리적인 서버와의 차이점은 여러 개의 가상머신이 동시에 존재할 수 있고, 각 가상머신마다 서로 다른 구동 환경을 갖출 수 있어서 다양한 어플리케이션을 수행하는 것이 가능하다는 점이다. 가상머신들은 각 머신별로 가상화된 컴퓨팅 리소스를 할당 받거나 접근(Access)한다. 가상머신은 여러 하드웨어 자원에 접근할 수 있지만 가상머신의 관점에서는 접근하는 하드웨어 디바이스가 가상이라는 것을 알지 못하며, 표준 디바이스를 다루는 것처럼 인식한다. 단, 앞서 살펴본 반가상화의 경우에는 가상머신에 탑재되어 있는 게스트OS가 하드웨어가 가상화되었다는 것을 인지하고 하이퍼바이저를 통해 디바이스에 접근한다. 가상머신을 만드는 목적은 여러 가지가 있을 수 있는데, 하나의 하드웨어위에 동시에 여러 종류의 운영체제나 프로토콜을 실행할 때, 하나의 하드웨어 자원을 여러 사용자에게 나누어 줄 때, 가상화를 통해 분할된 시스템 간 상호 간섭이 없는 독립성(Isolation)을 보장하고자 할 때 등이 있다. 하드웨어를 가상화하기 위해서는 하드웨어들을 관장할 뿐만 아니라 각각의 가상머신들을 관리할 가상머신모니터(VMM)와 같은 중간관리자가 필요하다. 이 중간관리자를 하이퍼바이저(Hyperviser)라고 하며, VM이 동작할 수 있는 환경을 제공 한다. 하이퍼바이저는 하드웨어의 물리적인 리소스를 VM들에게 제공하고, VM과 하드웨어간의 I/O 명령을 처리한다. 하이퍼바이저에 요구되는 사항은 정확성, 독립성, 성능 세 가지가 있는데, 이중 앞 두 가지는 상대적으로 만족하기 쉬우나 성능 문제는 하드웨어 자원을 공유하는 관계로 만족시키기가 어렵다. 위치 및 역할 차이에 따라 하이퍼바이저는 두 가지로 구분된다. 먼저 베어메탈(Bare-metal) 기반으로 하드웨어 위에서 바로 구동되며, 하이퍼바이저가 다수의 VM들을 관장하는 형태이다. 하이퍼바이저형으로도 잘 알려져 있다. 이 타입은 가상머신에 설치된 게스트 운영체제(Guest OS)가 하드웨어 위에서 2번째 수준으로 구동된다. 호스트형 하이퍼바이저보다는 더 향상된 성능을 제공하지만, 여러 하드웨어 드라이버를 세팅해줘야 하며 설치가 어렵다. 두 번째는 호스트 하이퍼바이저로, 하드웨어 위에 호스트 운영체제(Host OS)가 있고, 그 위에서 하이퍼바이저가 다른 응용프로그램과 유사한 형태로 동작한다. 이 타입의 하이퍼바이저에 의해서 관장되는 가상머신의 게스트OS는 하드웨어 위에서 3번째 수준으로 구동된다. 기존의 컴퓨터 환경에서 하이퍼바이저를 활용하는 것이기에 설치가 용이하고 구성이 편리한 장점이 있다. 반면, 베어메탈 하이퍼바이저보다는 성능이 떨어질 수 있다.<ref name="안성원">안성원, 〈[https://spri.kr/files/1544421791_k7LnlkLc9mgJgots3jU7H3BR_0.pdf 클라우드 가상화 기술의 변화 - 컨테이너 기반의 클라우드 가상화와 DevOps Changes in Cloud Virtualization Technology - Container-based cloud virtualization and DevOps]〉, 《소프트웨어정책연구소》, 2018-12-10</ref> | ||
+ | |||
+ | ===베어메탈=== | ||
+ | 베어메탈(bare-metal)은 네이티브(native) 가상화라고도 한다. 하이퍼바이저가 하드웨어 바로 위에서 실행되는 방식으로, 하드웨어를 직접 제어하기 때문에 자원을 효율적으로 사용할 수 있다. 호스트 운영체제에 의존하지 않기 때문에, [[입출력]] [[디바이스]]와 직접 통신해야 하고, 가상머신 간에 입출력 디바이스가 공유되기 위해서는 하이퍼바이저 소프트웨어가 저 레벨의 [[드라이버]]를 보유해야 한다. 또한 게스트 가상머신을 위해 공유되는 디바이스를 반드시 에뮬레이션 할 수 있어야 한다. 베어메탈 가상화 [[아키텍처]]에서 가상머신 간에 공유되는 시스템 입출력 디바이스는 반드시 하이퍼바이저의 [[커널]] 드라이버에 접근해야 한다. 베어메탈 하이퍼바이저가 입출력 디바이스에 접근할 수 있는 또 다른 방법은 파티셔닝으로, 개별 디바이스를 특정 가상머신에 배정하는 방법이다. 입출력 성능과 엔지니어링에 대한 지원을 대폭 향상할 수 있고, 파티션된 입출력 디바이스는 네이티브 드라이버를 사용하여 가상머신으로부터 직접 접근이 가능하기 때문에 하이퍼바이저에 의한 간섭이 적어진다. 호스트 운영체제에 의존하지 않기 때문에 [[오버헤드]]가 적어 [[인터럽트]] 지연을 막고 결정성 있는 성능을 가능하게 하는 기능을 구현할 수 있고, 동일한 하드웨어에서 리얼 타임 및 범용 운영체제를 구현할 수 있다는 장점이 있다. 다만 가상머신간에 공유되는 디바이스용 드라이버뿐만 아니라, 다양한 하드웨어 [[플랫폼]]을 지원하기 위한 모든 드라이버가 하이퍼 바이저에 반드시 포함되어 있어야 하고, 호스트형 솔루션보다 설치나 구성이 어렵다는 단점이 있다.<ref name=“가상화종류”>덕쑤, 〈[https://duksoo.tistory.com/entry/%EA%B0%80%EC%83%81%ED%99%94-Virtualization%EC%9D%98-%EB%82%B4%EB%B6%80-%EA%B8%B0%EC%88%A0 가상화(Virtualization)의 내부기술]〉, 《티스토리》, 2013-01-18</ref> [[젠]](Xen), [[마이크로소프트]], 하이퍼-V, KVM등이 대표적이다. 하드웨어와 인터랙션 하는 방식에 따라 전가상화(Full Virtualization), 반가상화(Para Virtualization) 이렇게 두 가지로 세분화 할 수 있다. 전가상화란 게스트 운영체제를 호스트 시스템과 완전히 분리하여 실행하고, 하드웨어 자원을 요청하기 위해, 반드시 하이퍼바이저가 중재해야 한다. 각 운영체제는 관리 머신을 거쳐 하이퍼바이저와 통신하기 때문에, 중앙 처리 장치와 램처럼 입출력이 잦은 자원은 컨트롤하기 어렵다고 번거롭다는 단점이 있다. 이러한 단점을 개선하기 위해서 출현한 것이 반가상화다. 반가상화는 게스트 운영체제의 일부를 수정하여 하드워어가 자원을 직접적으로 요구할 수 있도록 하는 것이다. 반가상화 방식을 하드웨어를 완전히 가상화하지 않고, 게스트 운영체제의 커널을 일부 수정하여 하드웨어와 인터랙션 할 수 있도록 해야 한다. 운영체제를 수정해야 하기 때문에, 게스트 운영체제가 윈도우일 경우 별도의 도구을 이용해야 한다는 번거로움이 있다. 대표적인 반가상화방식 소프트웨어인 젠에서 게스트 운영체제는 하이퍼콜(Hyper Call)이라는 명령어를 통해 하드웨어에 필요한 자원을 바로 하이퍼바이저에 전달하고, 하이퍼바이저는 바로 하드웨어를 제어한다. 각각의 운영체제가 한꺼번에 처리하여 하드웨어를 제어하는 전가상화 방식에 비해 성능이 좋다. | ||
− | == | + | ===호스트형=== |
− | + | 호스트형 하이퍼바이저는 일반적인 소프트웨어처럼 호스트 운영체제 위에서 실행된다. 하드웨어 자원을 가상머신 내부 게스트의 게스트 운영체제에 에뮬레이트 하는 방식이기 때문에 베어 메탈 방식에 비해 오버헤드가 크지만, 게스트 운영 종류에 대한 제약이 없고, 데스크톱뿐 아니라, 노트북에서도 운영할 수 있다. 기본 운영체제가 먼저 설치되고, 그 위에 하이퍼바이저 소프트웨어가 호스트 운영체제 위에 설치되면, 호스트 운영체제 위에서 다양한 게스트 운영체제를 실행할 수 있다. 대표적으로 VM웨어 서버, VM웨어 워크스테이션, 가상박스, 패러렐즈 데스크탑이 있다. 하이퍼바이저에 의해 구동되는 가상머신은 각 가상머신 별로 독립된 가상의 자원을 할당받는다. 가상머신은 논리적으로 분리되어 있어서 한 가상머신에 오류가 발생해도, 다른 가상머신으로 확산되지 않는다는 장점이 있다.<ref>〈[https://library.gabia.com/contents/infrahosting/7426/ 서버 가상화 기술의 진화:VM과 컨테이너]〉, 《가비아 라이브러리》</ref> 또한 설치와 구성이 편리하고, 호스트 운영체제가 저 레벨 하드웨어와 통신하기 위한 드라이버를 제공하기 때문에 사용자 정의 없이 광범위한 PC에서 실행 가능하다. 호스트형 가상화는 일반적으로 제한된 입출력 디바이스 서브셋으로만 접근이 가능하다. 호스트 운영체제는 컴퓨터에 연결된 물리적인 입출력에 대한 소유권이 있고, 가상화 머신 모니터는 각 가상머신에 실제 하드웨어의 에뮬레이션 된 보기를 제공한다. 가상화 머신 모니터는 PCI(Peripheral Component Interconnect ) 데이터 수집 카드와 같은 대부분의 비일반 입출력 디바이스에 대한 지식이 없기 때문에, 에뮬레이션된 디바이스를 가상머신에 제공하지 않고, 네트워크 인터페이스와 [[씨디롬]](Compact Disc Read Only Memory, CD-ROM)드라이버 같은 일반 디바이스만 에뮬레이션 된다. 호스트형 가상화 솔루션은 USB 포트를 위한 PCI 통과 기능도 제공한다. 이 기능을 통해 사용자들은 게스트 운영체제에서 USB 데이터 수집 디바이스에 접근하여 데이터를 수집하는 등 개별 가상머신에서 USB 드라이버에 직접 접근할 수 있다. 여러 소프트웨어 컴포넌트가 함께 작동하여 호스트형 가상화 아키텍처에서 입출력이 가능하도록 한다. 이때 알아야 할 것은 궁극적으로 입출력 요청은 호스트형 가상화 아키텍처의 호스트 운영체제를 통해 전달된다는 것이다.<ref name=“가상화종류”></ref> | |
+ | |||
+ | ==가상화 기법== | ||
+ | 개별 가상머신은 컴퓨터 하드웨어와 분리하기 위해 가상화 머신 모니터가 사용할 수 있는 여러 가지 내부 기술을 사용한다. 지금까지 본 가상화 아키텍처는 2진 전환, 하드웨어 보조, 파라버추얼라이제이션(Paravirtualization) 이 3가지 중 적어도 한 가지를 사용한다. 2진 전환을 사용하는 하이퍼바이저는 시스템 상태에 끼치는 영향을 피하기 위해 실행되는 코드를 동적을 변경한다. 버추얼머신의 컴파일된 코드에 특권 명령을 포함하게 되면 기본 하이퍼바이저는 2진 전환을 사용하여 입출력 요청을 적절하게 방향을 전환하고 개별 가상머신 간 충돌을 방지한다. 호스트형 가상화 소프트웨어는 일반적으로 2진 전환을 사용하여 입출력 방향을 전환하고 개별 가상머신 간의 충돌을 방지한다. 호스트형 가상화 소프트웨어는 일반적으로 2진 전환을 사용하는데 대표적인 예로 VM웨어 워크스테이션 제품을 들 수 있다. 코드가 전환될 때마다 성능이 저하되므로, 2진 전환을 사용하는 가상화 소프트웨어는 그때마다 지시 모음을 검사하고 전환한다. 2진 전환을 사용하는 소프트웨어는 가상화 머신 모니터가 버추얼 머신 실행과 반드시 인터페이스 해야 하는 시간을 최소화하여 사용자가 경험하는 성능 영향을 최소화할 수 있다. 하드웨어 보조 방식은 실행되는 도안 가상머신 코드를 변경하는 대신, 특권 명령에 대한 시스템 상태 변경을 피하기 위해 특수 프로세서 기술을 사용한다. 인텔(Intel)과 어드밴스드 마이크로 디바이시스(Advanced Micro Devices, AMD) 모두 필요할 때마다 가상화 머신 모니터를 자동 호출하기 위해 각 프로세서에 새로운 가상화 기능을 적용하고 있다. 많은 베어 메탈 하이퍼바이저가 이 기술을 활용한다. 2진 전환의 경우에서와 같이 성능은 하이퍼바이저가 버추얼 머신의 실행을 간섭해야 할 때마다 저하된다. 이 같은 효과를 최소화하기 위해 가상화를 위한 하드웨어 기능을 통합하는 프로세서는 절대적으로 필요할 때에만 가상머신 실행을 간섭하도록 구성된다. 예를 들어, 특정 입출력 디바이스가 파티셔닝되면, 그 후에는 하이퍼바이저의 간섭없이 배정된 가상머신이 접근 가능할 것이다. 가상화를 수행하기 위한 마지막 기법은 파라버추얼라이제이션으로, 운영체제를 명시적으로 변경함으로써 가상화되고 있음을 인식하도록 하고, 가상화 머신 모니터가 필요할 때 자동 호출하도록 한다. 이와 같은 호출을 하이퍼콜이라고도 한다. 파라버추얼라이제이션이 가상화 머신 모니터가 반드시 호출되어야 하는 횟수를 최소화함으로써 성능을 대폭 향상할 수 있지만, 변경이 이루어지도록 하기 위해 운영 코드의 소스 코드로의 접근을 확보하였다.<ref>shineLight〈[https://hasunjjang.blogspot.com/2016/08/virtualization.html 가상화(Virtualization)]〉, 《블로거》, 2016-08-31</ref> | ||
+ | |||
+ | == 활용 == | ||
+ | 가상머신은 자바 등 다양한 프로그래밍 언어와 [[블록체인]] 기반의 [[암호화폐]] 플랫폼에서 활용되고 있다. | ||
+ | * '''윈도우 가상머신'''(Windows Virtual Machine) : 대부분의 하이퍼바이저는 윈도우 운영체제를 게스트로 실행하는 가상머신을 제공한다. 마이크로소프트의 하이퍼-V 하이퍼바이저는 윈도우 운영체제의 일부로서 제공된다. 설치할 때 자신과 기본 윈도우 운영체제를 모두 포함하는 상위 파티션을 작성하며, 이들 각각은 하드웨어에 대한 액세스 권한을 부여받는다. 윈도우 게스트를 포함한 다른 운영 체제는 상위 파티션을 통해 하드웨어와 통신하는 하위 파티션에서 실행된다. | ||
+ | * '''안드로이드 가상머신'''(Android Virtual Mahine) : [[구글]]의 [[오픈소스]] [[안드로이드]]는 [[모바일]] 디바이스에서 공통이며, 홈 엔터테인먼트 디바이스 등의 홈 디바이스에 연결된다. 안드로이드는 이러한 디바이스에 공통인 ARM(Advanced Risk MAchine) 프로세서 아키텍처에서만 실행되지만, 안드로이드 게이머나 소프트웨어 개발자 등이 이를 PC에서 실행하고자 할 수도 있다. 이 경우 전혀 다른 x86 프로세서 아키텍처에서 실행되는 PC와 하드웨어 가상화 하이퍼바이저가 가상머신 및 중앙처리 장치 간의 명령어만 전달하기 때문에 문제가 생긴다. 다양한 명령어 집합을 보유한 프로세서에 대해서는 변환하는 기능을 제공하지 않기 때문에 이 문제를 해결하려면 다음과 같은 방법을 사용해야 한다. 샤실리크(shashlik) 또는 지니모션(Genymotion) 등의 일부 프로그램 소프트웨어에서는 ARM 아키텍처를 재작성하는 에뮬레이터를 사용한다. 또는 안박스(Anbox_를 사용하여 리눅스 운영체제의 커널에서 안드로이드 운영 체제를 실행하는 방법도 있다. | ||
+ | * '''자바 가상머신''' : 자바 플랫폼은 자바 소프트웨어 개발 언어로 작성된 프로그램의 실행 환경이다. 자바는 한 번만 작성하고 어디서나 실행하는 기능을 제공하는데, 이는 자바 플랫폼을 실행하는 모든 하드웨어에서 모든 자바 프로그램이 실행될 수 있다는 의미다. 이 기능을 제공하기 위해 자바 플랫폼에는 자바 가상머신이 포함되어 있다. 자바 프로그램에는 바이트 코드가 포함되며, 이는 자바 가상머신용으로 작성된 명령어다. 자바 가상머신은 이 바이트 코드를 호스트 컴퓨터에서 사용하는 최하위 레벨 언어인 머신 코드로 컴파일한다. 하나의 컴퓨팅 플랫폼의 자바 플랫폼에 있는 자바 가상머신은 프로세서가 예상하는 머신 코드에 기반으로 하여 다른 머신 코드 명령어 세트를 기타의 자바 가상머신에 작성한다. 따라서 자바 가상머신은 전체 운영체제를 실행하지 않고, 다른 자바 가상머신에서 사용하듯이 하이퍼바이저를 사용하지 않지만, 대신 이는 특정 하드웨어에서 실행할 애플리케이션 레벨 소프트웨어 프로그램을 변환한다. | ||
+ | * '''우분투 가상머신'''(Ubuntu Vitrual Machine): 우분투는 캐노니컬(Canonical)에서 제작한 리눅스 배포판으로, 데스크탑과 서버 버전에서 사용 가능하며, 가상머신으로 설치할 수 있다. 우분투를 마이크로소프트 하이퍼-V에서 게스트 운영체제로 배치할 수도 있다. 우분투는 하이퍼-V의 상향된 세션 모드에서 잘 작동하는 우분투 데스크탑의 최적화된 버전을 제공하고, 윈도우 호스트와 우분투 가상머신 간의 긴밀한 통합을 제공한다. 여기에는 클립 보드 통합, 동적 데스크탑 크기 조정, 공유 폴더 및 호스트와 게스트 데스크탑 간의 마우스 이동에 대한 지원이 포함된다.<ref>〈[https://www.ibm.com/kr-ko/cloud/learn/virtual-machines#toc-vm—DDfvcFnk 가상 머신(VM)]〉, 《IBM》</ref> | ||
+ | * '''이더리움 가상머신'''(Ethereum Virtual Machine, EVM): 이더리움 가상머신은 스마트 콘트랙트 배포 및 실행을 처리하는 이더리움의 일부다. 하나의 외부 소유 계정(External Owned Account)에서 다른 외부 소유 계정으로 간단한 값을 전송하는 트랜잭션은 이더리움 가상머신이 필요 없지만, 그 외 모든 것은 이더리움 가상머신에 의한 상태 업데이트를 수반한다. 크게 보면 이더리움 블록체인에서 실행되는 이더리움 가상머신은 자체 영구 데이터 저장소가 있는 수백만 개의 실행 가능 [[객체]]를 가진 전 세계에서 탈중앙화된 컴퓨터다. 스마트 콘트랙트 실행에 사용할 수 있는 가스양에 따라 모든 실행 프로세스가 유한개의 계산 단계로 제한된다는 것을 의미한다. 이더리움 가상머신은 메모리 내의 모든 값을 스택에 저장하는 스택 기반 아키텍처로 256비트의 단어 크기로 동작하며, 주소 지정이 가능한 여러 개의 데이터 구성 요소를 가지고 있다. 실행할 스마트 콘트랙트의 바이트 코드가 저장되는 불변 프로그램 코드 롬, 모든 위치가 0으로 초기화하는 파괴성 메모리, 이더리움 상태의 일부인 영구 저장소가 이에 해당한다. 이더리움 가상머신의 명령어 집합에는 산술 및 비트 논리 연산, 실행 콘트랙트 세트 조회, 스택, 메모리, 스토리지 접근, 흐름 제어 작업, [[로깅]], 호출, 기타연산자 등이 있다.<ref>HAS3ONG, 〈[https://has3ong.tistory.com/453 (Ethereum) EVM, 이더리움 가상 머신 –1-]〉, 《티스토리》, 2019-06-22</ref> | ||
+ | |||
+ | ==프로그램== | ||
+ | ===가상머신 응용 소프트웨어=== | ||
+ | * '''공통 언어 런타임'''(Common Language Runtime, CLR) : 마이크로소프트 이니셔티브에서 제공하는 가상머신의 구성요소로 프로그램 코드를 위한 실행 환경을 정의하는 마이크로소프트의 공통 언어 기반(CLI) 표준의 기능이다. [[C#]]이나 VB 닷넷과 같은 언어로 프로그래밍하며, 해당 언어의 컴파일러가 소스 코드를 공통 중간 언어(IL) 코드로 변환한다. CLR은 관리되는 코드를 실행하기 위한 런타임으로, 관리되는 언어로 작성한 소스 코드를 컴파일하면 관리되는 코드가 생성된다. 관리되는 코드를 실행 파일 또는 [[라이브러리]](.dll) 형태로 만들고 그것을 형식 정보, 즉 메타 자료와 함께 하나의 [[패키지]]로 묶은 것을 어셈블리라고 한다. 어셈블리를 적재할 때 CLR은 IL 코드를 해당 컴퓨터 고유의 기계어 코드로 변환한다. 이러한 변환을 담당하는 것이 CLR의 JIT(Just – in – time)컴파일러이다. 어셈블리는 원래의 원본 언어의 구성을 거의 그대로 유지하기 때문에, 코드를 조사하기 쉽고 심지어 동적으로 생성하기도 쉽다.<ref>HJH0825, 〈[https://funfunhanblog.tistory.com/305 C#] CLR(Common Language Runtime)이란?]〉, 《티스토리》, 2020-02-04</ref> | ||
+ | * '''병렬 가상머신'''(Parallel Virtual Machine) : 1989년 오크리지 국립연구소의 알 가이스트(Al Geist)에 의해 처음 생성되었고, 이 작업을 바탕으로 이 프로젝트는 꾸준히 확장되고, 성장해왔다. 병렬 가상머신 시스템에는 개별 머신에 있는 [[애플리케이션]]과 [[인터페이스]]루틴 라이브러리 두 부분이 있다. 소프트웨어 응용 프로그램을 병렬 가상 시스템 데몬, pmvd3 또는 pmvd라고 한다. 이 작은 프로그램은 병렬 가상머신 애플리케이션을 실행해야 할 때까지 수동적으로 배치된다. 사용가가 이 유형의 프로그램을 실행하려면, 먼저 병렬 가상머신을 시작해야 한다. 이를 통해 다른 호스트의 소프트웨어에 액세스 할 수 있다. 병렬 가상머신 루틴 라이브러리에는 별도의 호스트에서 실행되는 다양한 작업을 조정하는 데 필요한 모든 코드의 전체 목록이 있다. 이 라이브러리에는 메시지 전달, 작업 조정 및 가상머신 자체의 변경에 대한 표준 루틴이 포함되어 있다. 병렬 가상머신의 핵심 개념은 모든 애플리케이션에 독립적으로 실행할 수 있는 여러 태스크가 있다는 것이다. 병렬 가상머신에서는 기능적 병렬 처리와 데이터 병렬 처리 두 가지 방식으로 병렬 처리를 할 수 있다. 기능적 병렬 처리는 애플리케이션을 명확하게 정의된 독립적인 작업으로 분리하는 것으로, 별도의 호스트 시스템에서 수행한다. 병렬 가상머신은 입력, 솔루션, 출력 및 디스플레이와 같은 기능을 기반으로 조정하는 데 사용된다. 이 방식보다는 데이터 병렬 처리 또는 단일 프로그램 다중 데이터(SMPD)가 더 널리 사용되곤 한다. 이 방법에서는 모든 작업이 동일하지만, 각 호스트는 더 큰 퍼즐의 작은 조각을 해결한다는 차이점이 있다. 병렬 가상머신 환경은 두 가지 방법을 모두 지원하므로, 필요에 따라 두 가지 방법을 혼합해서 사용하는 것이 가장 효과적이다. C, C++ 및 Fortan 등의 프로그래밍 언어가 사용된다.<ref>〈[https://www.netinbag.com/ko/internet/what-is-a-parallel-virtual-machine.html 병렬 가상 머신이란 무엇입니까?]〉, 《Netinbag》</ref> | ||
+ | |||
+ | ===하드웨어 가상머신=== | ||
+ | * '''마이크로소프트 버추얼 PC'''(Microsoft Virtual PC) : 마이크로소프트 윈도우 운영 체제용 가상화 제품군으로, 윈도우 가상 PC라고도 한다. 원래 코네틱스(Connectix)사가 만들었지만, 나중에 마이크로소프트에 인수되었다. 버추얼 PC는 표준 PC와 그에 따른 하드웨어를 가상으로 구현한다. 그러므로 개인용 컴퓨터에서 사용할 수 있는 거의 모든 운영체제를 실행하는데 사용할 수 있다. 그러나 버추얼 PC의 개발에 목표를 두지 않은 알려져 있지 않은 운영체제를 설치하려고 하면 문제가 발생할 수도 있다. 마이크로소프트는 이 제품을 Hyper-V로 대체하였다.<ref>〈[https://ko.wikipedia.org/wiki/%EC%9C%88%EB%8F%84%EC%9A%B0_%EA%B0%80%EC%83%81_PC 윈도우 가상 PC]〉, 《위키백과》</ref> | ||
+ | * '''버추얼박스'''(Virtualbox) : 본래 이노테크(InnoTek)가 개발한 뒤, 현재는 [[오라클]](Oracle)이 개발 중인 상용, 사유 소프트웨어로 [리눅스]], [[맥]] 운영체제, [[솔라리스]], [[윈도우]]를 게스트 운영체제로 가상화하는 x86 가상화 소프트웨어이다. 개발된 지 몇 해가 지나, 제한된 오픈소스 버전으로 버추얼박스 OSE가 2007년 1월에 공개되었다. 다른 상용 가상화 소프트웨어들에 비하면 기능이 부족한 편이지만, 원격 데스크톨 프로토콜(RDP), iSCSI 지원, 원격 데스크톱 프로토콜을 거치는 원격 장치의 USB 지원 등 원격으로 가상 컴퓨터를 제어하는 등 특별한 기능을 지원한다. 버추얼 박스는 인텔의 하드웨어 가상화 VT-x와 어드밴스드 마이크로 디바이시스의 AMD-V를 지원한다. 버추얼 박스를 사용하게 되면 [[하드 디스크]]는 가상 디스크 이미지(Virtual Disk Image, VDI)라는 컨테이너 포맷으로 에뮬레이트 된다. 현재 다른 가상화 프로그램에서 쓰이는 포맷과 호환되지는 않지만, VM웨어 가상머신의 디스크 형식의 이미지 파일을 읽고 쓸 수 있고, 마이크로소프트 가상 PC의 디스크 이미지 또한 동일하게 지원하고 있다. 게스트 코드를 되도록 네이티브로 수행한다. 버추얼박스 소프트웨어는 클로즈드 소스 버전과 오픈 소스 버전 두 가지가 있다. 완전한 버추얼박스 패키지는 사유 소프트웨어 라이선스를 가지며, 개인이나 교육, 제품 평가용으로는 아무런 대가 없이 소프트웨어를 이용할 수 있다. 상업적인 용도의 경우, 썬마이크로시스템즈에서 프로그램을 따로 구매해야 했지만, 버전 4 이후로는 코어 패키지가 [[프리웨어]]로 배포되었다. 앞에서 언급한 OSE가 버추얼박스 오픈 소스 에디션이라고 불리는 오픈 소스 버전인데, 내장된 원격 데스크톱 프로토콜 서버, USB 지원, 가상 하드디스크의 iSCSI 지원 등을 제외한 나머지 기능을 제공하고 있다.<ref>〈[https://ko.wikipedia.org/wiki/%EB%B2%84%EC%B6%94%EC%96%BC%EB%B0%95%EC%8A%A4 버추얼 박스]〉, 《위키백과》</ref> | ||
+ | |||
+ | ==비교== | ||
+ | ===컨테이너=== | ||
+ | 컨테이너화를 이끄는 두 가지 주도적인 힘은 컨테이너 가동에 널리 사용되는 툴인 도커, 그리고 여러 컨테이너를 관리하는 데 도움이 되는 구글 쿠버네티스다. 컨테이너는 호스트 OS의 커널을 공유하는 독립적인 코드 실행 환경이다. 컨테이너는 중복 게스트 운영체제 및 관련 시작 오버헤드를 건너뛰므로 가상머신에 비해 더 능률적이고 가볍다. 개발자는 동일한 하드웨어에서 가상머신에 비해 6~8배 더 많은 컨테이너를 실행할 수 있다. 컨테이너에도 단점은 있다. 비교적 새로운 접근 방법이므로 성숙한 기술에서 흔히 볼 수 있는 풍부한 관리 툴이 없고 따라서 설정과 유지보수 작업이 많이 필요하다. 또한 보안에 대한 우려도 있다. 가상머신에서는 게스트 이미지를 사용해서 호스트에서 호스트로 손쉽게 워크로드를 옮길 수 있지만 베어 메탈은 업그레이드와 이동이 더 어렵다. 베어 메탈 서버에서는 머신 상태 롤백이 쉽지 않은 일이다. | ||
+ | |||
+ | ===서버리스 컴퓨팅=== | ||
+ | 전통적인 IaaS 클라우드 환경에서 고객은 먼저 가상머신, 스토리지, 데이터베이스, 관련 보안 및 관리 툴을 프로비저닝한 다음 가상머신에 애플리케이션을 로드한다. 서버리스 컴퓨팅에서는 개발자가 코드를 쓰고 클라우드 서비스 제공업체가 나머지 모든 부분을 처리한다. 개발자는 서버, 운영체제, 프로비저닝 또는 관리에 대해 생각할 필요가 없다. 물론 코드를 실행하는 실제 서버가 있지만, 이는 [[클라우드]] 서비스 제공업체의 책임이다. 모놀리식 애플리케이션 대신 코드는 구체적인 함수로 세분화된다. 그 함수를 트리거하는 이벤트가 발생하면 서버리스 서비스(아마존 람다(Lambda) 등)가 함수를 실행한다. 서버리스 제공업체는 함수별로 고객에게 비용을 청구한다. 마이크로서비스/컨테이너 시나리오와 마찬가지로, 서버리스 컴퓨팅은 가상머신 계층을 건너뛰며 함수는 베어 메탈에서 실행된다. 현재 시점에서 서버리스 컴퓨팅은 비교적 미성숙한 기술이며 사용 사례도 제한적이다.<ref>Neal Weinberg , 〈[http://www.itworld.co.kr/news/110031 서버 가상화의 미래 : 컨테이너 및 서버리스 비교 진단]〉, 《아이티월드》, 2018-07-13</ref> | ||
− | + | {{각주}} | |
− | |||
− | |||
− | |||
− | == | + | ==참고자료== |
− | * | + | *Namu(南無), 〈[https://studioxga.net/1408 가상 머신이란 무엇인가, 그 장점이 무엇이길래?]〉, 《시사공작소》, 2013-01-18 |
+ | *Licoln Spector. 〈[https://www.itworld.co.kr/news/84100 단점을 중심으로 본 ‘가상 컴퓨터’에 대한 오해와 진실]〉, 《아이티월드》, 2013-10-11 | ||
+ | *흉내쟁이. 〈[https://webdir.tistory.com/392 가상머신(Virtual Machine)의 이해]〉, 《티스토리》 | ||
+ | *〈[https://ko.wikipedia.org/wiki/%EA%B0%80%EC%83%81_%EB%A8%B8%EC%8B%A0 가상 머신]〉, 《위키백과》 | ||
+ | *덕쑤, 〈[https://duksoo.tistory.com/entry/%EA%B0%80%EC%83%81%ED%99%94-Virtualization%EC%9D%98-%EB%82%B4%EB%B6%80-%EA%B8%B0%EC%88%A0 가상화(Virtualization)의 내부기술]〉, 《티스토리》, 2013-01-18 | ||
+ | *〈[https://library.gabia.com/contents/infrahosting/7426/ 서버 가상화 기술의 진화:VM과 컨테이너]〉, 《가비아 라이브러리》 | ||
+ | *shineLight〈[https://hasunjjang.blogspot.com/2016/08/virtualization.html 가상화(Virtualization)]〉, 《블로거》, 2016-08-31 | ||
+ | *〈[https://www.ibm.com/kr-ko/cloud/learn/virtual-machines#toc-vm—DDfvcFnk 가상 머신(VM)]〉, 《IBM》 | ||
+ | *HAS3ONG, 〈[https://has3ong.tistory.com/453 (Ethereum) EVM, 이더리움 가상 머신 –1-]〉, 《티스토리》, 2019-06-22 | ||
+ | *HJH0825, 〈[https://funfunhanblog.tistory.com/305 C#) CLR(Common Language Runtime)이란?]〉, 《티스토리》, 2020-02-04 | ||
+ | *〈[https://www.netinbag.com/ko/internet/what-is-a-parallel-virtual-machine.html 병렬 가상 머신이란 무엇입니까?]〉, 《Netinbag》 | ||
+ | *〈[https://ko.wikipedia.org/wiki/%EC%9C%88%EB%8F%84%EC%9A%B0_%EA%B0%80%EC%83%81_PC 윈도우 가상 PC]〉, 《위키백과》 | ||
+ | *〈[https://ko.wikipedia.org/wiki/%EB%B2%84%EC%B6%94%EC%96%BC%EB%B0%95%EC%8A%A4 버추얼 박스]〉, 《위키백과》 | ||
+ | *Neal Weinberg , 〈[http://www.itworld.co.kr/news/110031 서버 가상화의 미래 : 컨테이너 및 서버리스 비교 진단]〉, 《아이티월드》, 2018-07-13 | ||
== 같이 보기 == | == 같이 보기 == | ||
− | * [[ | + | * [[자바 가상머신]] |
+ | * [[가상화]] | ||
+ | * [[하드웨어]] | ||
+ | * [[운영체제]] | ||
+ | * [[드라이버]] | ||
− | + | {{소프트웨어|검토 필요}} | |
− | + | {{하드웨어}} |
2022년 11월 28일 (월) 18:13 기준 최신판
가상머신(VM; Virtual Machine)이란 실재하는 컴퓨터상에 가상으로 컴퓨터를 구동시키는 것이다. 물리적인 하드웨어를 가상화하여, 하나의 하드웨어에서 여러 대의 컴퓨터가 구동되는 것처럼 에뮬레이션하는 것이다.[1] 가상기계 또는 브이엠(VM)이라고도 한다.
목차
개요[편집]
가상머신은 소프트웨어를 이용하여 특정한 컴퓨터 시스템을 에뮬레이션한 것을 말한다. 에뮬레이션(emulation)이라는 소프트웨어 기술을 사용하여, 하나의 컴퓨터가 다른 기종의 컴퓨터와 동일한 방식으로 작동하는 것처럼 보이도록 만드는 것을 말한다. 가상머신 기술을 이용하면 하나의 물리적 하드웨어 시스템 위에 다수의 가상 환경을 구성하여, 복수의 운영체제(OS)나 시스템을 운영할 수 있다. 대표적인 예로 자바 가상머신(Java Virtual Machine, JVM)이 있다.
특징[편집]
이전에는 중앙 처리 장치(CPU), 메모리 등의 한계로 가상머신이 특별한 경우에만 사용되었지만, 시간이 갈수록 컴퓨터 사양이 높아져, 서버와 개인용 데스크톱에서 사용하는 경우도 많아졌다. 현재는 서버용 운영체제에 거의 필수적으로 가상화 기술이 포함되어 있다.[1] 가상머신에서 소프트웨어를 사용할 경우, 가상머신 내부에서 작동하는 소프트웨어는 가상머신이 정해놓은 환경과 자원에 대한 제약을 받기 때문에 가상 세계를 벗어날 수 없다. 게스트 운영체제가 항상 포함되기 때문에 용량이 보통 수 GB에 해당하고, 애플리케이션을 실행할 때에도 먼저 가상머신을 띄우고 자원을 할당한 다음, 게스트 운영체제를 부팅하여 애플리케이션을 실행시켜야 한다. 가상머신은 호환성이 높아 일반적인 컴퓨터처럼 작동하기 때문에 기존 PC 또는 서버에서 하던 작업들을 그대로 할 수 있다. 그렇지만 가상머신은 격리성을 띄고 있어 컴퓨터와는 엄연히 다르기 때문에 하나의 가상머신이 바이러스에 감염되더라도 다른 곳에는 피해가 가지 않는다. 한 번 구성된 가상머신은 캡슐화를 통해 복제되어 여러 컴퓨터 또는 하나의 컴퓨터에서도 여러 개로 복제하여 쓸 수 있다. 이는 컴퓨터에 운영체제를 다시 설치할 필요를 줄여준다. 가상머신은 여러 종류의 하드웨어에서 사용하더라도 문제가 없기 때문에, 다양한 환경에서 사용된다. 일반적인 데스크톱 환경은 가상머신의 격리성과 캡슐화의 큰 도움을 받을 수 있다. 새로운 프로그램이나, 금융 관련 프로그램을 설치하여 어떤 문제가 생길지 모를 경우, 가상머신을 사용하면 그런 위험에서 벗어날 수 있다. 서버 환경에서는 앞에서 언급한 모든 장점을 사용할 수 있다. 기존 하드웨어에 구동되던 운영체제를 그대로 가상머신으로 바꾸어 구동할 수 있고, 하나의 서버에 여러 가상머신을 구동하여 하나의 하드웨어를 여러 서버로 구동시킬 수도 있다. 이러한 점들을 이용하여, 하드웨어에 영향을 받지 않고 서버를 쉽게 늘리거나 줄이고, 문제가 발생하였을 때 가상머신을 손쉽게 복제하거나 수정하는 것으로 서버 환경을 관리할 수 있다는 장점을 갖고 있다. [1] 하나의 컴퓨터에서 여러 개의 가상머신을 사용할 수 있기 때문에, 물리적 하드웨어 시스템에 대한 요구가 줄어 비용이 절감된다. 비슷한 맥락으로, 하드웨어를 보다 효율적으로 사용할 수 있고, 하드웨어 유지, 보수비용이 절감되고, 전력, 냉각의 수요가 감소한다. 가상화 하드웨어에는 장애가 발생하지 않기 때문에, 관리자는 가상 환경을 활용하여 백업, 재해복구(DR), 새로운 시스템 구축 및 기본 시스템 관리 작업을 간소화하여 수행할 수 있다. 반면 가상머신의 단점은 하나의 하드웨어의 중단으로 인해서 자원이 과도하게 사용되거나 여러 가상머신에서 운영이 중단되는 등 통합에 따른 위험이 존재한다는 것이다. 가상머신은 항상 실제 컴퓨터보다 느리고, 물리적 램이 작고, 그래픽 성능이 떨어지며, 저장 공간도 작다. USB나 플래시 드라이브를 추가하기 어렵고, 추가한다고 해도 여러 단계를 거쳐 짧지 않은 시간이 소요된다. 또한 항상 작동한다는 보장이 없다.[2]
종류[편집]
시스템 가상머신[편집]
시스템 가상머신(system virtual machine)은 하드웨어 가상머신이라고 하기도 하며, 각 운영체제를 실행하는 가상머신 사이의 기초가 되는 물리 컴퓨터를 다중화한다. 실제 기계의 대체재를 제공하고, 완전한 운영체계의 실행을 위해 요구되는 기능성의 수준을 제공한다. 시스템 가상머신을 사용하면 여러 운영체제를 쓰는 환경이 여러 개의 운영체제가 각각의 가상머신 안에서 고립된 채 같은 컴퓨터에서 존재할 수 있다. 가상머신은 실제의 컴퓨터가 제공하는 것과 다른 형태의 명령어 집합 구조(ISA)를 제공한다. 다양한 운영체제를 제공하기 위해 멀티 부팅의 어려움을 겪지 않아도 되고, 각각은 독립되어 있기 때문에 서로에게 영향을 미치지 않는다. 이는 관리가 용이하고, 외부의 위험으로부터 분리된 환경으로 다양한 테스트 환경에 적합하다는 것을 의미한다. 자신만의 운영체제를 실행하는 여러 개의 가상머신들을 게스트 운영체제라고 하며, 다른 장치가 충돌을 피하기 위해 각 장치에서 실행하기 위한 서버 통합에 사용되고, 각 가상머신은 같은 컴퓨터에서 사용된다. 이것을 제품 품질의 고립(QoS 고립)이라 한다. 다른 게스트 운영체제를 지원하기 위해 가상머신을 사용하는 것은 임베디드 시스템에서 인기를 끌고 있다.[3]
프로세스 가상머신[편집]
프로세스 가상머신(process virtual machine)은 플랫폼에 독립적인 프로그램 실행 환경과 추상화를 제공하여 하나의 단일 프로그램(프로세스)을 실행하도록 설계되었다. 운영체제 안에서 일반 응용 프로그램을 구동하고 단일 프로세스를 지원한다. 프로세스가 시작하고, 끝내게 되어 파괴될 때 만들어진다. 목적은 어떤 플랫폼에서나 동일한 방식으로 실행되는 프로그램을 허용하고, 자바와 같이 독립적인 환경에서 컴퓨터 프로그램을 실행하기 위해 고안하는 것이다. 특별한 경우, 가상머신 프로세스는 잠재적으로 균일하지 못한 컴퓨터 클러스터의 통신 구조를 넘어 추출하는 시스템으로 사용된다. 이러한 가상머신은 단일 프로세스로 이루어져 있지 않지만, 클러스터에서 물리 컴퓨터마다 하나의 프로세스를 이룬다. 이것들은 병렬 응용 프로그램들을 프로그래밍하는 작업을 쉽게 하기 위해서 만들어져있다. 이로써 프로그램이 운영체제와 상호작용이 제공하는 통신 구조보다 알고리즘에 집중할 수 있다. 이것들은 통신이 일어난다는 사실을 숨기지 않고, 단일 병렬 컴퓨터로 클러스터를 제공하지 않는다. 다른 가상머신들과는 달리, 이런 시스템들은 특정한 프로그래밍 언어를 제공하지는 않지만, 기존의 언어에 통합되어 있어, 병렬 가상머신(Parallel Virtual Machine, PVM)이나 메시지 전달 인터페이스(Message Passing Interface, MPI)와 같은 여러 가지 언어를 위한 꾸러미들을 제공해야 한다. 원래 개발 목적은 중간 언어를 위한 추상 플랫폼으로, 1966년 BCPL 컴파일러의 프론트엔드에서 발생한 목적 코드를 실행하기 위한 O-code머신을 예로 들 수 있다. 스몰토크-80, Deutsch/Schiffmann의 구현으로 상당한 진보를 이루었고, 프로세스 가상머신을 사용하는 구현 접근으로서 JIT 컴파일을 가속화시켰다. 현대의 가상머신은 컴파일을 위한 중간 대상으로서나 인터프리터에서 직접 구현할 플랫폼으로써 사용되는데, 그 예로 2013년에 공개된 안드로이드 런타임(ART)은 바이트코드를 네이티브 코드로 컴파일하며, 초기의 달빅 가상머신은 바이트코드를 해석한다.
하이퍼바이저[편집]
가상머신은 컴퓨팅 환경을 소프트웨어적으로 구현한 것을 말하는데, 보통 하드웨어를 가상화하면 그 하드웨어 위에서 다수의 가상머신들이 생성되어 각각 독립적인 운영체제 환경을 구동한다. 시스템 내의 가상머신들은 실제 가상화하기 전과 같은 수준의 실행 기능을 제공하는 것을 목적으로 하고, 가상머신들 간의 하드웨어를 공유하게 된다. 가상머신은 내부구조가 물리적인 서버의 컴퓨팅 환경과 매우 유사하다. 실제 서버처럼 CPU, 메모리, 저장소와 같은 하드웨어 자원을 활용하고, 내부에 운영체제를 구동시킬 수 있으며, 각종 응용프로그램을 구동 및 관장한다. 물리적인 서버와의 차이점은 여러 개의 가상머신이 동시에 존재할 수 있고, 각 가상머신마다 서로 다른 구동 환경을 갖출 수 있어서 다양한 어플리케이션을 수행하는 것이 가능하다는 점이다. 가상머신들은 각 머신별로 가상화된 컴퓨팅 리소스를 할당 받거나 접근(Access)한다. 가상머신은 여러 하드웨어 자원에 접근할 수 있지만 가상머신의 관점에서는 접근하는 하드웨어 디바이스가 가상이라는 것을 알지 못하며, 표준 디바이스를 다루는 것처럼 인식한다. 단, 앞서 살펴본 반가상화의 경우에는 가상머신에 탑재되어 있는 게스트OS가 하드웨어가 가상화되었다는 것을 인지하고 하이퍼바이저를 통해 디바이스에 접근한다. 가상머신을 만드는 목적은 여러 가지가 있을 수 있는데, 하나의 하드웨어위에 동시에 여러 종류의 운영체제나 프로토콜을 실행할 때, 하나의 하드웨어 자원을 여러 사용자에게 나누어 줄 때, 가상화를 통해 분할된 시스템 간 상호 간섭이 없는 독립성(Isolation)을 보장하고자 할 때 등이 있다. 하드웨어를 가상화하기 위해서는 하드웨어들을 관장할 뿐만 아니라 각각의 가상머신들을 관리할 가상머신모니터(VMM)와 같은 중간관리자가 필요하다. 이 중간관리자를 하이퍼바이저(Hyperviser)라고 하며, VM이 동작할 수 있는 환경을 제공 한다. 하이퍼바이저는 하드웨어의 물리적인 리소스를 VM들에게 제공하고, VM과 하드웨어간의 I/O 명령을 처리한다. 하이퍼바이저에 요구되는 사항은 정확성, 독립성, 성능 세 가지가 있는데, 이중 앞 두 가지는 상대적으로 만족하기 쉬우나 성능 문제는 하드웨어 자원을 공유하는 관계로 만족시키기가 어렵다. 위치 및 역할 차이에 따라 하이퍼바이저는 두 가지로 구분된다. 먼저 베어메탈(Bare-metal) 기반으로 하드웨어 위에서 바로 구동되며, 하이퍼바이저가 다수의 VM들을 관장하는 형태이다. 하이퍼바이저형으로도 잘 알려져 있다. 이 타입은 가상머신에 설치된 게스트 운영체제(Guest OS)가 하드웨어 위에서 2번째 수준으로 구동된다. 호스트형 하이퍼바이저보다는 더 향상된 성능을 제공하지만, 여러 하드웨어 드라이버를 세팅해줘야 하며 설치가 어렵다. 두 번째는 호스트 하이퍼바이저로, 하드웨어 위에 호스트 운영체제(Host OS)가 있고, 그 위에서 하이퍼바이저가 다른 응용프로그램과 유사한 형태로 동작한다. 이 타입의 하이퍼바이저에 의해서 관장되는 가상머신의 게스트OS는 하드웨어 위에서 3번째 수준으로 구동된다. 기존의 컴퓨터 환경에서 하이퍼바이저를 활용하는 것이기에 설치가 용이하고 구성이 편리한 장점이 있다. 반면, 베어메탈 하이퍼바이저보다는 성능이 떨어질 수 있다.[4]
베어메탈[편집]
베어메탈(bare-metal)은 네이티브(native) 가상화라고도 한다. 하이퍼바이저가 하드웨어 바로 위에서 실행되는 방식으로, 하드웨어를 직접 제어하기 때문에 자원을 효율적으로 사용할 수 있다. 호스트 운영체제에 의존하지 않기 때문에, 입출력 디바이스와 직접 통신해야 하고, 가상머신 간에 입출력 디바이스가 공유되기 위해서는 하이퍼바이저 소프트웨어가 저 레벨의 드라이버를 보유해야 한다. 또한 게스트 가상머신을 위해 공유되는 디바이스를 반드시 에뮬레이션 할 수 있어야 한다. 베어메탈 가상화 아키텍처에서 가상머신 간에 공유되는 시스템 입출력 디바이스는 반드시 하이퍼바이저의 커널 드라이버에 접근해야 한다. 베어메탈 하이퍼바이저가 입출력 디바이스에 접근할 수 있는 또 다른 방법은 파티셔닝으로, 개별 디바이스를 특정 가상머신에 배정하는 방법이다. 입출력 성능과 엔지니어링에 대한 지원을 대폭 향상할 수 있고, 파티션된 입출력 디바이스는 네이티브 드라이버를 사용하여 가상머신으로부터 직접 접근이 가능하기 때문에 하이퍼바이저에 의한 간섭이 적어진다. 호스트 운영체제에 의존하지 않기 때문에 오버헤드가 적어 인터럽트 지연을 막고 결정성 있는 성능을 가능하게 하는 기능을 구현할 수 있고, 동일한 하드웨어에서 리얼 타임 및 범용 운영체제를 구현할 수 있다는 장점이 있다. 다만 가상머신간에 공유되는 디바이스용 드라이버뿐만 아니라, 다양한 하드웨어 플랫폼을 지원하기 위한 모든 드라이버가 하이퍼 바이저에 반드시 포함되어 있어야 하고, 호스트형 솔루션보다 설치나 구성이 어렵다는 단점이 있다.[5] 젠(Xen), 마이크로소프트, 하이퍼-V, KVM등이 대표적이다. 하드웨어와 인터랙션 하는 방식에 따라 전가상화(Full Virtualization), 반가상화(Para Virtualization) 이렇게 두 가지로 세분화 할 수 있다. 전가상화란 게스트 운영체제를 호스트 시스템과 완전히 분리하여 실행하고, 하드웨어 자원을 요청하기 위해, 반드시 하이퍼바이저가 중재해야 한다. 각 운영체제는 관리 머신을 거쳐 하이퍼바이저와 통신하기 때문에, 중앙 처리 장치와 램처럼 입출력이 잦은 자원은 컨트롤하기 어렵다고 번거롭다는 단점이 있다. 이러한 단점을 개선하기 위해서 출현한 것이 반가상화다. 반가상화는 게스트 운영체제의 일부를 수정하여 하드워어가 자원을 직접적으로 요구할 수 있도록 하는 것이다. 반가상화 방식을 하드웨어를 완전히 가상화하지 않고, 게스트 운영체제의 커널을 일부 수정하여 하드웨어와 인터랙션 할 수 있도록 해야 한다. 운영체제를 수정해야 하기 때문에, 게스트 운영체제가 윈도우일 경우 별도의 도구을 이용해야 한다는 번거로움이 있다. 대표적인 반가상화방식 소프트웨어인 젠에서 게스트 운영체제는 하이퍼콜(Hyper Call)이라는 명령어를 통해 하드웨어에 필요한 자원을 바로 하이퍼바이저에 전달하고, 하이퍼바이저는 바로 하드웨어를 제어한다. 각각의 운영체제가 한꺼번에 처리하여 하드웨어를 제어하는 전가상화 방식에 비해 성능이 좋다.
호스트형[편집]
호스트형 하이퍼바이저는 일반적인 소프트웨어처럼 호스트 운영체제 위에서 실행된다. 하드웨어 자원을 가상머신 내부 게스트의 게스트 운영체제에 에뮬레이트 하는 방식이기 때문에 베어 메탈 방식에 비해 오버헤드가 크지만, 게스트 운영 종류에 대한 제약이 없고, 데스크톱뿐 아니라, 노트북에서도 운영할 수 있다. 기본 운영체제가 먼저 설치되고, 그 위에 하이퍼바이저 소프트웨어가 호스트 운영체제 위에 설치되면, 호스트 운영체제 위에서 다양한 게스트 운영체제를 실행할 수 있다. 대표적으로 VM웨어 서버, VM웨어 워크스테이션, 가상박스, 패러렐즈 데스크탑이 있다. 하이퍼바이저에 의해 구동되는 가상머신은 각 가상머신 별로 독립된 가상의 자원을 할당받는다. 가상머신은 논리적으로 분리되어 있어서 한 가상머신에 오류가 발생해도, 다른 가상머신으로 확산되지 않는다는 장점이 있다.[6] 또한 설치와 구성이 편리하고, 호스트 운영체제가 저 레벨 하드웨어와 통신하기 위한 드라이버를 제공하기 때문에 사용자 정의 없이 광범위한 PC에서 실행 가능하다. 호스트형 가상화는 일반적으로 제한된 입출력 디바이스 서브셋으로만 접근이 가능하다. 호스트 운영체제는 컴퓨터에 연결된 물리적인 입출력에 대한 소유권이 있고, 가상화 머신 모니터는 각 가상머신에 실제 하드웨어의 에뮬레이션 된 보기를 제공한다. 가상화 머신 모니터는 PCI(Peripheral Component Interconnect ) 데이터 수집 카드와 같은 대부분의 비일반 입출력 디바이스에 대한 지식이 없기 때문에, 에뮬레이션된 디바이스를 가상머신에 제공하지 않고, 네트워크 인터페이스와 씨디롬(Compact Disc Read Only Memory, CD-ROM)드라이버 같은 일반 디바이스만 에뮬레이션 된다. 호스트형 가상화 솔루션은 USB 포트를 위한 PCI 통과 기능도 제공한다. 이 기능을 통해 사용자들은 게스트 운영체제에서 USB 데이터 수집 디바이스에 접근하여 데이터를 수집하는 등 개별 가상머신에서 USB 드라이버에 직접 접근할 수 있다. 여러 소프트웨어 컴포넌트가 함께 작동하여 호스트형 가상화 아키텍처에서 입출력이 가능하도록 한다. 이때 알아야 할 것은 궁극적으로 입출력 요청은 호스트형 가상화 아키텍처의 호스트 운영체제를 통해 전달된다는 것이다.[5]
가상화 기법[편집]
개별 가상머신은 컴퓨터 하드웨어와 분리하기 위해 가상화 머신 모니터가 사용할 수 있는 여러 가지 내부 기술을 사용한다. 지금까지 본 가상화 아키텍처는 2진 전환, 하드웨어 보조, 파라버추얼라이제이션(Paravirtualization) 이 3가지 중 적어도 한 가지를 사용한다. 2진 전환을 사용하는 하이퍼바이저는 시스템 상태에 끼치는 영향을 피하기 위해 실행되는 코드를 동적을 변경한다. 버추얼머신의 컴파일된 코드에 특권 명령을 포함하게 되면 기본 하이퍼바이저는 2진 전환을 사용하여 입출력 요청을 적절하게 방향을 전환하고 개별 가상머신 간 충돌을 방지한다. 호스트형 가상화 소프트웨어는 일반적으로 2진 전환을 사용하여 입출력 방향을 전환하고 개별 가상머신 간의 충돌을 방지한다. 호스트형 가상화 소프트웨어는 일반적으로 2진 전환을 사용하는데 대표적인 예로 VM웨어 워크스테이션 제품을 들 수 있다. 코드가 전환될 때마다 성능이 저하되므로, 2진 전환을 사용하는 가상화 소프트웨어는 그때마다 지시 모음을 검사하고 전환한다. 2진 전환을 사용하는 소프트웨어는 가상화 머신 모니터가 버추얼 머신 실행과 반드시 인터페이스 해야 하는 시간을 최소화하여 사용자가 경험하는 성능 영향을 최소화할 수 있다. 하드웨어 보조 방식은 실행되는 도안 가상머신 코드를 변경하는 대신, 특권 명령에 대한 시스템 상태 변경을 피하기 위해 특수 프로세서 기술을 사용한다. 인텔(Intel)과 어드밴스드 마이크로 디바이시스(Advanced Micro Devices, AMD) 모두 필요할 때마다 가상화 머신 모니터를 자동 호출하기 위해 각 프로세서에 새로운 가상화 기능을 적용하고 있다. 많은 베어 메탈 하이퍼바이저가 이 기술을 활용한다. 2진 전환의 경우에서와 같이 성능은 하이퍼바이저가 버추얼 머신의 실행을 간섭해야 할 때마다 저하된다. 이 같은 효과를 최소화하기 위해 가상화를 위한 하드웨어 기능을 통합하는 프로세서는 절대적으로 필요할 때에만 가상머신 실행을 간섭하도록 구성된다. 예를 들어, 특정 입출력 디바이스가 파티셔닝되면, 그 후에는 하이퍼바이저의 간섭없이 배정된 가상머신이 접근 가능할 것이다. 가상화를 수행하기 위한 마지막 기법은 파라버추얼라이제이션으로, 운영체제를 명시적으로 변경함으로써 가상화되고 있음을 인식하도록 하고, 가상화 머신 모니터가 필요할 때 자동 호출하도록 한다. 이와 같은 호출을 하이퍼콜이라고도 한다. 파라버추얼라이제이션이 가상화 머신 모니터가 반드시 호출되어야 하는 횟수를 최소화함으로써 성능을 대폭 향상할 수 있지만, 변경이 이루어지도록 하기 위해 운영 코드의 소스 코드로의 접근을 확보하였다.[7]
활용[편집]
가상머신은 자바 등 다양한 프로그래밍 언어와 블록체인 기반의 암호화폐 플랫폼에서 활용되고 있다.
- 윈도우 가상머신(Windows Virtual Machine) : 대부분의 하이퍼바이저는 윈도우 운영체제를 게스트로 실행하는 가상머신을 제공한다. 마이크로소프트의 하이퍼-V 하이퍼바이저는 윈도우 운영체제의 일부로서 제공된다. 설치할 때 자신과 기본 윈도우 운영체제를 모두 포함하는 상위 파티션을 작성하며, 이들 각각은 하드웨어에 대한 액세스 권한을 부여받는다. 윈도우 게스트를 포함한 다른 운영 체제는 상위 파티션을 통해 하드웨어와 통신하는 하위 파티션에서 실행된다.
- 안드로이드 가상머신(Android Virtual Mahine) : 구글의 오픈소스 안드로이드는 모바일 디바이스에서 공통이며, 홈 엔터테인먼트 디바이스 등의 홈 디바이스에 연결된다. 안드로이드는 이러한 디바이스에 공통인 ARM(Advanced Risk MAchine) 프로세서 아키텍처에서만 실행되지만, 안드로이드 게이머나 소프트웨어 개발자 등이 이를 PC에서 실행하고자 할 수도 있다. 이 경우 전혀 다른 x86 프로세서 아키텍처에서 실행되는 PC와 하드웨어 가상화 하이퍼바이저가 가상머신 및 중앙처리 장치 간의 명령어만 전달하기 때문에 문제가 생긴다. 다양한 명령어 집합을 보유한 프로세서에 대해서는 변환하는 기능을 제공하지 않기 때문에 이 문제를 해결하려면 다음과 같은 방법을 사용해야 한다. 샤실리크(shashlik) 또는 지니모션(Genymotion) 등의 일부 프로그램 소프트웨어에서는 ARM 아키텍처를 재작성하는 에뮬레이터를 사용한다. 또는 안박스(Anbox_를 사용하여 리눅스 운영체제의 커널에서 안드로이드 운영 체제를 실행하는 방법도 있다.
- 자바 가상머신 : 자바 플랫폼은 자바 소프트웨어 개발 언어로 작성된 프로그램의 실행 환경이다. 자바는 한 번만 작성하고 어디서나 실행하는 기능을 제공하는데, 이는 자바 플랫폼을 실행하는 모든 하드웨어에서 모든 자바 프로그램이 실행될 수 있다는 의미다. 이 기능을 제공하기 위해 자바 플랫폼에는 자바 가상머신이 포함되어 있다. 자바 프로그램에는 바이트 코드가 포함되며, 이는 자바 가상머신용으로 작성된 명령어다. 자바 가상머신은 이 바이트 코드를 호스트 컴퓨터에서 사용하는 최하위 레벨 언어인 머신 코드로 컴파일한다. 하나의 컴퓨팅 플랫폼의 자바 플랫폼에 있는 자바 가상머신은 프로세서가 예상하는 머신 코드에 기반으로 하여 다른 머신 코드 명령어 세트를 기타의 자바 가상머신에 작성한다. 따라서 자바 가상머신은 전체 운영체제를 실행하지 않고, 다른 자바 가상머신에서 사용하듯이 하이퍼바이저를 사용하지 않지만, 대신 이는 특정 하드웨어에서 실행할 애플리케이션 레벨 소프트웨어 프로그램을 변환한다.
- 우분투 가상머신(Ubuntu Vitrual Machine): 우분투는 캐노니컬(Canonical)에서 제작한 리눅스 배포판으로, 데스크탑과 서버 버전에서 사용 가능하며, 가상머신으로 설치할 수 있다. 우분투를 마이크로소프트 하이퍼-V에서 게스트 운영체제로 배치할 수도 있다. 우분투는 하이퍼-V의 상향된 세션 모드에서 잘 작동하는 우분투 데스크탑의 최적화된 버전을 제공하고, 윈도우 호스트와 우분투 가상머신 간의 긴밀한 통합을 제공한다. 여기에는 클립 보드 통합, 동적 데스크탑 크기 조정, 공유 폴더 및 호스트와 게스트 데스크탑 간의 마우스 이동에 대한 지원이 포함된다.[8]
- 이더리움 가상머신(Ethereum Virtual Machine, EVM): 이더리움 가상머신은 스마트 콘트랙트 배포 및 실행을 처리하는 이더리움의 일부다. 하나의 외부 소유 계정(External Owned Account)에서 다른 외부 소유 계정으로 간단한 값을 전송하는 트랜잭션은 이더리움 가상머신이 필요 없지만, 그 외 모든 것은 이더리움 가상머신에 의한 상태 업데이트를 수반한다. 크게 보면 이더리움 블록체인에서 실행되는 이더리움 가상머신은 자체 영구 데이터 저장소가 있는 수백만 개의 실행 가능 객체를 가진 전 세계에서 탈중앙화된 컴퓨터다. 스마트 콘트랙트 실행에 사용할 수 있는 가스양에 따라 모든 실행 프로세스가 유한개의 계산 단계로 제한된다는 것을 의미한다. 이더리움 가상머신은 메모리 내의 모든 값을 스택에 저장하는 스택 기반 아키텍처로 256비트의 단어 크기로 동작하며, 주소 지정이 가능한 여러 개의 데이터 구성 요소를 가지고 있다. 실행할 스마트 콘트랙트의 바이트 코드가 저장되는 불변 프로그램 코드 롬, 모든 위치가 0으로 초기화하는 파괴성 메모리, 이더리움 상태의 일부인 영구 저장소가 이에 해당한다. 이더리움 가상머신의 명령어 집합에는 산술 및 비트 논리 연산, 실행 콘트랙트 세트 조회, 스택, 메모리, 스토리지 접근, 흐름 제어 작업, 로깅, 호출, 기타연산자 등이 있다.[9]
프로그램[편집]
가상머신 응용 소프트웨어[편집]
- 공통 언어 런타임(Common Language Runtime, CLR) : 마이크로소프트 이니셔티브에서 제공하는 가상머신의 구성요소로 프로그램 코드를 위한 실행 환경을 정의하는 마이크로소프트의 공통 언어 기반(CLI) 표준의 기능이다. C#이나 VB 닷넷과 같은 언어로 프로그래밍하며, 해당 언어의 컴파일러가 소스 코드를 공통 중간 언어(IL) 코드로 변환한다. CLR은 관리되는 코드를 실행하기 위한 런타임으로, 관리되는 언어로 작성한 소스 코드를 컴파일하면 관리되는 코드가 생성된다. 관리되는 코드를 실행 파일 또는 라이브러리(.dll) 형태로 만들고 그것을 형식 정보, 즉 메타 자료와 함께 하나의 패키지로 묶은 것을 어셈블리라고 한다. 어셈블리를 적재할 때 CLR은 IL 코드를 해당 컴퓨터 고유의 기계어 코드로 변환한다. 이러한 변환을 담당하는 것이 CLR의 JIT(Just – in – time)컴파일러이다. 어셈블리는 원래의 원본 언어의 구성을 거의 그대로 유지하기 때문에, 코드를 조사하기 쉽고 심지어 동적으로 생성하기도 쉽다.[10]
- 병렬 가상머신(Parallel Virtual Machine) : 1989년 오크리지 국립연구소의 알 가이스트(Al Geist)에 의해 처음 생성되었고, 이 작업을 바탕으로 이 프로젝트는 꾸준히 확장되고, 성장해왔다. 병렬 가상머신 시스템에는 개별 머신에 있는 애플리케이션과 인터페이스루틴 라이브러리 두 부분이 있다. 소프트웨어 응용 프로그램을 병렬 가상 시스템 데몬, pmvd3 또는 pmvd라고 한다. 이 작은 프로그램은 병렬 가상머신 애플리케이션을 실행해야 할 때까지 수동적으로 배치된다. 사용가가 이 유형의 프로그램을 실행하려면, 먼저 병렬 가상머신을 시작해야 한다. 이를 통해 다른 호스트의 소프트웨어에 액세스 할 수 있다. 병렬 가상머신 루틴 라이브러리에는 별도의 호스트에서 실행되는 다양한 작업을 조정하는 데 필요한 모든 코드의 전체 목록이 있다. 이 라이브러리에는 메시지 전달, 작업 조정 및 가상머신 자체의 변경에 대한 표준 루틴이 포함되어 있다. 병렬 가상머신의 핵심 개념은 모든 애플리케이션에 독립적으로 실행할 수 있는 여러 태스크가 있다는 것이다. 병렬 가상머신에서는 기능적 병렬 처리와 데이터 병렬 처리 두 가지 방식으로 병렬 처리를 할 수 있다. 기능적 병렬 처리는 애플리케이션을 명확하게 정의된 독립적인 작업으로 분리하는 것으로, 별도의 호스트 시스템에서 수행한다. 병렬 가상머신은 입력, 솔루션, 출력 및 디스플레이와 같은 기능을 기반으로 조정하는 데 사용된다. 이 방식보다는 데이터 병렬 처리 또는 단일 프로그램 다중 데이터(SMPD)가 더 널리 사용되곤 한다. 이 방법에서는 모든 작업이 동일하지만, 각 호스트는 더 큰 퍼즐의 작은 조각을 해결한다는 차이점이 있다. 병렬 가상머신 환경은 두 가지 방법을 모두 지원하므로, 필요에 따라 두 가지 방법을 혼합해서 사용하는 것이 가장 효과적이다. C, C++ 및 Fortan 등의 프로그래밍 언어가 사용된다.[11]
하드웨어 가상머신[편집]
- 마이크로소프트 버추얼 PC(Microsoft Virtual PC) : 마이크로소프트 윈도우 운영 체제용 가상화 제품군으로, 윈도우 가상 PC라고도 한다. 원래 코네틱스(Connectix)사가 만들었지만, 나중에 마이크로소프트에 인수되었다. 버추얼 PC는 표준 PC와 그에 따른 하드웨어를 가상으로 구현한다. 그러므로 개인용 컴퓨터에서 사용할 수 있는 거의 모든 운영체제를 실행하는데 사용할 수 있다. 그러나 버추얼 PC의 개발에 목표를 두지 않은 알려져 있지 않은 운영체제를 설치하려고 하면 문제가 발생할 수도 있다. 마이크로소프트는 이 제품을 Hyper-V로 대체하였다.[12]
- 버추얼박스(Virtualbox) : 본래 이노테크(InnoTek)가 개발한 뒤, 현재는 오라클(Oracle)이 개발 중인 상용, 사유 소프트웨어로 [리눅스]], 맥 운영체제, 솔라리스, 윈도우를 게스트 운영체제로 가상화하는 x86 가상화 소프트웨어이다. 개발된 지 몇 해가 지나, 제한된 오픈소스 버전으로 버추얼박스 OSE가 2007년 1월에 공개되었다. 다른 상용 가상화 소프트웨어들에 비하면 기능이 부족한 편이지만, 원격 데스크톨 프로토콜(RDP), iSCSI 지원, 원격 데스크톱 프로토콜을 거치는 원격 장치의 USB 지원 등 원격으로 가상 컴퓨터를 제어하는 등 특별한 기능을 지원한다. 버추얼 박스는 인텔의 하드웨어 가상화 VT-x와 어드밴스드 마이크로 디바이시스의 AMD-V를 지원한다. 버추얼 박스를 사용하게 되면 하드 디스크는 가상 디스크 이미지(Virtual Disk Image, VDI)라는 컨테이너 포맷으로 에뮬레이트 된다. 현재 다른 가상화 프로그램에서 쓰이는 포맷과 호환되지는 않지만, VM웨어 가상머신의 디스크 형식의 이미지 파일을 읽고 쓸 수 있고, 마이크로소프트 가상 PC의 디스크 이미지 또한 동일하게 지원하고 있다. 게스트 코드를 되도록 네이티브로 수행한다. 버추얼박스 소프트웨어는 클로즈드 소스 버전과 오픈 소스 버전 두 가지가 있다. 완전한 버추얼박스 패키지는 사유 소프트웨어 라이선스를 가지며, 개인이나 교육, 제품 평가용으로는 아무런 대가 없이 소프트웨어를 이용할 수 있다. 상업적인 용도의 경우, 썬마이크로시스템즈에서 프로그램을 따로 구매해야 했지만, 버전 4 이후로는 코어 패키지가 프리웨어로 배포되었다. 앞에서 언급한 OSE가 버추얼박스 오픈 소스 에디션이라고 불리는 오픈 소스 버전인데, 내장된 원격 데스크톱 프로토콜 서버, USB 지원, 가상 하드디스크의 iSCSI 지원 등을 제외한 나머지 기능을 제공하고 있다.[13]
비교[편집]
컨테이너[편집]
컨테이너화를 이끄는 두 가지 주도적인 힘은 컨테이너 가동에 널리 사용되는 툴인 도커, 그리고 여러 컨테이너를 관리하는 데 도움이 되는 구글 쿠버네티스다. 컨테이너는 호스트 OS의 커널을 공유하는 독립적인 코드 실행 환경이다. 컨테이너는 중복 게스트 운영체제 및 관련 시작 오버헤드를 건너뛰므로 가상머신에 비해 더 능률적이고 가볍다. 개발자는 동일한 하드웨어에서 가상머신에 비해 6~8배 더 많은 컨테이너를 실행할 수 있다. 컨테이너에도 단점은 있다. 비교적 새로운 접근 방법이므로 성숙한 기술에서 흔히 볼 수 있는 풍부한 관리 툴이 없고 따라서 설정과 유지보수 작업이 많이 필요하다. 또한 보안에 대한 우려도 있다. 가상머신에서는 게스트 이미지를 사용해서 호스트에서 호스트로 손쉽게 워크로드를 옮길 수 있지만 베어 메탈은 업그레이드와 이동이 더 어렵다. 베어 메탈 서버에서는 머신 상태 롤백이 쉽지 않은 일이다.
서버리스 컴퓨팅[편집]
전통적인 IaaS 클라우드 환경에서 고객은 먼저 가상머신, 스토리지, 데이터베이스, 관련 보안 및 관리 툴을 프로비저닝한 다음 가상머신에 애플리케이션을 로드한다. 서버리스 컴퓨팅에서는 개발자가 코드를 쓰고 클라우드 서비스 제공업체가 나머지 모든 부분을 처리한다. 개발자는 서버, 운영체제, 프로비저닝 또는 관리에 대해 생각할 필요가 없다. 물론 코드를 실행하는 실제 서버가 있지만, 이는 클라우드 서비스 제공업체의 책임이다. 모놀리식 애플리케이션 대신 코드는 구체적인 함수로 세분화된다. 그 함수를 트리거하는 이벤트가 발생하면 서버리스 서비스(아마존 람다(Lambda) 등)가 함수를 실행한다. 서버리스 제공업체는 함수별로 고객에게 비용을 청구한다. 마이크로서비스/컨테이너 시나리오와 마찬가지로, 서버리스 컴퓨팅은 가상머신 계층을 건너뛰며 함수는 베어 메탈에서 실행된다. 현재 시점에서 서버리스 컴퓨팅은 비교적 미성숙한 기술이며 사용 사례도 제한적이다.[14]
각주[편집]
- ↑ 1.0 1.1 1.2 Namu(南無), 〈가상 머신이란 무엇인가, 그 장점이 무엇이길래?〉, 《시사공작소》, 2013-01-18
- ↑ Licoln Spector. 〈단점을 중심으로 본 ‘가상 컴퓨터’에 대한 오해와 진실〉, 《아이티월드》, 2013-10-11
- ↑ 흉내쟁이. 〈가상머신(Virtual Machine)의 이해〉, 《티스토리》
- ↑ 안성원, 〈클라우드 가상화 기술의 변화 - 컨테이너 기반의 클라우드 가상화와 DevOps Changes in Cloud Virtualization Technology - Container-based cloud virtualization and DevOps〉, 《소프트웨어정책연구소》, 2018-12-10
- ↑ 5.0 5.1 덕쑤, 〈가상화(Virtualization)의 내부기술〉, 《티스토리》, 2013-01-18
- ↑ 〈서버 가상화 기술의 진화:VM과 컨테이너〉, 《가비아 라이브러리》
- ↑ shineLight〈가상화(Virtualization)〉, 《블로거》, 2016-08-31
- ↑ 〈가상 머신(VM)〉, 《IBM》
- ↑ HAS3ONG, 〈(Ethereum) EVM, 이더리움 가상 머신 –1-〉, 《티스토리》, 2019-06-22
- ↑ HJH0825, 〈C# CLR(Common Language Runtime)이란?]〉, 《티스토리》, 2020-02-04
- ↑ 〈병렬 가상 머신이란 무엇입니까?〉, 《Netinbag》
- ↑ 〈윈도우 가상 PC〉, 《위키백과》
- ↑ 〈버추얼 박스〉, 《위키백과》
- ↑ Neal Weinberg , 〈서버 가상화의 미래 : 컨테이너 및 서버리스 비교 진단〉, 《아이티월드》, 2018-07-13
참고자료[편집]
- Namu(南無), 〈가상 머신이란 무엇인가, 그 장점이 무엇이길래?〉, 《시사공작소》, 2013-01-18
- Licoln Spector. 〈단점을 중심으로 본 ‘가상 컴퓨터’에 대한 오해와 진실〉, 《아이티월드》, 2013-10-11
- 흉내쟁이. 〈가상머신(Virtual Machine)의 이해〉, 《티스토리》
- 〈가상 머신〉, 《위키백과》
- 덕쑤, 〈가상화(Virtualization)의 내부기술〉, 《티스토리》, 2013-01-18
- 〈서버 가상화 기술의 진화:VM과 컨테이너〉, 《가비아 라이브러리》
- shineLight〈가상화(Virtualization)〉, 《블로거》, 2016-08-31
- 〈가상 머신(VM)〉, 《IBM》
- HAS3ONG, 〈(Ethereum) EVM, 이더리움 가상 머신 –1-〉, 《티스토리》, 2019-06-22
- HJH0825, 〈C#) CLR(Common Language Runtime)이란?〉, 《티스토리》, 2020-02-04
- 〈병렬 가상 머신이란 무엇입니까?〉, 《Netinbag》
- 〈윈도우 가상 PC〉, 《위키백과》
- 〈버추얼 박스〉, 《위키백과》
- Neal Weinberg , 〈서버 가상화의 미래 : 컨테이너 및 서버리스 비교 진단〉, 《아이티월드》, 2018-07-13
같이 보기[편집]
|