Computer >> 컴퓨터 >  >> 소프트웨어 >> 가상 머신

KVM 가상화 완벽 입문 가이드 - 기본 개념부터 설치와 활용까지

KVM 시리즈에 오신 것을 환영합니다. 지금까지 저의 가상화 관련 글에서는 주로 VMware와 VirtualBox, 그리고 약간의 클라우드와 이미지 리마스터링을 다뤄왔습니다. 하지만 이제 새로운 영역으로 확장할 때가 되었습니다. 오늘부터 KVM을 중심으로 한 완전히 새로운 튜토리얼 시대를 공식적으로 시작하려 합니다. 추후에는 Xen과 다른 흥미로운 기술들도 다룰 예정이지만, 우선은 KVM에 집중하겠습니다.

이 가이드를 통해 RedHat이 개발한 KVM(Kernel-based Virtual Machine) 기술을 배워보겠습니다. KVM은 상용 솔루션에 대한 무료 오픈소스 대안으로 제공됩니다. KVM의 다운로드, 설치, 설정 방법, 가상 머신을 관리하는 데 사용할 수 있는 도구들, 사용 가능한 옵션, 명령줄 사용법과 스크립팅 등을 학습하게 됩니다. 또한 고급 네트워킹 및 스토리지 구성을 비롯한 여러 유용한 기능도 살펴볼 것입니다. 그럼 시작해 보겠습니다.

KVM 가상화 완벽 입문 가이드 - 기본 개념부터 설치와 활용까지

KVM 용어 정리

KVM의 작동 방식에 대한 간략한 개요부터 시작하겠습니다. 거창한 내용은 아니며, 기본 용어를 익히기 위한 짧은 소개일 뿐입니다. 걱정하지 마세요. 곧 모든 것이 아주 간단해질 겁니다.

KVM은 최신 Intel 및 AMD 프로세서에 탑재된 CPU 가상화 확장 기능인 Intel-VT와 AMD-V를 활용하여 작동합니다. 메모리에 로드된 커널 모듈을 통해 프로세서를 사용하고, 수정된 QEMU 기반의 사용자 모드 드라이버를 통해 하드웨어 계층을 에뮬레이트하여 그 위에 가상 머신을 생성하고 실행할 수 있습니다. KVM은 CPU 확장 기능 없이도 실행할 수 있지만, 이 경우 QEMU를 사용한 순수 에뮬레이션 모드로 동작하게 되어 성능이 크게 저하됩니다.

KVM은 VMware 제품이나 VirtualBox와 유사한 그래픽 관리 도구를 통해서도, 명령줄을 통해서도(여러 가지 방법으로) 관리할 수 있습니다.

가장 인기 있는 GUI는 RedHat이 개발한 Virtual Machine Manager(VMM)입니다. 이 도구는 일반 패키지 이름인 virt-manager로도 알려져 있습니다. VMM에는 가상 머신을 프로비저닝, 복제, 설치, 조회하는 데 각각 사용되는 virt-install, virt-clone, virt-image, virt-viewer 등 여러 보조 도구가 함께 제공됩니다. VMM은 Xen 머신도 지원합니다.

KVM의 일반적인 명령줄 인터페이스는 virsh에서 제공합니다. 특히 가상 머신 생성 시에는 virt-install 같은 보조 도구를 활용할 수 있습니다. Ubuntu에서는 Canonical이 개발한 ubuntu-vm-builder라는 특수 도구를 사용해 Ubuntu 빌드를 프로비저닝할 수 있습니다.

다양한 이름 때문에 혼란스러울 수 있지만, 천천히 살펴보면 금방 이해하게 될 것입니다. 그런데 좀 더 혼란스럽게 만들자면, KVM은 QEMU와 유사한 자체 문법도 가지고 있습니다. 다만 이는 권장되는 가상 머신 관리 방식은 아닙니다.

더 자세한 정보는 다음 페이지들을 참고하세요:

  • The Kernel Virtual Machine - Community Ubuntu Documentation
  • howtoforge.com의 KVM 튜토리얼
  • KVM/Virsh - Community Ubuntu Documentation

좋습니다, 1단계가 끝났습니다.

KVM의 장단점

