icon

안동민 개발노트

13장 : 가상화와 컨테이너

가상화의 개념


클라우드 서비스에서 서버를 생성하면 몇 분 안에 사용할 수 있습니다. 이 서버는 물리 서버일까요? 아닙니다. 하나의 물리 서버 위에 여러 개의 가상 서버가 동작하고 있습니다. 이것을 가능하게 하는 기술이 가상화(Virtualization)입니다. 가상화는 현대 클라우드 인프라의 기반이며, OS 과목의 거의 모든 개념이 여기서 다시 등장합니다.


가상화란 무엇인가

가상화는 물리적 하드웨어 위에 소프트웨어로 가상의 하드웨어를 만드는 기술입니다. 하나의 물리 서버에서 여러 운영체제를 독립적으로 실행할 수 있습니다.

왜 가상화가 필요한가

자원 효율: 서버 한 대가 CPU의 10%만 사용하고 있다면 나머지 90%가 낭비됩니다. 가상화를 통해 하나의 물리 서버에서 여러 서비스를 운영하면 자원 활용률을 70~80%까지 높일 수 있습니다.

격리(Isolation): 서비스 A의 크래시가 서비스 B에 영향을 주지 않아야 합니다. 각 가상 머신은 독립된 OS를 가지므로, 한 VM이 충돌해도 다른 VM은 정상 동작합니다.

유연성: 물리 서버를 구매하고 설치하는 데 수 주가 걸리지만, VM은 수 분 내에 생성하고 삭제할 수 있습니다.

이식성: VM 이미지를 복사하면 다른 물리 서버에서 동일한 환경을 즉시 실행할 수 있습니다. 개발 환경과 프로덕션 환경의 차이를 줄입니다.


하이퍼바이저

하이퍼바이저(Hypervisor)는 가상 머신을 생성하고 관리하는 소프트웨어입니다. VMM(Virtual Machine Monitor)이라고도 합니다.

Type 1 (베어메탈, Native)

하드웨어 위에 직접 설치됩니다. 호스트 OS가 없거나 최소한입니다. 하이퍼바이저 자체가 하드웨어를 직접 제어합니다.

Excalidraw 씬을 불러오는 중입니다.

Type 1 하이퍼바이저는 하드웨어 위에 직접 올라가며, 그 위에서 여러 VM이 독립적으로 실행됩니다.

  • VMware ESXi: 엔터프라이즈 시장 점유율 1위
  • Microsoft Hyper-V: Windows Server에 내장
  • Xen: AWS EC2가 초기에 사용(현재 Nitro/KVM)
  • KVM: Linux 커널에 통합된 하이퍼바이저. 현재 클라우드의 주류

성능이 우수하여 데이터센터와 클라우드에서 사용됩니다.

Type 2 (호스트형, Hosted)

일반 OS(Windows, macOS, Linux) 위에 애플리케이션처럼 설치됩니다.

Excalidraw 씬을 불러오는 중입니다.

Type 2 하이퍼바이저는 일반 Host OS 위에서 애플리케이션처럼 동작하며, 그 위에 VM을 실행합니다.

  • VirtualBox: 무료, 크로스 플랫폼
  • VMware Workstation/Fusion: 유료, 높은 호환성
  • Parallels Desktop: macOS 전용

개발 환경이나 테스트 용도로 사용됩니다. 호스트 OS를 거치므로 Type 1보다 성능 오버헤드가 있습니다.

KVM — 경계가 모호한 하이퍼바이저

KVM(Kernel-based Virtual Machine)은 Linux 커널의 모듈입니다. Linux를 부팅하면 일반 OS처럼 보이지만, KVM 모듈을 로드하면 커널 자체가 Type 1 하이퍼바이저가 됩니다. Linux를 호스트 OS로 보면 Type 2이지만, 실제로는 커널이 CPU의 가상화 확장을 직접 사용하므로 Type 1에 가깝습니다.

kvm_check.py
import subprocess

