[리눅스 가상화] CLI로 QCOW2 기반 윈도우 & 리눅스 가상머신 이미지 생성하기

blog post 

 

이번 포스팅에서는 리눅스(CentOS7 기준)에서 QCOW2 기반의 가상머신 이미지를 생성해 보도록 하겠습니다. 저는 GUI를 사용하지 않고 CLI를 기반으로 KVM 가상머신을 생성해 보겠습니다.

 

 

1. 기본 패키지 설치

 

 

우선 이미지 생성에 앞서 필요한 패키지들을 설치합니다.

 

[root@localhost ~]# yum -y install qemu-kvm libvirt virt-install bridge-utils

 

 

2. ISO 파일 다운로드

 

 

리눅스 설치를 위한 iso 파일을 내려받습니다.

 

[root@localhost tmp]# wget http://mirror.kakao.com/centos/8.1.1911/isos/x86_64/CentOS-8.1.1911-x86_64-dvd1.iso
--2020-02-13 19:42:27--  http://mirror.kakao.com/centos/8.1.1911/isos/x86_64/CentOS-8.1.1911-x86_64-dvd1.iso
Resolving mirror.kakao.com (mirror.kakao.com)... 113.29.189.165
Connecting to mirror.kakao.com (mirror.kakao.com)|113.29.189.165|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7554990080 (7.0G) [application/octet-stream]
Saving to: ‘CentOS-8.1.1911-x86_64-dvd1.iso’

 2% [======>                             ] 219,158,090 9.48MB/s  eta 12m 18s

 

윈도우10 은 사이트에서 직접 내려 받은 뒤 ftp 로 리눅스 서버에 파일을 옮깁니다.

https://www.microsoft.com/ko-kr/software-download/windows10ISO

 

 

* 참고: 윈도우의 경우, KVM 인스턴스 생성 과정에서 qcow2 타입의 디스크를 인식하지 못합니다. virtio 드라이버를 사용하여 디스크를 인식할 수 있도록 아래 경로에서 드라이버를 내려받습니다.

 

[root@localhost tmp]# wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.171-1/virtio-win-0.1.171.iso
--2020-02-13 20:52:32--  https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.171-1/virtio-win-0.1.171.iso
Resolving fedorapeople.org (fedorapeople.org)... 152.19.134.199, 2610:28:3090:3001:5054:ff:fea7:9474
Connecting to fedorapeople.org (fedorapeople.org)|152.19.134.199|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 394569728 (376M) [application/octet-stream]
Saving to: ‘virtio-win-0.1.171.iso’

 0% [                                                                  ] 1,368,064   58.1KB/s  eta 3h 0m  

 

 

3. 이미지 디스크 생성

 

다음과 같이 qemu-img 명령을 사용하여 비어있는 이미지 디스크를 생성합니다. 이 때 QCOW2, RAW 포맷 등 몇 가지 디스크 타입이 있지만 이미지 포맷에 따라 디스크 저장 방식이 다릅니다. 저는 QCOW2 타입으로 윈도우10과 CentOS8를 위한 디스크를 각각 생성하도록 하겠습니다.

 

[root@localhost tmp]# qemu-img create -f qcow2 windows_10_x64.qcow2 30G
Formatting 'windows_10_x64.qcow2', fmt=qcow2 size=32212254720 cluster_size=65536 lazy_refcounts=off refcount_bits=16

[root@localhost tmp]# qemu-img create -f qcow2 CentOS8.qcow2 30G
Formatting 'CentOS8.qcow2', fmt=qcow2 size=32212254720 cluster_size=65536 lazy_refcounts=off refcount_bits=16

 

 

 

4. 리눅스 가상머신 생성

 

 

아래와 같이 리눅스 혹은 윈도우10 가상머신을 생성합니다.

 

  • CentOS8