KVM을 사용해야 할까요? 그것은 달성하고자 하는 목표에 따라 다릅니다.

일반 가정용 사용자나 가상화 취미생활자, 중급 수준의 매니아라면 KVM은 시작하기가 다소 어려울 수 있습니다. KVM은 기본적으로 명령줄 도구로, VMware나 VirtualBox 제품만큼 직관적이거나 친숙하지 않습니다. GUI 관리 측면에서는 경쟁사보다 몇 년 뒤처진 느낌이 들지만, 실제 성능 면에서는 만큼 강력합니다. 사실 명령줄 도구로 사용하도록 설계되었기 때문에 장기적으로는 더 나은 생산성과 더 많은 제어권을 누릴 수 있습니다. 따라서 KVM은 비즈니스 환경에서 가장 큰 의미가 있습니다.

또한 CPU가 가상화를 지원하지 않는다면 KVM은 시간 낭비가 될 수 있습니다. 극도로 느리고 비효율적인 에뮬레이션 모드로 실행되기 때문입니다. KVM이 VirtualBox와 충돌한다는 것도 알려져 있는데, 이에 대해서는 별도 튜토리얼에서 자세히 다루겠습니다.

따라서 KVM은 가상화에 깊은 관심이 있는 사람들, 즉 대부분 관리자와 전문가를 위한 것입니다. 가정용으로 가장 편안한 도구는 아니며, 앞으로도 몇 년간 그럴 가능성이 높습니다. 하지만 파고들 의지만 있다면 완전히 새로운 언어를 익히게 되고, 이는 나중에 다른 기술과 함께 사용할 때 시너지를 발휘할 것입니다. VMware나 VirtualBox가 GUI 도구 사용을 선호하는 반면, KVM은 명령줄 스크립팅의 순수한 효율성에 초점을 맞추고 있습니다.

요약하자면, 추가 라이선스 비용이나 기능 제한 없이 무제한으로 사용할 수 있는 무료 최신 가상화 솔루션, 강력한 명령줄 인터페이스를 찾고 있고 직접 손을 더럽히는 것을 두려워하지 않는다면 KVM이 좋은 선택입니다. 반면 CPU에 가상화 확장 기능이 없거나, 스크립트 작성이 두렵거나, 코드를 다루고 싶지 않으며, VMware Server, ESXi 또는 VirtualBox처럼 관리가 더 간편한 솔루션을 선호한다면 KVM은 적합하지 않습니다.

자, 이제 본격적으로 시작해 보겠습니다.

테스트 플랫폼

KVM은 사실상 모든 Linux 배포판에서 사용할 수 있습니다. 일반적으로 RedHat 계열 배포판들이 KVM을 선호합니다. RHEL은 운영체제에 KVM이 활성화된 상태로 출시되므로, CentOS, Scientific Linux, Fedora 같은 RedHat 기반 배포판에서도 찾을 수 있습니다.

저는 집에서 주로 Ubuntu를 사용하기 때문에, 가상화를 지원하는 i5 프로세서를 탑재한 비교적 최신 HP 노트북에 설치된 Ubuntu에서 테스트하기로 했습니다. 올해 안에는 Linux 전용 멀티부팅 머신에 최신 CentOS 또는 Scientific Linux를 배포할 계획이므로, 해당 배포판들에 대한 추가 튜토리얼도 선보일 예정입니다. Xen도 그때 다루겠습니다.

이 튜토리얼은 64비트 Ubuntu Lucid(Long Term Release)에서 KVM을 설정하는 방법을 보여줍니다. 후속 가이드와 사용법에서는 다른 가상화 기술과 함께 사용하는 방법, 충돌 해결, 고급 관리 기능, 스크립팅 등 KVM 관련 다양한 주제를 다룰 것입니다.

자, 이제 진짜로 시작해 봅시다.

사전 요구 사항

가상화를 지원하는 CPU가 필요합니다. 다음과 같이 확인할 수 있습니다:

egrep -c '(vmx|svm)' /proc/cpuinfo

