가상화 · 6 min read · Jan 12, 2026

Ubuntu 12.04 LTS에서 KVM을 이용한 가상화

Ubuntu 12.04 LTS에서 KVM을 이용한 가상화

버전 1.0
저자: Falko Timme
Twitter에서 나를 팔로우하세요

이 가이드는 Ubuntu 12.04 LTS 서버에서 가상 머신을 생성하고 실행하기 위해 KVM을 설치하고 사용하는 방법을 설명합니다. 이미지 기반 가상 머신과 논리 볼륨(LVM)을 사용하는 가상 머신을 만드는 방법을 보여드리겠습니다. KVM은 Kernel-based Virtual Machine의 약자로 하드웨어 가상화를 사용합니다. 즉, 하드웨어 가상화를 지원하는 CPU가 필요합니다. 예를 들어 Intel VT 또는 AMD-V가 있습니다.

이것이 여러분에게 작동할 것이라는 보장은 하지 않습니다!

1 사전 참고

저는 여기서 KVM 호스트로서 hostname이 server1.example.com이고 IP 주소가 192.168.0.100인 머신을 사용하고 있습니다.

이 튜토리얼의 모든 단계를 루트 권한으로 실행할 것이므로, 이 튜토리얼의 모든 명령어 앞에 문자열 sudo를 추가하거나, 지금 바로 다음을 입력하여 루트가 될 수 있습니다.

sudo su

2 KVM 및 vmbuilder 설치하기

먼저 CPU가 하드웨어 가상화를 지원하는지 확인하십시오. 이 경우 명령어

egrep '(vmx|svm)' --color=always /proc/cpuinfo

가 다음과 같은 내용을 표시해야 합니다:

root@server1:~# egrep '(vmx|svm)' --color=always /proc/cpuinfo  
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush  
mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow rep_good nopl extd_apicid  
pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy 3dnowprefetch lbrv  
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush  
mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow rep_good nopl extd_apicid  
pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy 3dnowprefetch lbrv  
root@server1:~#

아무것도 표시되지 않으면 프로세서가 하드웨어 가상화를 지원하지 않으며 여기서 중단해야 합니다.

KVM과 vmbuilder(우분투 기반 가상 머신을 생성하는 스크립트)를 설치하려면 다음을 실행합니다:

apt-get install ubuntu-virt-server python-vm-builder kvm-ipxe

그 후 현재 로그인한 사용자(루트)를 libvirtd 그룹에 추가해야 합니다:

adduser `id -un` libvirtd  
adduser `id -un` kvm

새 그룹 멤버십이 적용되려면 로그아웃한 후 다시 로그인해야 합니다.

KVM이 성공적으로 설치되었는지 확인하려면 다음을 실행합니다:

virsh -c qemu:///system list

다음과 같은 내용을 표시해야 합니다:

root@server1:~# virsh -c qemu:///system list  
 Id Name                 State  
----------------------------------  
  
root@server1:~#

대신 오류가 표시되면 뭔가 잘못된 것입니다.

다음으로, 가상 머신이 네트워크의 물리적 시스템처럼 다른 호스트에서 접근할 수 있도록 서버에 네트워크 브리지를 설정해야 합니다.

이를 위해 bridge-utils 패키지를 설치합니다…

apt-get install bridge-utils

… 그리고 브리지를 구성합니다. /etc/network/interfaces를 엽니다:

vi /etc/network/interfaces

수정 전, 제 파일은 다음과 같습니다:

| # 이 파일은 시스템에서 사용 가능한 네트워크 인터페이스와 이를 활성화하는 방법을 설명합니다. 더 많은 정보는 interfaces(5)를 참조하십시오. # 루프백 네트워크 인터페이스 auto lo iface lo inet loopback # 기본 네트워크 인터페이스 auto eth0 iface eth0 inet static address 192.168.0.100 netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.255 gateway 192.168.0.1 dns-nameservers 8.8.8.8 8.8.4.4 |

저는 다음과 같이 변경합니다:

| # 이 파일은 시스템에서 사용 가능한 네트워크 인터페이스와 이를 활성화하는 방법을 설명합니다. 더 많은 정보는 interfaces(5)를 참조하십시오. # 루프백 네트워크 인터페이스 auto lo iface lo inet loopback # 기본 네트워크 인터페이스 auto eth0 iface eth0 inet manual auto br0 iface br0 inet static address 192.168.0.100 network 192.168.0.0 netmask 255.255.255.0 broadcast 192.168.0.255 gateway 192.168.0.1 dns-nameservers 8.8.8.8 8.8.4.4 bridge_ports eth0 bridge_fd 9 bridge_hello 2 bridge_maxage 12 bridge_stp off |

(네트워크에 맞는 올바른 설정을 사용해야 합니다!)

네트워크를 재시작합니다…

/etc/init.d/networking restart

… 그리고 실행합니다:

ifconfig

이제 네트워크 브리지(br0)가 표시되어야 합니다:

