목차8개 항목
출처와 참고
팔만코딩경(42Seoul 커뮤니티 위키)의 「웅성웅성.. 뭔 가상화 종류가 이렇게 많아….」, 「가상 머신(Virtual Machine, VM)이란?」, 「가상 머신(VM)과 컨테이너」, 「여러분은 인터넷에 있는 파일을 의심해본 적이 있나요?!!」, 「서버 관리 맛보기」, 「m1, m2 Mac 에서 VMware를 통해 Ubuntu 설치」를 바탕으로 재구성한 노트다. 컨테이너의 계보는 「Docker란 무엇인가?」, Joinc의 「Docker」, 「오픈소스 슈퍼루키 Docker 이해하기」, 「컨테이너 기반 가상화 프레임워크 Docker」, 「How to install docker on ubuntu」로 보강했다.
가상화란
가상화(virtualization)는 물리 자원을 소프트웨어로 나누거나 합쳐, 실제와 다른 모양의 자원처럼 보이게 하는 기술이다. 운영체제 자체가 이미 가상화를 한다. 프로세스마다 CPU를 혼자 쓰는 것처럼, 메모리를 혼자 쓰는 것처럼 보이게 하기 때문이다(운영체제 개요).
보통 "가상화"라고 하면 서버 가상화를 뜻한다. 물리 서버 한 대를 여러 가상 머신(VM) 으로 나누고, VM마다 자기 운영체제(게스트 OS)를 독립적으로 돌린다. 이를 관리하는 소프트웨어가 하이퍼바이저(hypervisor, VMM)다.
| 용어 | 뜻 |
|---|---|
| 호스트 | 물리 머신, 또는 하이퍼바이저를 실행하는 OS |
| 게스트 | VM 안에서 도는 OS |
| 시스템 VM | OS 전체를 실행하는 가상 컴퓨터 (VirtualBox, KVM) |
| 프로세스 VM | 프로그램 하나를 플랫폼 독립적으로 실행하는 런타임 (JVM, .NET CLR) |
하이퍼바이저의 두 분류
Type 1·2는 가상화 방식이 아니라 하이퍼바이저가 어디에 놓이느냐에 따른 분류다.
Type 1 (베어메탈):
flowchart TB
subgraph guests[" "]
direction LR
g1["게스트"] ~~~ g2["게스트"]
end
hv["하이퍼바이저"]
hw["하드웨어"]
guests ~~~ hv ~~~ hwType 2 (호스티드):
flowchart TB
subgraph upper[" "]
direction LR
subgraph vms[" "]
direction TB
subgraph guests[" "]
direction LR
g1["게스트"] ~~~ g2["게스트"]
end
hv["하이퍼바이저"]
guests ~~~ hv
end
app["일반 앱"]
end
os["호스트 OS"]
hw["하드웨어"]
upper ~~~ os ~~~ hw| 구분 | Type 1 | Type 2 |
|---|---|---|
| 위치 | 하드웨어 위에 직접 | 호스트 OS 위의 응용 프로그램 |
| 예 | VMware ESXi, Xen, Microsoft Hyper-V, KVM(리눅스 커널 자체가 하이퍼바이저가 됨) | VirtualBox, VMware Workstation·Fusion, Parallels, UTM |
| 장점 | 오버헤드가 작고 격리가 강함 | 설치가 쉽고 데스크톱에서 다른 앱과 함께 사용 |
| 쓰는 곳 | 데이터센터, 클라우드(AWS Nitro는 KVM 기반) | 개발·테스트, 다른 OS 체험 |
특권 명령을 어떻게 처리하나: 전가상화와 반가상화
게스트 OS는 자기가 하드웨어를 독점한다고 믿고 페이지 테이블 변경, 인터럽트 제어 같은 특권(sensitive) 명령을 실행한다. 이 명령이 진짜 하드웨어에 닿으면 다른 VM까지 망가진다. 하이퍼바이저는 이 명령을 가로채(trap) 대신 처리해야 한다. 그 방법에 따라 세 가지로 나뉜다.
| 방식 | 원리 | 게스트 수정 | 특징 |
|---|---|---|---|
| 전가상화 (binary translation) | 실행 중에 게스트 코드의 특권 명령을 같은 효과의 안전한 명령으로 바꿔 실행 | 불필요 | 초기 VMware. 번역 오버헤드가 있다 |
| 반가상화 (para-virtualization) | 게스트 커널을 고쳐 특권 명령 대신 하이퍼바이저 API(hypercall)를 직접 호출 | 필요 | 초기 Xen. 빠르지만 게스트 OS를 수정해야 한다 |
| 하드웨어 지원 가상화 | CPU가 게스트 전용 실행 모드를 제공해 특권 명령이 자동으로 하이퍼바이저로 빠짐 | 불필요 | Intel VT-x, AMD-V, ARM의 EL2. 현재의 기본 |
- 메모리 주소 변환도 하드웨어가 돕는다(Intel EPT, AMD NPT). 게스트의 가상 주소 → 게스트 물리 주소 → 실제 물리 주소의 2단계 변환을 MMU가 처리한다.
- 장치는 virtio 같은 반가상화 드라이버를 쓴다. 디스크·네트워크를 흉내 내는 대신 게스트가 하이퍼바이저와 효율적인 큐로 직접 주고받는다. 그래서 오늘날 하이퍼바이저는 "CPU는 하드웨어 지원, I/O는 반가상화"를 섞어 쓴다. 전가상화와 반가상화의 경계는 사실상 흐려졌다.
- 장치 자체를 VM에 넘겨주는 패스스루에는 IOMMU(Intel VT-d, AMD-Vi)가 필요하다.
Type 1·2 분류와 전가상화·반가상화 분류는 서로 독립이다. "Type 1 = 반가상화"처럼 짝지어 외우면 틀린다.
아키텍처가 다르면: 가상화 vs 에뮬레이션
하이퍼바이저는 게스트 명령을 CPU에서 직접 실행한다. 그래서 호스트와 게스트의 명령어 집합이 같아야 한다. Apple Silicon(ARM64) Mac에서는 ARM64용 게스트 OS 이미지를 받아야 한다. x86 OS를 돌리려면 명령어를 하나하나 번역하는 에뮬레이션(QEMU의 TCG 등)이 필요하고 훨씬 느리다. VirtualBox는 7.1부터 Apple Silicon 호스트를 지원하고, VMware Fusion·Parallels·UTM도 ARM 게스트를 돌린다.
운영체제 수준 가상화: 컨테이너
컨테이너는 하드웨어를 가상화하지 않는다. 커널 하나를 공유하면서 프로세스가 보는 세계만 격리한다.
| 커널 기능 | 격리하는 것 |
|---|---|
| 네임스페이스 | PID, 네트워크, 마운트, 사용자, 호스트 이름, IPC를 프로세스 그룹마다 따로 보이게 |
| cgroups | CPU·메모리·I/O 사용량 제한 |
| seccomp, LSM(AppArmor·SELinux) | 쓸 수 있는 시스템 콜과 접근 대상 제한 |
컨테이너는 수 초 안에 뜨고 이미지가 작지만, 커널을 공유하므로 커널 취약점 하나가 격리를 깰 수 있고 호스트와 다른 커널(예: Linux 위의 Windows)은 돌릴 수 없다. VM과 컨테이너의 비교표, Docker와 오케스트레이션은 VM과 컨테이너에, 네트워크 네임스페이스를 직접 만드는 과정은 리눅스 네트워크 네임스페이스와 ip 명령에 있다. 둘을 섞은 경량 VM(Firecracker, Kata Containers)은 컨테이너처럼 빨리 뜨면서 VM 수준으로 격리한다.
운영체제 수준 가상화는 Docker보다 오래됐다. FreeBSD jail(2000), Solaris Zones(2004), 리눅스의 LXC(2008)가 같은 일을 했다. 2013년 공개된 Docker는 처음에 LXC를 감싼 도구에 AUFS 층 이미지를 붙인 것이었고, 0.9(2014)에서 자체 라이브러리 libcontainer로 바꿔 LXC 의존을 끊었다. libcontainer는 뒤에 OCI 런타임 runc가 됐다. Docker의 기여는 새 격리 기술이 아니라 복잡한 커널 기능을 API·CLI로 감싸고, 층 이미지와 레지스트리(push·pull)라는 배포 단위를 붙인 데 있다.
샌드박스로서의 VM
샌드박스는 믿을 수 없는 코드를 격리된 곳에서 실행해 시스템을 보호하는 장치다. 의심스러운 파일을 VM에서 실행하면 랜섬웨어여도 호스트는 무사하고, 스냅샷으로 되돌려 다시 시험할 수 있다.
| 샌드박스 유형 | 방식 | 예 |
|---|---|---|
| 환경 격리형 | 게스트 OS 전체를 따로 둔다 | VM, Windows Sandbox |
| 실행 격리형 | 같은 OS에서 프로세스의 권한·접근을 제한 | AppArmor·SELinux 프로필(리눅스 접근 제어), 브라우저의 탭 프로세스, iframe sandbox 속성 |
| 물리 격리 | 별도 기기·디스크 | 분석 전용 PC |
정교한 악성코드는 VM 안인지 감지하고 행동을 숨기기도 한다. 가상화가 격리를 완벽히 보장하지는 않으며, 하이퍼바이저 탈출 취약점도 존재한다.
가상 네트워크 모드
VirtualBox·VMware 같은 데스크톱 하이퍼바이저가 VM에 주는 네트워크는 보통 셋 중 하나다.
| 모드 | 동작 | 외부 → VM 접속 | 인터넷 |
|---|---|---|---|
| NAT | 하이퍼바이저가 공유기처럼 주소를 변환. VM은 사설 주소를 받는다 | 포트 포워딩 필요 | 가능 |
| 브리지(Bridged) | VM이 호스트와 같은 물리 네트워크에 직접 붙어 공유기에게서 주소를 받는다 | 가능 | 가능 |
| 호스트 전용(Host-only) | 호스트와 VM끼리만 통하는 가상 네트워크 | 호스트에서만 | 불가 |
NAT와 포트 포워딩의 원리는 네트워크 계층 프로토콜에 있다.
정리
- 서버 가상화 = 하이퍼바이저가 물리 머신을 여러 VM으로 나누는 것이다.
- Type 1·2는 하이퍼바이저의 위치, 전가상화·반가상화·하드웨어 지원은 특권 명령 처리 방식이다. 두 분류는 독립이다.
- 오늘날 하이퍼바이저는 VT-x·AMD-V로 CPU를, virtio로 I/O를 가상화한다.
- 가상화는 같은 아키텍처끼리만 빠르다. 다른 아키텍처는 에뮬레이션이다.
- 컨테이너는 커널을 공유하는 격리, VM은 하드웨어를 나누는 격리다. 격리 강도와 가벼움 사이에서 고른다.
관련 노트: VM과 컨테이너, 운영체제 개요, 리눅스 접근 제어, 리눅스 네트워크 네임스페이스와 ip 명령
원본 기록11
- Notion 원문 (새 창) 80000coding.notion.site/7638f02b1afe4ec697def740fb87ddf5
- Notion 원문 (새 창) 80000coding.notion.site/a6441099745c4aff8cd50a5ac36c7238
- Notion 원문 (새 창) 80000coding.notion.site/506a40f3aed7484aa461027f014aff35
- Notion 원문 (새 창) 80000coding.notion.site/369d9cf9c1a4418f8efb4943ea952da4
- Notion 원문 (새 창) 80000coding.notion.site/54aafe0b4c2447dea6364de4dcc092b9
- Notion 원문 (새 창) 80000coding.notion.site/6020ebc86a2c468e9440a5686272a925
- 원문 (새 창) bcho.tistory.com/805
- 원문 (새 창) www.joinc.co.kr/modules/moniwiki/wiki.php/man/12/docker
- 원문 (새 창) opennaru.tistory.com/9
- 원문 (새 창) hatemogi.com/holiday-project-day-13/
- 원문 (새 창) www.yongbok.net/blog/how-to-install-docker-on-ubuntu/