0이 아닌 값이 출력되면 준비된 것입니다. 단, BIOS에서 가상화 기술이 활성화되어 있는지도 확인해야 합니다. 실제로 해당 기능을 활성화한 후에는 변경 사항이 적용되도록 컴퓨터를 완전히 종료한 후 다시 켜야(cold power-cycle) 합니다.

이 작업이 완료되면 운영체제로 부팅하여 KVM을 설치합니다.

확인하려면 kvm-ok를 실행하세요:

KVM 가상화 완벽 입문 가이드 - 기본 개념부터 설치와 활용까지

KVM 다운로드 및 설치

KVM을 설치하려면 다음 패키지들을 받으세요(apt 명령 기준):

apt-get install qemu-kvm libvirt-bin

선택적으로 다음 패키지도 설치할 수 있습니다(강력 추천):

apt-get install bridge-utils virt-manager python-virtinst

참고: 패키지 이름은 배포판마다 다를 수 있습니다. 예를 들어 virt-install은 python-virt-install 또는 python-virtinst, 심지어 virt-install로 표기될 수 있습니다. virt-clone, virt-image, virt-viewer의 의존성은 자동으로 해결됩니다.

대부분의 튜토리얼과 달리 말씀드리자면, bridge 유틸리티는 필수가 아닙니다. 가상 어댑터를 물리적 네트워크 카드와 브리징하려는 경우에만 필요합니다. 원리는 제 VirtualBox 네트워킹 튜토리얼에서 보여준 예시와 동일합니다.

대부분의 튜토리얼에서는 대부분의 무선 네트워크 인터페이스가 브리징을 지원하지 않는다고 언급합니다. 그럴 수도 있지만, 제 모든 테스트에서는 무선 어댑터를 성공적으로 브리징할 수 있었으니 희망을 가져보세요.

VMM(virt-manager)은 강력히 추천합니다. 마찬가지로 virt-viewer, virt-install, virt-image, virt-clone을 포함한 모든 보조 도구도 함께 사용하는 것이 좋습니다.

마지막으로 ubuntu-vm-builder를 선택할 수도 있습니다:

apt-get install ubuntu-vm-builder

많은 의존성 패키지가 자동으로 함께 설치되므로 다운로드에 시간이 걸릴 수 있습니다. 참고로 RedHat에서는 yum install을, SUSE에서는 zypper install을 사용하세요.

VirtualBox와의 충돌

역시 대부분의 튜토리얼과 달리 말씀드리면, KVM과 VirtualBox를 동일한 호스트에 함께 설치할 수 있습니다. 다만 두 프로그램을 동시에 실행할 수는 없습니다. 즉, 두 커널 모듈 중 하나를 메모리에서 언로드해야 합니다. 하지만 서두르지 않아도 됩니다. 일단 시도해 보고, 작동하지 않을 때만 조치를 취하면 됩니다.

그리고 이 작업은 시스템 재부팅 없이 실시간으로(in-vivo) 처리할 수 있으니 걱정하지 않으셔도 됩니다. 재부팅 같은 과감한 조치가 필요하지 않습니다. 이 경우를 다루는 별도 튜토리얼을 곧 소개하겠습니다. 실제로 테스트 호스트에는 두 프로그램이 모두 설치되어 실행되고 있습니다.

KVM 사용하기

이제 정말 재미있는 부분입니다. VMM부터 시작하겠습니다. GUI 도구이기 때문에 대부분의 사람들이 시작해야 할 지점이기도 합니다. 실용적인 측면에서 VMware 콘솔이나 VirtualBox 같이 이미 알고 계신 도구들과 매우 유사합니다.

Virtual Machine Manager(VMM)

둘러보겠습니다.

프로그램을 처음 실행하면 연결되지 않은 두 개의 카테고리가 표시됩니다. 이것들은 아직 사용되지 않는 로컬호스트의 KVM 모듈을 가리킵니다. 사용하려면 마우스 오른쪽 버튼을 클릭하고 connect를 선택하세요.

새 연결을 추가하려면 File > Add Connection을 클릭합니다. 하이퍼바이저 유형과 연결 유형을 지정할 수 있는 창이 열립니다. VMM은 QEMU/KVM과 Xen을 포함하여 로컬 및 원격 연결을 모두 지원하며, 다양한 인증 방식으로 연결할 수 있습니다.