root@server1:~# ifconfig  
br0       Link encap:Ethernet  HWaddr 00:1e:90:f3:f0:02  
          inet addr:192.168.0.100  Bcast:192.168.0.255  Mask:255.255.255.0  
          inet6 addr: fe80::21e:90ff:fef3:f002/64 Scope:Link  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1  
          RX packets:29 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:29 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:0  
          RX bytes:1934 (1.9 KB)  TX bytes:2844 (2.8 KB)  
  
eth0      Link encap:Ethernet  HWaddr 00:1e:90:f3:f0:02  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1  
          RX packets:44613 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:23445 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:1000  
          RX bytes:63663064 (63.6 MB)  TX bytes:1792940 (1.7 MB)  
          Interrupt:41 Base address:0xa000  
  
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0  
          inet6 addr: ::1/128 Scope:Host  
          UP LOOPBACK RUNNING  MTU:16436  Metric:1  
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:0  
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)  
  
virbr0    Link encap:Ethernet  HWaddr 2a:4a:49:13:de:8f  
          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1  
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:0  
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)  
  
root@server1:~#

첫 번째 가상 머신을 시작하기 전에 시스템을 재부팅하는 것이 좋습니다:

reboot

이 작업을 수행하지 않으면 /var/log/libvirt/qemu/ 디렉토리의 가상 머신 로그에서 open /dev/kvm: Permission denied와 같은 오류가 발생할 수 있습니다.

3 이미지 기반 VM 생성하기

이제 첫 번째 VM - 이미지 기반 VM을 생성할 수 있습니다(트래픽이 많고 많은 읽기 및 쓰기 작업이 예상되는 경우, 6장에서 설명하는 대로 LVM 기반 VM을 사용하는 것이 좋습니다 - 이미지 기반 VM은 하드 디스크 IO에 부담이 큽니다).

저는 가상 머신을 /var/lib/libvirt/images/ 디렉토리에 생성하고 싶습니다(가상 머신은 /root 디렉토리에 생성할 수 없으며 libvirt-qemu 사용자가 해당 디렉토리에서 읽기 권한이 없기 때문입니다).

생성할 각 VM에 대해 새로운 디렉토리를 만들 것입니다. 예를 들어 /var/lib/libvirt/images/vm1, /var/lib/libvirt/images/vm2, /var/lib/libvirt/images/vm3 등으로, 각 VM은 ubuntu-kvm이라는 하위 디렉토리를 가질 것이며, 당연히 /var/lib/libvirt/images/vm1에는 그러한 디렉토리가 하나만 있어야 합니다. 예를 들어 /var/lib/libvirt/images/vm1에 두 번째 VM을 생성하려고 하면 ubuntu-kvm already exists라는 오류 메시지가 표시됩니다(단, –dest=DESTDIR 인수로 vmbuilder를 실행하지 않는 한).

root@server1:/var/lib/libvirt/images/vm1# vmbuilder kvm ubuntu -c vm2.cfg  
2009-05-07 16:32:44,185 INFO     Cleaning up  
ubuntu-kvm already exists  
root@server1:/var/lib/libvirt/images/vm1#

우리는 vmbuilder 도구를 사용하여 VM을 생성할 것입니다. (여기에서 vmbuilder에 대해 더 알아볼 수 있습니다.) vmbuilder는 가상 머신을 생성하기 위해 템플릿을 사용합니다. 이 템플릿은 /etc/vmbuilder/libvirt/ 디렉토리에 있습니다. 먼저 복사본을 만듭니다:

mkdir -p /var/lib/libvirt/images/vm1/mytemplates/libvirt  
cp /etc/vmbuilder/libvirt/* /var/lib/libvirt/images/vm1/mytemplates/libvirt/

이제 VM의 파티셔닝으로 넘어갑니다. vmbuilder.partition이라는 파일을 만듭니다…

vi /var/lib/libvirt/images/vm1/vmbuilder.partition

… 그리고 원하는 파티션을 다음과 같이 정의합니다:

| root 8000 swap 4000 --- /var 20000 |

이것은 8000MB 크기의 루트 파티션(/), 4000MB의 스왑 파티션, 20000MB의 /var 파티션을 정의합니다. — 줄은 다음 파티션(/var)이 별도의 디스크 이미지에 있다는 것을 의미합니다(즉, 이는 루트와 스왑을 위한 하나의 디스크 이미지와 /var를 위한 또 하나의 디스크 이미지를 생성합니다). 물론 원하는 대로 파티션을 정의할 수 있습니다(루트와 스왑을 정의하는 한), 그리고 물론 하나의 디스크 이미지에 있을 수 있습니다 - 이것은 단지 예시입니다.

저는 VM에 openssh-server를 설치하고 싶습니다. 각 VM이 고유한 OpenSSH 키를 받도록 하려면 VM을 생성할 때 openssh-server를 설치할 수 없습니다. 따라서 VM이 처음 부팅될 때 실행될 boot.sh라는 스크립트를 만듭니다. 이 스크립트는 openssh-server(고유한 키와 함께)를 설치하고 사용자가 처음 로그인할 때 비밀번호를 변경하도록 강제합니다(저는 VM의 기본 사용자 이름으로 administrator를 사용하고 기본 비밀번호로 howtoforge를 사용할 것입니다):

vi /var/lib/libvirt/images/vm1/boot.sh

| # 이 스크립트는 가상 머신이 처음 부팅될 때 실행됩니다. # 루트로 실행됩니다. # 사용자 계정 만료 passwd -e administrator # openssh-server 설치 apt-get update apt-get install -qqy --force-yes openssh-server |

사용자 이름 administrator를 기본 로그인 이름으로 바꾸는 것을 잊지 마세요.

(여기에서 더 많은 정보를 찾을 수 있습니다: https://help.ubuntu.com/community/JeOSVMBuilder#First%20boot)

(여기에서 설명한 대로 “첫 로그인” 스크립트를 정의할 수도 있습니다: https://help.ubuntu.com/community/JeOSVMBuilder#First%20login)

이제 다음을 살펴보세요:

vmbuilder kvm ubuntu --help

사용 가능한 옵션에 대해 알아보세요.

첫 번째 VM인 vm1을 생성하기 위해 VM 디렉토리로 이동합니다…

cd /var/lib/libvirt/images/vm1/

… 그리고 vmbuilder를 실행합니다. 예를 들어 다음과 같이 실행합니다:

vmbuilder kvm ubuntu --suite=precise --flavour=virtual --arch=amd64 --mirror=http://de.archive.ubuntu.com/ubuntu -o --libvirt=qemu:///system --ip=192.168.0.101 --gw=192.168.0.1 --part=vmbuilder.partition --templates=mytemplates --user=administrator --name=Administrator --pass=howtoforge --addpkg=vim-nox --addpkg=unattended-upgrades --addpkg=acpid --firstboot=/var/lib/libvirt/images/vm1/boot.sh --mem=256 --hostname=vm1 --bridge=br0

대부분의 옵션은 자명합니다. –part는 파티셔닝 세부정보가 포함된 파일을 지정하며, 이는 작업 디렉토리에 상대적입니다(그래서 vmbuilder를 실행하기 전에 VM 디렉토리로 이동해야 했습니다). –templates는 템플릿 파일이 있는 디렉토리를 지정합니다(다시 작업 디렉토리에 상대적입니다). –firstboot는 첫 부팅 스크립트를 지정합니다. –libvirt=qemu:///system은 KVM에 이 VM을 사용 가능한 가상 머신 목록에 추가하도록 지시합니다. –addpkg는 VM 생성 중 설치할 Ubuntu 패키지를 지정할 수 있습니다(위에서 openssh-server를 목록에 추가하지 말고 첫 부팅 스크립트를 대신 사용해야 하는 이유를 참조하십시오). –bridge는 브리지를 설정합니다. 2장에서 브리지 br0를 생성했으므로 여기에서 해당 브리지를 지정합니다.

–mirror 줄에서는 –mirror에 공식 Ubuntu 저장소를 지정할 수 있습니다. 예를 들어 http://de.archive.ubuntu.com/ubuntu. –mirror를 생략하면 기본 Ubuntu 저장소(http://archive.ubuntu.com/ubuntu)가 사용됩니다.

–ip 스위치에 IP 주소를 지정하면 –gw 스위치를 사용하여 올바른 게이트웨이 IP도 지정해야 합니다(그렇지 않으면 vmbuilder는 네트워크에서 첫 번째 유효한 주소로 가정할 수 있으며 이는 올바르지 않을 수 있습니다). 일반적으로 게이트웨이 IP는 /etc/network/interfaces에서 사용하는 것과 동일합니다(2장 참조).

빌드 프로세스는 몇 분 정도 걸릴 수 있습니다.

그 후, /etc/libvirt/qemu/에서 VM에 대한 XML 구성 파일을 찾을 수 있습니다(=> /etc/libvirt/qemu/vm1.xml):

ls -l /etc/libvirt/qemu/
root@server1:/var/lib/libvirt/images/vm1# ls -l /etc/libvirt/qemu/  
total 8  
drwxr-xr-x 3 root root 4096 May 21 13:00 networks  
-rw------- 1 root root 2082 May 21 13:15 vm1.xml  
root@server1:/var/lib/libvirt/images/vm1#

디스크 이미지는 VM 디렉토리의 ubuntu-kvm/ 하위 디렉토리에 있습니다:

ls -l /var/lib/libvirt/images/vm1/ubuntu-kvm/
root@server1:/var/lib/libvirt/images/vm1# ls -l /var/lib/libvirt/images/vm1/ubuntu-kvm/  
total 604312  
-rw-r--r-- 1 root root 324337664 May 21 13:14 tmpE4IiRv.qcow2  
-rw-r--r-- 1 root root 294715392 May 21 13:15 tmpxvSVOT.qcow2  
root@server1:/var/lib/libvirt/images/vm1#
Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.