avatar JK Park
Virtualization
Contents

qemu-kvm

보통 가상머신은 VMware나 Vitual-Box를 떠올리지만, 리눅스의 대표적인 가상 머신은 QEMU-KVM 이다. QEMUKVM은 각각 Hypevisor 중 하나인데, 둘의 장점을 합쳐 사용하는 것이 QEMU-KVM이다.

이 둘의 개념을 설명하려면 하이퍼바이저는 무엇인지, 전가상화와 반가상화는 무엇인지, 에뮬레이션과 시뮬레이션의 차이는 무엇인지 등 알아야 할 지식이 끝이 없기 때문에 자세한 설명은 생략하고 QEMUKVM을 같이 쓰는지 이유만 간단히 설명한다.

먼저 에뮬레이션이란, 가상화에 필요한 하드웨어를 소프트웨어적으로 구현하여 가상머신에게 제공하는 것이다. QEMU는 에뮬레이터이다보니 동작에 필요한 하드웨어를 독립적으로 생성하기 때문에 성능이 떨어진다.

반면 시뮬레이터인 KVM은 호스트 머신에서 제공하는 하드웨어를 그대로 쓰기 때문에 에뮬레이터에 비해 상대적으로 성능이 좋다. 하지만 가상화에 필요한 하드웨어가 없다면 시뮬레이션에 제약이 생긴다.

이러한 시뮬레이터와 에뮬레이터의 이점을 합쳐 QEMU-KVM는 호스트와 게스트가 동일한 아키텍처를 사용하면 KVM을 통해 하드웨어를 가속화 하고 KVM에서 제공하지 못하는 하드웨어들은 QEMU에 의해 에뮬레이션하도록 한다.

KVM이 가능한지 확인

$ kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used

설치

$ sudo apt install qemu-kvm

libvirt

libvirt는 가상머신 스택의 핵심이다. VM을 만들고, 지우고 관련 네트워크를 관리하는 등 다양한 서비스를 libvirt-daemon이 수행하게 된다.

virtinst는 가상머신 설치할 때 쓰인다.

$ sudo apt install libvirt-daemon-system virtinst

check VMs

virshlibvirt의 UI이다.

$ sudo virsh list --all
 Id    Name                           State
----------------------------------------------------

아직 VM을 생성한 적이 없으므로 빈 리스트가 출력된다.

$ sudo virsh net-list --all
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     yes           yes

default가 안뜬다면 virbr0을 재시작해본다.

$ sudo ifconfig virbr0 down
$ sudo ifconfig virbr0 up

Create VM

Windows 10용 VM 생성 방법이다.

$ sudo virt-install \
--virt-type kvm \
--name win10 \
--vcpus 2 \
--cpu host-passthrough,cache.mode=passthrough \
--hvm \
--memory 2048 \
--os-variant win10 \
--cdrom /home/jkpark/workspace/Win10.iso \
--disk path=/home/jkpark/public/vm-win10.qcow2,format=qcow2,size=40 \
--graphics vnc,port=5900,listen=0.0.0.0
  • --cpu host-passthrough,cache.mode=passthrough : 가상머신이 실제 CPU정보를 그대로 사용
  • --os-variant : win10, ubuntu20.04 등 설치하는 OS 종류
  • --graphics vnc,port=5900,listen=0.0.0.0 : VNC를 통해 Display를 접근할 것이기 때문에 VNC 방화벽 포트 5900번을 열어준다. VNC는 보안에 취약하므로, -s x.x.x.x와 같이 접속할 source를 지정하여 보안을 강화한다.
    $ sudo iptables -A INPUT -s x.x.x.x -p tcp -m tcp --dport 5900 -j ACCEPT
    $ sudo netfilter-persistent save
    

vm이 할당이 되면 virsh list 명령어를 통해 VM의 상태를 볼 수 있다.

$ virsh list
 Id    Name                           State
----------------------------------------------------
 7     win10                          running

VM마다 ID가 있다. 이 ID로도 명령어를 내릴 수 있다.

$ virsh shutdown 7
Domain 7 is being shutdown
$ virsh list
 Id    Name                           State
----------------------------------------------------
 7     win10                          in shutdown

접속

VNC viewer for Chrome 을 통해 접속한다.

https://chrome.google.com/webstore/detail/vnc%C2%AE-viewer-for-google-ch/iabmpiboiopbgfabjmgeedhcmjenhbla

주요 virsh 명령어

virsh list --all

virsh start <domain>

virsh shutdown  <domain>

virsh undefine  <domain>
디스크는 삭제되지 않으므로 직접 삭제해야 한다.

virsh autostart  <domain>
호스트 부팅 시 자동 시작

고정 IP

libvirt는 기본 네트워크 default는 192.168.122.xxx 대역을 쓰고 있다.

$ virsh net-dumpxml default
<network>
  <name>default</name>
  <uuid>84fffe88-e89a-4da3-9e47-c705bb76d404</uuid>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:90:85:c3'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'/>
    </dhcp>
  </ip>
</network>

이 기본 네트워크가 VM에게 고정 IP를 내려주도록 설정한다.

$ virsh dumpxml <domain> | grep 'mac address'
      <mac address='52:54:00:c2:aa:53'/>

$ virsh net-update default add ip-dhcp-host "<host mac='52:54:00:c2:aa:53' name='<domain>' ip='192.168.122.2' />" --live --config
Updated network default persistent config and live state

확인

$ virsh net-dumpxml default
<network>
  <name>default</name>
  <uuid>e7dd4a92-a610-4e34-979f-acc36ac3a9a1</uuid>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:bd:ba:d4'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'/>
      <host mac='52:54:00:c2:aa:53' name='win10' ip='192.168.122.2'/>
    </dhcp>
  </ip>
</network>

설정 후 VM을 재시작한다.

$ virsh shutdown win10
$ virsh start win10

우분투 서버 부팅 시 자동으로 시작되도록 설정하려면 아래 명령어를 입력한다.

$ virsh autostart win10

[참고] 해제

$ virsh autostart win10 --disable

Remove VM

win10 예:

$ virsh shutdown win10
$ virsh destroy win10
$ virsh undefine win10
$ sudo rm /var/lib/libvirt/images/vm-win10.qcow2
$ sudo virsh net-update default delete ip-dhcp-host "<host mac='52:54:00:c2:aa:53' name='win10' ip='192.168.122.2' />" --live --config