자동 연결(autoconnect)도 설정할 수 있는데, 이렇게 하면 다음에 VMM을 실행할 때 해당 연결들이 바로 준비되어 있습니다. VMware Server가 프로그램 시작 시 묻는 것과 유사합니다. 참고로:

커널 모드 vs 사용자 모드

일반/기본 모드와 Usermode의 차이점이 궁금하실 수 있습니다. Usermode는 관리자 권한 없이 실행할 수 있지만 네트워크 기능이 제한됩니다. 자, 계속 진행하겠습니다.

VMM 둘러보기 계속

가상 머신을 생성하기 전에 다른 기능들을 살펴보겠습니다.

네트워크 기능은 Host Details에서 확인하거나 변경할 수 있습니다. KVM 네트워크 작업 방법을 가르치는 별도 튜토리얼을 준비할 예정이고, 브리지 유틸리티 설정 방법도 다룰 테니 걱정하지 마세요.

마찬가지로 스토리지 설정도 변경할 수 있습니다. 전용 가이드를 별도로 준비하겠다고 약속합니다.

환경설정 변경

VMM에는 더 스마트하게 보이고 작동하도록 조정할 수 있는 몇 가지 옵션이 있습니다. 시스템 트레이 아이콘 활성화, 통계 폴링 간격 설정, 디스크 및 네트워크 메트릭 폴링 활성화(기본적으로 선택 해제되어 있음), 콘솔 키보드 잡기, 콘솔 스케일링, 오디오 옵션 구성, 머신 활동에 대한 확인 창 설정 등이 가능합니다.

KVM 가상화 완벽 입문 가이드 - 기본 개념부터 설치와 활용까지

KVM 가상화 완벽 입문 가이드 - 기본 개념부터 설치와 활용까지

이후에는 이러한 설정들을 통해 가상 머신의 메트릭을 더 자세하고 정밀하게 확인할 수 있습니다. 예를 들어 Ubuntu 게스트의 CPU, 디스크 I/O, 네트워크 I/O 표시가 가능합니다.

시스템 트레이 아이콘은 다음과 같습니다.

드디어 새 가상 머신을 생성할 준비가 되었습니다.

가상 머신 생성

VMM이나 명령줄을 통해 생성할 수 있습니다. 먼저 GUI부터 시작하겠습니다. 첫 번째 단계는 상당히 직관적입니다. 이름과 설치 미디어 위치를 입력하세요. ISO 이미지나 CD/DVD 형태의 로컬 스토리지, HTTP 또는 FTP 서버, NFS 영역 또는 PXE를 사용할 수 있습니다.

여기서는 로컬 설치 미디어를 사용하겠습니다. 다음으로 물리적 장치 또는 이미지를 선택합니다. 이번 경우에는 ISO를 사용합니다. 그런 다음 OS 유형과 버전을 선택합니다. 정확할 필요는 없지만, 합리적으로 추측하는 것이 좋습니다. 추가적인 가상 머신 최적화가 가능하기 때문입니다.

RAM과 CPU를 할당합니다.

네 번째 단계가 꽤 흥미롭습니다. 바로 스토리지입니다. 새 이미지를 생성하거나 기존 이미지를 사용할 수 있습니다. 크기를 설정하고 모든 공간을 사전 할당(preallocate)할 수 있는데, 이는 성능에 좋고 파편화도 줄여줍니다.

스토리지에 대해서는 곧 더 자세히 다룰 예정입니다. 지금은 디스크가 준비되어 있다고 가정하거나, 기본 스토리지 풀에 하나를 생성한다고 가정하겠습니다. Usermode로 실행 중이라면 /var(기본 스토리지 풀 위치)에 쓰기 권한이 없다는 점에 유의하세요. 관리자가 아닌 사용자도 접근 가능한 새 스토리지 풀을 생성해야 하는데, 이에 대해서는 별도 글에서 다루겠습니다.