[root@localhost tmp]# virt-install \
>     --name=centos8 \
>     --ram=4096 \
>     --cpu=host \
>     --vcpus=1 \
>     --os-type=windows \
>     --os-variant=win10 \
>     --disk path=CentOS8.qcow2,format=qcow2,bus=virtio \
>     --disk CentOS-8.1.1911-x86_64-dvd1.iso,device=cdrom,bus=ide \
>     --network network=default,model=virtio \
>     --graphics vnc,listen=0.0.0.0

 

  • 윈도우10. 윈도우의 경우, virtio 드라이버를 디스크로 함께 추가해줍니다. (password 넣었음: "test". vnc 연결시 사용)
[root@localhost tmp]# virt-install \
    --name=windows10 \
    --ram=4096 \
    --cpu=host \
    --vcpus=1 \
    --os-type=windows \
    --os-variant=win10 \
    --disk path=windows_10_x64.qcow2,format=qcow2,bus=virtio \
    --disk Win10_1909_Korean_x64.iso,device=cdrom,bus=ide \
    --disk virtio-win-0.1.171.iso,device=cdrom,bus=ide \
    --network network=default,model=virtio \
    --graphics vnc,password=test,listen=0.0.0.0

 

위의 명령을 실행하면 다음과 같은 메시지가 출력됩니다. 이제 가상머신이 실행중인 상태이고, ctrl+c 로 빠져나와도 되고 그냥 넘어가도 됩니다.

 

WARNING  그래픽 콘솔에 연결할 수 없습니다. virt-viewer가 설치되지 않았습니다. 'virt-viewer' 패키지를 설치하십시오.
WARNING  게스트의 콘솔이 시작되지 않았으므로 --wait -1이 기본값이 됩니다.

설치 시작 중...

도메인 설치가 아직 진행 중입니다. 설치가 완료될 때까지  남았습니다.

(ctrl+c 입력)

 

 

virsh 명령으로 방금 생성한 인스턴스가 동작 중임을 확인할 수 있습니다.

 

[root@localhost ~]# virsh list
 Id    이름                         상태
----------------------------------------------------
 30    centos8                        실행중
 32    windows10                      실행중

 

 



 

5. VNC 연결

 

 

KVM/QEMU 하이퍼바이저는 우리가 흔히 사용하는 VirtualBox나 VMWare와 같이 자체적으로 GUI 뷰어를 제공하지 않습니다. KVM/QEMU 기반의 가상머신은 libvirt라고 하는 가상머신 컨트롤 도구를 통해 동작하는데 virsh가 대표적인 libvirt 도구 입니다.

 

따라서 KVM 가상머신의 화면을 보기 위해서 도구가 필요합니다. 앞서 우리는 virt-install 옵션으로 화면을 보기위해 graphic 옵션으로 vnc를 지정해줬습니다. 이 vnc를 통해 가상머신에 원격으로 접근할 수 있습니다.

 

아래에서 vnc viewer를 PC에 내려받습니다. (다른 vnc 툴을 사용해도 무관합니다)

https://www.realvnc.com/en/connect/download/viewer/

 

먼저 생성한 리눅스에 다음과 같이 주소를 입력하여 접속해 봅니다. vnc의 기본 포트는 5900입니다.

 

  • (가상머신을 실행중인)리눅스 호스트 ip:5900

 

continue를 입력하면 다음과 같이 OS 설치 화면을 볼 수 있습니다.

다음으로 윈도우에도 연결해 보겠습니다. 저처럼 두 개의 가상머신을 사용하는 경우, vnc 포트 번호는 5901이 됩니다. 이런식으로 가상머신이 늘어나면 포트넘버도 1씩 증가합니다. 물론 리눅스를 생성하지 않고 윈도우만 생성한 경우에는 5900이 되겠죠.

 

 

6. OS 설치

 

이제 설치를 시작합니다. 리눅스는 설치 과정에서 문제 없이 무난하게 설치가 진행됩니다. (스샷 생략)

 

* 참고

1. 설치 과정은 자세히 다루지 않겠습니다.

