사전 가상화
개념

가상화

gabury1고친 사람 github-actions[bot]

가상화는 기계 한 벌을 여러 벌인 것처럼 갈라 씁니다. 몫을 받은 쪽은 그것을 기계 전체로 알고 그 위에 운영체제와 프로그램을 올립니다. 몫을 갈라 주고 서로를 못 보게 가리는 일은 아래에 깔린 소프트웨어가 대신 합니다.

쉽고 빠른 이해
  • 무슨 일을 하나 — 기계 한 대를 여러 대처럼 갈라 씁니다. 서버 한 대 안에 서로 다른 운영체제가 도는 기계 넷을 만들어 두는 것이 그 일입니다.
  • 왜 있나 — 프로그램을 한 기계에 몰아넣으면 서로의 설정과 몫을 건드립니다. 그렇다고 프로그램마다 기계를 따로 두면 대부분의 시간 동안 놀고 있는 기계에 돈을 냅니다.
  • 어떻게 도나
    1. 가상화 계층이라 부르는 소프트웨어가 프로세서 시간·메모리·디스크를 몫으로 갈라 줍니다
    2. 몫을 받은 쪽이 하드웨어를 직접 만지려 들면 그 명령을 가로채 대신 처리합니다
    3. 옆 몫의 메모리와 파일에는 닿지 못하게 막습니다
  • 대가 — 가로채고 대신 처리하는 만큼 손해를 봅니다. 가상화 계층 자체가 새로 관리할 물건이 되고, 그 계층에 구멍이 나면 한 몫에서 옆 몫까지 넘어갑니다.

상세

한 채를 여러 세대로 나눈 건물을 떠올리면 됩니다. 세대마다 현관문이 따로 있고 옆집 살림은 보이지 않습니다. 건물은 하나인데 사는 쪽은 각자 집 한 채를 쓰는 셈입니다. 어긋나는 대목이 하나 있습니다. 건물의 벽은 한 번 세우면 움직이지 않지만, 가상화가 나눈 몫은 돌아가는 중에도 늘리고 줄일 수 있습니다.

가상화(virtualization)는 진짜 하드웨어를 소프트웨어로 감싸서, 쓰는 쪽에 독립된 기계 한 벌로 보이게 하는 기술입니다. 웹 서버 하나와 데이터베이스 하나를 같은 서버에 두면서도 서로 다른 기계에 있는 것처럼 떼어 놓는 일이 그 예입니다.

이름을 셋만 미리 정해 둡니다. 감싸는 소프트웨어를 가상화 계층, 그 위에서 도는 쪽을 손님(guest), 아래에 깔린 진짜 기계를 호스트(host)라고 부르겠습니다. 이 셋은 아래 절 전체에서 같은 뜻으로 씁니다.

이 절은 여섯 가지를 봅니다. 가상화 계층이 하는 두 가지 일, 가짜 자원을 진짜처럼 보이게 만드는 방법, 어디를 자르느냐로 갈리는 두 갈래, 프로세서 밖에서 쓰는 같은 이름, 치르는 대가, 그리고 이 기술을 고르는 때와 피하는 때입니다.

몫을 나누는 일과 서로를 가리는 일

가상화 계층이 하는 일은 둘로 갈립니다. 하나는 나누기입니다. 프로세서 시간, 메모리 공간, 디스크 용량을 몫으로 쪼개서 손님마다 나눠 줍니다. 손님이 넷이면 같은 기계가 기계 넷처럼 보입니다.

다른 하나는 가리기입니다. 한 손님이 옆 손님의 메모리를 읽거나 파일을 열지 못하게 막습니다. 나누기만 있고 가리기가 없으면 기계를 쪼갠 뜻이 없습니다. 옆 손님의 데이터를 그냥 읽을 수 있다면 애초에 한 기계에 같이 둔 것과 다르지 않기 때문입니다.

flowchart TD
    G1["손님 · 운영체제 한 벌"]
    G2["손님 · 운영체제 한 벌"]
    G1 --> V["가상화 계층 · 나누고 가린다"]
    G2 --> V
    V --> H["호스트 · 진짜 하드웨어 한 벌"]

그림에서 손님 둘은 서로를 모릅니다. 각자 아래에 하드웨어가 곧바로 있다고 믿고, 그 믿음을 가상화 계층이 만들어 줍니다.

