가상화 · 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 su2 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#새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.