2. 네트워크 설정은 현재 정상적으로 진행되지 않을 수 있습니다. 본 포스팅은 운영체제가 설치된 가상머신 이미지를 생성하는 것이 목적이므로 네트워크 구성은 중요하지 않습니다. KVM 기반 인스턴스의 네트워크 구성은 추후 별도로 포스팅하도록 하겠습니다.

 

윈도우 설치 과정에서는 리눅스와 달리 다음과 같이 어떠한 디스크도 탐지되지 않는 것을 볼 수 있습니다.

이때 "드라이버 로드" 후 "찾아보기"를 통해 디렉토리를 탐색해봅니다.

E:드라이브에 virtio 드라이버가 마운트 된 것을 확인할 수 있습니다. 왜냐하면 우리는 앞서 virt-install 단계에서 virtio 드라이버를 디스크로 넣어줬기 때문입니다. 이제 E:\viostor\w10\amd64 를 선택하고 확인을 클릭합니다.

 Red Hat의 Virtio SCSI 컨트롤러가 잡힙니다. 이제 "다음"을 클릭하여 설치를 진행하면 됩니다.

OS 설치가 완료 되면 다음과 같이 vnc 연결이 끊길 수 있습니다.

 

[root@localhost ~]# virsh list --all
 Id    이름                         상태
----------------------------------------------------
 -     centos8                        종료
 -     windows10                      종료

 

 



 다시 virsh 명령을 통해 인스턴스를 시작해 줍니다.

 

[root@localhost ~]# virsh start centos8                                   
도메인 centos8가 시작됨

[root@localhost ~]# virsh start windows10
도메인 windows10가 시작됨

 

 정상적으로 설치 후 해당 디스크(qcow2)로 부팅 되는 것을 확인할 수 있습니다.

 

 

윈도우의 경우 초기 설정과정을 마칩니다.

 

 

 

7. [윈도우] 추가 드라이버 설치 및 기타 설정

 

 

윈도우 이미지를 생성할 경우, 사용자 생성까지 마친 다음 장치 드라이버를 설치합니다.

 

마운트한 virtio를 사용하여 다음과 같이 내PC-> 장치관리자-> 기타 장치-> Ethernet 컨트롤러, PCI 장치 등을 업데이트 해줍니다. virtio 디스크에서 검색하면 아래와 같이 드라이버를 찾을 수 있습니다.

 

추가로 본인이 윈도우에 저장해야 하거나 설정해야 하는 것들이 있으면 진행합니다.

 

 

8. 이미지 압축 및 사이즈 축소

 

 

우리가 앞서 2번에서 생성한 qcow2 이미지는 이제 운영체제가 완전히 설치된 상태의 디스크입니다. 이 디스크를 바로 가져다 다른 KVM/QEMU 기반의 인스턴스로 복사 생성하거나, 오픈스택과 같은 클라우드 플랫폼에 업로드하여 사용할 수 있습니다.

 

하지만 보시다시피 바로 배포해서 쓰기에는 다소 이미지 사이즈가 큽니다.

 

[root@localhost ~]# du -hs windows_10_x64.qcow2 CentOS8.qcow2
9.7G    windows_10_x64.qcow2
4.5G    CentOS8.qcow2

 

배포 단계에서 조금이라도 소요시간을 줄이기 위해 이미지를 압축해서 사이즈를 좀 더 줄여보겠습니다.

 

 

 

우선 실행중인 vm을 종료합니다.

 

[root@localhost ~]# virsh shutdown centos8
도메인 centos8가 종료됨

[root@localhost ~]# virsh shutdown windows10
도메인 windows10가 종료됨

 

혹시 모를 불상사를 방지하기 위해 백업 이미지를 생성합니다.

 

[root@localhost ~]# cp windows_10_x64.qcow2 windows_10.qcow2_backup
[root@localhost ~]# cp CentOS8.qcow2 CentOS8.qcow2_backup

 

qemu-img 명령을 사용하여 다음과 같이 압축하여 이미지 사이즈를 줄입니다.

 