5단계는 고급 옵션이 포함된 요약 화면입니다. 네트워크 유형 변경, 고정 MAC 주소 설정, 가상화 유형 선택, 대상 아키텍처 지정이 가능합니다. Usermode로 실행 중이라면 네트워크 옵션이 제한됩니다. 브리지 유틸리티를 사용하지 않으면 인터페이스를 브리징할 수 없습니다. 마지막으로 CPU 가상화 확장 기능이 없다면 Virt Type 필드가 KVM이 아닌 QEMU로 표시됩니다. 이 부분은 나중에 에뮬레이션 모드 실행의 주요 단점을 논의할 때 예시를 통해 살펴보겠습니다. 일반적인 Ubuntu 가상 머신 설정은 다음과 같습니다.

머신이 사용 준비를 마쳤습니다. 곧 전원을 켜고 사용해 보겠습니다.

가상 머신 옵션

VMM 자체와 마찬가지로 VM 콘솔에도 몇 가지 흥미로운 옵션이 있습니다. 게스트에 신호를 보내거나, 가상 콘솔을 전환하거나, 강제 재부팅 및 종료, 복제, 마이그레이션, 저장, 스크린샷 촬영 등이 가능합니다. 역시 경쟁 제품들과 매우 유사합니다.

복제(clone)와 마이그레이션(migrate) 옵션의 스크린샷을 미리 보여드립니다. 추후 GUI와 CLI 기능 모두에 초점을 맞춘 상세 튜토리얼을 준비하겠습니다.

가상 머신 실행

재미있는 부분입니다. 멋진 스크린샷 몇 장을 보여드리겠습니다.

32비트 버전 Ubuntu 10.10 Maverick의 부팅 메뉴부터 시작합니다.

Puppy Linux가 멋진 데스크톱과 함께 표시됩니다.

NAT 방식으로 잘 실행되는 Ubuntu입니다. CPU 사용률이 매우 낮다는 점에 주목하세요. 중요합니다. 나중에 에뮬레이션 전용 모드를 논의할 때 기억해 두세요. 잔소리처럼 들리지만, 제 초집중 교육에 조금만 참아주세요.

콘솔 창을 게스트 크기에 맞게 조절할 수도 있습니다. 뷰어 메뉴에서 사용할 수 있는 또 다른 옵션입니다. 그리고 환경설정에서 콘솔 자동 스케일링을 사용할 수도 있습니다. Puppy와 Ubuntu를 나란히 놓은 모습입니다.

시스템 사용량입니다. 최소 수준입니다. 이런 현명한 소비 덕분에 하나의 머신을 하나의 코어에 바인딩하면서도, 물리적 하드웨어가 일반적으로 허용하는 것보다 더 많은 가상 머신을 아낌없이 오버커밋하고 즐길 수 있습니다.

마지막으로 머신과 관련 파일을 삭제할 수도 있습니다.

이제 기본 사용법에 익숙해졌으니, 명령줄을 활용해 보겠습니다.

명령줄

이제 악명 높은 명령줄을 살펴보겠습니다. 예를 들어 virsh를 사용하여 사용 가능한 모든 가상 머신을 나열할 수 있습니다.

virsh 'list --all'

다음은 virt-install을 사용하여 가상 머신을 생성하고 실행하는 명령 시퀀스입니다. 참고로 저는 KVM 전문가가 아닙니다. man 페이지에 템플릿 코드가 있고, 온라인에서 무수한 예시를 찾을 수 있습니다.

실제 명령은 다음과 같습니다:

virt-install --connect qemu://system -n puppy -r 512 -f puppy.img -c lupu-520.iso --vnc --noautoconsole --os-type linux --accelerate --network=network:default

각 옵션의 의미는 무엇일까요?

--connect qemu:///system은 사용되는 하이퍼바이저 유형을 정의합니다. system은 root로 베어메탈 커널에서 실행할 때 사용되고, session은 root가 아닌 사용자에게 사용됩니다. VMM에서 Usermode로 오른쪽 클릭 후 connect를 선택했던 차이점을 떠올리면 이해가 될 것입니다. xen에서도 동일하게 작동합니다.

-n puppy는 고유한 가상 머신 이름입니다. 마음에 들지 않으면 virsh로 게스트의 이름을 변경하거나 삭제할 수 있습니다.

-r 512는 RAM을 지정합니다.