진짜 하드웨어처럼 보이게 만드는 방법

프로세서는 아무 명령이나 아무나 실행하게 두지 않습니다. 하드웨어를 직접 건드리는 명령은 특권 명령으로 따로 묶어 두고, 운영체제의 커널만 쓸 수 있게 합니다. 응용 프로그램이 그 명령을 쓰려 하면 프로세서가 막습니다.

가상화는 이 장치를 그대로 빌려 씁니다. 손님의 운영체제를 특권이 없는 등급으로 내려놓으면, 손님이 하드웨어를 만지려는 순간 프로세서가 그 명령을 막고 가상화 계층에 넘깁니다. 계층은 넘겨받은 명령을 대신 처리하고 결과만 돌려줍니다. 손님은 자기 명령이 그냥 먹혔다고 알고 계속 돕니다.

가로채서 대신 처리하는 이 방식을 트랩 앤드 에뮬레이트(trap-and-emulate)라고 부릅니다. 넘겨받는 횟수가 많을수록 손해가 커지기 때문에, 요즘 프로세서는 이 가로채기를 거들어 주는 전용 기능을 따로 갖고 있습니다.

없는 장치를 통째로 흉내 내는 방법도 있습니다. 명령 하나하나를 소프트웨어로 해석해 다른 명령으로 바꿔 주는 에뮬레이션입니다. 진짜 하드웨어가 아예 없어도 되는 대신, 명령마다 해석하는 비용을 냅니다.

어디를 자르느냐로 갈리는 두 갈래

가상화는 무엇까지 따로 떼어 주느냐로 크게 둘로 갈립니다. 커널까지 통째로 떼어 주는 쪽이 가상 머신이고, 커널은 같이 쓰면서 그 위만 갈라 주는 쪽이 컨테이너입니다.

가상 머신은 손님마다 운영체제 한 벌을 통째로 올립니다. 가상 하드웨어를 만들어 주는 소프트웨어를 하이퍼바이저라고 부릅니다. 손님의 운영체제가 무엇이든 상관없다는 것이 이 갈래의 성질입니다.

컨테이너는 호스트의 커널 하나를 여럿이 같이 씁니다. 대신 커널이 네임스페이스로 프로세스가 보는 이름을 갈라 주고, cgroup으로 쓸 수 있는 몫을 정해 줍니다. 커널을 같이 쓰므로 손님이 호스트와 다른 운영체제일 수는 없습니다.

가상 머신 컨테이너
따로 떼어 주는 것 커널을 포함한 운영체제 한 벌 프로세스가 보는 이름과 자원 몫
손님이 마주하는 것 가상 하드웨어 호스트 커널의 시스템 콜
가르는 쪽 하이퍼바이저 호스트 커널
띄울 때 하는 일 운영체제를 처음부터 올린다 프로세스를 하나 띄운다
flowchart TD
    subgraph VM["가상 머신 · 커널까지 따로"]
        A1["앱"] --> O1["손님 커널"] --> HV["하이퍼바이저"]
    end
    subgraph CT["컨테이너 · 커널은 같이"]
        A2["앱"] --> K["호스트 커널"]
        A3["앱"] --> K
    end

두 그림에서 가르는 선이 어디에 그어졌는지만 보면 됩니다. 선이 커널 아래에 있으면 가상 머신이고, 커널 위에 있으면 컨테이너입니다.

프로세서 밖에서 쓰는 같은 이름

지금까지 본 것은 기계를 나누는 가상화입니다. 같은 이름을 자원 종류마다 쓰기도 합니다. 뜻의 뿌리는 하나입니다. 진짜 물건과 쓰는 쪽 사이에 소프트웨어를 한 겹 끼워 넣어, 물건 여럿을 하나로 보이게 하거나 하나를 여럿으로 보이게 하는 것입니다.

저장 가상화는 디스크 여러 개를 묶어 커다란 저장 공간 하나로 보이게 합니다. 쓰는 쪽은 디스크가 몇 개인지, 어느 디스크에 내 파일이 있는지 모릅니다.

네트워크 가상화는 선 하나를 여러 개의 독립된 망처럼 갈라 씁니다. 같은 선을 지나가지만 서로 다른 망에 속한 기계끼리는 서로를 못 봅니다.