def check_virtualization():
    """시스템의 가상화 지원 확인"""
    # CPU 가상화 지원 확인
    with open("/proc/cpuinfo") as f:
        cpuinfo = f.read()

    if "vmx" in cpuinfo:
        print("Intel VT-x 지원")
    elif "svm" in cpuinfo:
        print("AMD-V 지원")
    else:
        print("하드웨어 가상화 미지원")

    # KVM 모듈 로드 확인
    result = subprocess.run(["lsmod"], capture_output=True, text=True)
    if "kvm" in result.stdout:
        print("KVM 모듈 로드됨")
    else:
        print("KVM 모듈 미로드")

    # 현재 가상환경에서 실행 중인지 확인
    result = subprocess.run(
        ["systemd-detect-virt"], capture_output=True, text=True
    )
    virt = result.stdout.strip()
    if virt == "none":
        print("물리 머신에서 실행 중")
    else:
        print(f"가상 환경에서 실행 중: {virt}")

전가상화와 반가상화

전가상화(Full Virtualization): 게스트 OS가 자신이 가상 환경에서 돌고 있다는 사실을 모릅니다. 하이퍼바이저가 모든 하드웨어 접근을 가로채서 에뮬레이션합니다. 게스트 OS를 수정할 필요가 없습니다. 단, 가로채기와 변환의 오버헤드가 있습니다(이를 Binary Translation이라 합니다).

반가상화(Paravirtualization): 게스트 OS가 가상 환경을 인지합니다. 하드웨어 접근 대신 하이퍼바이저에 직접 요청(하이퍼콜, Hypercall)합니다. 오버헤드가 적지만 게스트 OS 커널을 수정해야 합니다. Xen이 이 방식의 선구자입니다.

VirtIO — 반가상화의 실용적 해결

완전한 하드웨어 에뮬레이션(e1000 NIC, IDE 디스크)은 느립니다. VirtIO는 게스트와 호스트 사이에 최적화된 가상 장치 인터페이스를 제공합니다. 게스트에 VirtIO 드라이버만 설치하면, 네트워크와 디스크 I/O가 거의 네이티브 수준으로 빨라집니다.

장치 유형에뮬레이션VirtIO
네트워크e1000 (~1Gbps)virtio-net (~10Gbps)
디스크IDE (~100 IOPS)virtio-blk (~10만 IOPS)

하드웨어 지원 가상화

현대 CPU는 가상화를 하드웨어로 지원합니다. Intel의 VT-x(2005~)와 AMD의 AMD-V(2006~)가 대표적입니다.

하드웨어 가상화 지원이 있으면 CPU에 Root 모드Non-Root 모드가 추가됩니다. 하이퍼바이저는 Root 모드에서, 게스트 OS는 Non-Root 모드에서 실행됩니다. 게스트의 특권 명령은 CPU가 자동으로 VM Exit를 발생시켜 하이퍼바이저에 넘깁니다. 소프트웨어 Binary Translation이 필요 없어집니다.

기술대상효과
VT-x / AMD-VCPU 명령어특권 명령 트랩 자동화
EPT / NPT메모리2단계 주소 변환 하드웨어 처리
VT-d / IOMMUI/O 장치장치의 VM 직접 할당 (Passthrough)
SR-IOVNIC하나의 물리 NIC를 여러 가상 NIC로 분할

EPT(Extended Page Tables): 게스트 가상 → 게스트 물리 → 호스트 물리의 2단계 주소 변환을 하드웨어가 처리합니다. 이전에는 섀도 페이지 테이블을 소프트웨어로 관리해야 했고, 이것은 오버헤드가 컸습니다.

VT-d / IOMMU: 물리 장치를 VM에 직접 할당합니다. GPU 패스스루가 대표적 — ML 워크로드에서 VM 안에서도 네이티브 GPU 성능을 얻을 수 있습니다.

hardware_virt_check.sh
# Intel VT-x 지원 확인
grep -c vmx /proc/cpuinfo   # 0이면 미지원

# AMD-V 지원 확인
grep -c svm /proc/cpuinfo

# IOMMU 활성화 확인
dmesg | grep -i iommu

# VM 성능에 큰 영향을 주는 EPT 지원 확인
cat /sys/module/kvm_intel/parameters/ept  # Y

AWS EC2는 Nitro System으로 I/O를 전용 하드웨어로 오프로드하여, 하이퍼바이저의 CPU 오버헤드를 거의 0으로 줄였습니다. 현대 클라우드 VM은 베어메탈과 5% 이내의 성능 차이를 보입니다.

다음 절에서는 가상화보다 가벼운 격리 기술인 컨테이너를 다루겠습니다.

목차