-f는 디스크 파일을 지정합니다. 이 경우 dd 명령으로 생성한 puppy.img 디스크 이미지를 사용했습니다. 공간 절약을 위해 이미지를 sparse 파일로 생성했습니다. sparse 파일 생성 방법은 제 두 번째 cool Linux hacks 글에서 자세히 배울 수 있습니다.

-c는 CD-ROM을 지정하며, 물리적 장치 또는 ISO 이미지를 사용할 수 있습니다.

--vnc는 게스트 콘솔을 설정하고 VNC 서버로 내보냅니다. --noautoconsole은 가상 머신 전원이 켜질 때 콘솔을 자동으로 열지 않습니다.

--os-type은 게스트의 운영체제를 지정합니다.

--accelerate는 가능한 경우 KVM이 게스트 시스템의 성능을 가속화하는 최적화 기능을 사용하도록 허용합니다.

--network는 네트워크 유형을 정의합니다. 여기서는 기본 연결(default)을 사용합니다.

코어 수 설정이나 머신을 특정 CPU 코어에 바인딩, NIC에 고정 MAC 주소 설정, 스토리지 미사용, 키보드 맵 변경 등 다른 많은 기능들도 사용할 수 있습니다.

이 모든 것들은 man 페이지에 나열되어 있습니다. 직관적이지는 않지만, 사용하다 보면 쉬워집니다. 사실 첫인상과 달리 학습 곡선이 그리 높지 않습니다. virt-install에 익숙해지면 다른 명령들도 다루고, virsh로 머신을 시작하고 중지할 수 있게 됩니다.

기타 사항

언급할 가치가 있는 세부 사항 몇 가지입니다.

순수 에뮬레이션 모드로 실행하기 (하지 마세요)

앞서 완전히 비효율적이라고 말씀드렸습니다. 이제 그 증거입니다. Host Details Overview를 살펴보세요. Performance 그래프에서 CPU 사용량이 가상 머신에 사용 가능한 리소스(이 경우 하나의 코어)의 100%로 최대치에 도달합니다. 이는 전체의 25% 활용률에 해당하며, 거의 DOS 시절 같은 상황입니다. 즉, 아무리 작거나 가벼운 가상 머신이라도 4대가 실행되면 4코어 호스트가 마비된다는 의미입니다.

또한 성능도 끔찍합니다. Intel-VT 확장 기능이 활성화된 상태에서 Ubuntu 게스트가 내장 7,200rpm 디스크의 이미지를 로드하고 부팅하는 데 약 1분이 걸린다면, 에뮬레이션 모드에서는 약 20분이 걸립니다. CPU 확장 기능 없이도 상당히 준수한 성능을 제공하는 다른 솔루션과 비교할 때, 이것이 QEMU/KVM의 단점이라고 생각합니다.

더 읽을 거리

위에 링크된 howtoforge.com의 KVM 시리즈를 강력히 추천합니다.

그리고 다음 자료들도 읽어보세요:

  • Discover the Linux Kernel Virtual Machine
  • KVM management tools

결론

이 튜토리얼이 마음에 드셨기를 진심으로 바랍니다. KVM 시작을 위한 첫걸음만 담고 있지만, 상당히 길고 상세합니다. 초기 설정과 사전 요구 사항, 명령줄 및 GUI 도구, 관리 옵션, 여러 가상 머신의 생성 및 실행 방법 등 많은 것에 대한 통찰을 제공합니다.

후속 편들이 많이 나올 예정입니다. 브리지 네트워킹을 포함한 고급 스토리지 및 네트워킹 구성, 가상 머신 복제 및 마이그레이션 방법, 다른 가상화 소프트웨어와의 충돌 해결 방법 등을 다룰 것입니다. 직접적으로 관련되지는 않지만, Xen과 ESXi에 대한 글도 많이 준비하고 있습니다.

보시다시피 KVM은 새 사용자에게 다소 어려워 보일 수 있지만 상당히 강력합니다. 관리 옵션이 경쟁사보다 초보자 친화적이지 않은 것은 분명하지만, 다행히 오늘 그 두려움과 혼란의 일부는 해소되었기를 바랍니다.

자, 여기까지가 전부인 것 같네요. 즐겁게 사용하세요!