가상 메모리도 뿌리가 같습니다. 프로그램마다 자기만의 주소 공간을 통째로 가진 것처럼 보이게 하고, 그 주소를 진짜 메모리 주소로 바꿔 주는 쪽은 아래에 따로 있습니다. 다만 가상 메모리는 기계를 여럿으로 나누는 것이 아니라 주소를 바꿔 주는 것이라 갈래가 다릅니다.

가상화가 치르는 대가

첫째는 가로채기 비용입니다. 손님이 하드웨어를 만지려 할 때마다 가상화 계층이 끼어들어 대신 처리하므로, 하드웨어를 자주 건드리는 일일수록 손해가 커집니다.

둘째는 같은 일을 두 번 한다는 것입니다. 손님의 운영체제도 자기 안에서 프로세스에 프로세서 시간을 나눠 주고, 호스트도 손님들에게 프로세서 시간을 나눠 줍니다. 두 판단이 서로를 모르는 채로 겹칩니다.

셋째는 새로 생긴 공격 표면입니다. 가상화 계층은 모든 손님 아래에 깔려 있으므로, 여기에 구멍이 나면 손님 하나를 잡은 공격자가 옆 손님까지 넘봅니다. 갇힌 몫에서 아래로 빠져나가는 일을 컨테이너 탈출이라 부르고, 그 결과로 얻는 것이 호스트 등급의 권한 상승입니다.

넷째는 한곳에 몰린다는 것입니다. 기계 한 대에 손님 스무 벌을 올려 두면, 그 기계가 멈출 때 스무 벌이 함께 멈춥니다. 나눠 쓰는 대신 같이 넘어질 위험을 받아들이는 셈입니다.

고르는 때와 피하는 때

앞 소절까지가 가상화가 무엇을 해 주고 무엇을 뺏는지였습니다. 이 소절은 그 둘을 견주어 언제 쓰고 언제 안 쓰는지를 봅니다. 견주는 상대는 기계 한 대에 프로그램을 곧바로 올리는 방법입니다.

한 대가 가진 힘을 프로그램 하나가 다 못 쓸 때 가상화를 고릅니다. 남는 몫에 다른 손님을 올리면 기계 수가 줄고, 기계 값과 전기 값도 같이 줍니다. 프로그램마다 운영체제나 설정이 달라야 할 때도 같은 선택을 합니다.

반대로 손해가 이득보다 클 때는 피합니다. 손님 하나가 기계 한 대의 힘을 거의 다 쓰면 나눌 몫이 없어 가상화 계층만 더 얹는 셈이 됩니다. 디스크와 네트워크 카드를 쉬지 않고 만지는 일도 가로채기 비용을 계속 물기 때문에 손해가 눈에 띕니다.

두 갈래 중 무엇을 고르느냐는 따로 갈립니다. 손님이 호스트와 다른 운영체제를 써야 하거나 가리기를 두껍게 해야 하면 가상 머신을 고릅니다. 호스트와 같은 커널로 충분하고 띄우고 지우기를 자주 한다면 컨테이너를 고릅니다.

관련 항목

가상화가 갈라 나눠 주는 자원

CPU · 메모리 · 저장장치 · 네트워크 · 파일 시스템 · 디바이스 드라이버

가상화를 어디에서 자르느냐로 갈리는 갈래

가상 머신 · 컨테이너 · 에뮬레이션 · 전가상화 · 반가상화 · 하드웨어 지원 가상화

가상화를 실제로 해내는 소프트웨어

하이퍼바이저 · KVM · QEMU · Xen · VirtualBox · Docker · containerd · LXC

리눅스 커널이 가상화에 쓰는 장치

네임스페이스 · cgroup · chroot · 커널 · 시스템 콜 · 사용자 공간 · 프로세스

가상화를 밑바탕으로 삼는 기반

클라우드 컴퓨팅 · IaaS · 쿠버네티스 · 오케스트레이션 · 컨테이너 이미지 · 오토스케일링

가상화의 가리기가 뚫릴 때 생기는 위험

컨테이너 탈출 · 권한 상승 · 샌드박스 · 공격 표면 · 사이드 채널 공격 · 신뢰 경계

가상화와 이름이 겹치는 이웃 개념

가상 메모리 · 가상 주소 · 추상화 · 격리 · 다중화 · 가상 사용자

다른 이름: virtualization · 버추얼라이제이션 · 서버 가상화