* 참고

아래 명령에서 -c 옵션이 압축을 의미합니다. -c 여부에 따라 다음과 같은 차이가 있음을 유의하시기 바랍니다.

-c 옵션이 있는 경우: 이미지 사이즈 감소율이 큼. 하지만 압축 해제단계에서 시간이 다소 증가 (인스턴스 생성단계에서 해제)

-c 옵션이 없는 경우: 이미지 사이즈 감소율이 떨어짐. 하지만 인스턴스 생성 단계에서 압축된 이미지에 비해 상대적으로 시간이 짧음

 

본인의 선호에 따라 -c 옵션을 선택적으로 사용하시기 바랍니다. (주의: 아래 과정은 기존 이미지를 덮어 씀)

 

[root@localhost ~]# qemu-img convert -O qcow2 -c windows_10.qcow2_backup windows_10_x64.qcow2
[root@localhost ~]# qemu-img convert -O qcow2 -c CentOS8.qcow2_backup CentOS8.qcow2

 

-c 옵션을 사용하여 압축된 이미지 사이즈를 확인해보면 다음과 같이 기존 대비 50프로 가량 감소된 것을 확인할 수 있습니다.

 

[root@localhost ~]# du -hs windows_10_x64.qcow2 CentOS8.qcow2    
4.4G    windows_10_x64.qcow2
1.9G    CentOS8.qcow2

 

 

9. 이미지 복사 생성 테스트

 

 

그럼 이제 마지막으로 압축까지 완료한 이미지를 통해 인스턴스를 복사 생성할 수 있는지 테스트해 보도록 하겠습니다. 

CentOS는 넘어가고 윈도우만 테스트해 보도록 하겠습니다. 이 단계는 리눅스나 윈도우나 큰 차이가 없습니다.

 

다음과 같이 virt-install을 통해 윈도우 인스턴스를 생성해 보겠습니다.

 

[root@localhost ~]# virt-install \
    --name=windows10_2 \
    --ram=4096 \
    --cpu=host \
    --vcpus=1 \
    --os-type=windows \
    --os-variant=win10 \
    --disk path=windows_10_x64.qcow2,device=disk,bus=virtio,format=qcow2 \
    --network network=default,model=virtio \
    --graphics vnc,password=test,listen=0.0.0.0 \
    --import

 

* 참고

저 처럼 앞서 windows_10_x64.qcow2 압축 과정에서 기존 파일을 덮어써서 앞축한 경우, 이미 해당 이미지는 기존 windows10에서 사용중입니다. 따라서 아래와 같이 기존 windows10 인스턴스가 사용중이라는 에러메시지가 출력됩니다.

 

ERROR    Disk /tmp/windows_10_x64.qcow2 is already in use by other guests ['windows10']. (--check path_in_use=off 또는 --check all=off를 사용하여 대체)

 

이 경우에는 qcow2 파일을 복사하여 사본을 사용하거나, 혹은 아래와 같이 기존 windows10 인스턴스를 제거하면 됩니다. 

[root@Compute0 tmp]# virsh undefine windows10
도메인 windows10는 정의되지 않음

 

저는 앞서 기존 windows10 인스턴스를 제거(undefine)했습니다. 이후 새로 복사 생성한 windows10_2 인스턴스를 통해 다음과 같이 OS 설치 없이 가상머신이 정상적으로 부팅되는 것을 확인할 수 있습니다.

 

 

이상으로 가상머신을 생성하여 OS를 설치하고 이미지 사이즈를 줄이는 과정까지 알아보았습니다. 위에서 8,9번 과정은 필수 과정은 아니므로 본인 선호에 따라 생략하셔도 됩니다. 또한 이러한 CLI 환경보다 GUI 환경을 선호하는 경우, Virt-manager를 통해 VirtualBox와 비슷한 과정으로 KVM 가상머신을 생성할 수 있습니다.

TAGS.

Comments