가상머신 (VM)

virtual machine

이번 포스트는 글이 많으니 참고하자.

내 컴퓨터가 윈도우 나 맥 혹은 리눅스인데 간혹 다른 운영체제를 필요로 할 때가 있다. 그럴 때 사용하는 것이 바로 가상머신이다. 가상머신 이름처럼 내 컴퓨터 위에 가상에서 OS를 실행하여 원하던 운영체제를 사용할 수 있게 해주는것이다.

대표적으로는 VMware, VirtualBox, Hyper-V 등이 있지만 오늘은 QEMU 에 대해서 알아보자.




QEMU

qemu

QEMU는 한마디로 말하자면 “컴퓨터를 흉내내는 카멜레온” 같은 녀석이다. 컴퓨터의 핵심 부품인 CPU, 메모리, 하드 디스크, 네트워크 카드 등을 전부 소프트웨어로 흉내 내어, 컴퓨터 안에 또 다른 가상의 컴퓨터를 만들고 실행할 수 있는 매우 강력한 프로그램이며, 심지어 오픈소스(무료) 이다.

QEMU에서는 두 가지의 핵심 작동 모드가 있다.

  1. 시스템 전체 에뮬레이션 (QEMU의 가장 근본적인 기능):

    • QEMU가 가상 컴퓨터의 모든 부품, 특히 CPU까지 100% 소프트웨어로 흉내 낸다. 게스트 OS가 보내는 CPU 명령어를 하나하나 번역해서 호스트 CPU가 알아들을 수 있는 명령어로 바꿔준다.
    • 이 때문에 주로 서로 다른 종류의 CPU를 가진 시스템을 실행할 때 사용한다. 예를들어 인텔(x86) CPU가 탑재된 윈도우 PC에서 라즈베리파이의 OS(ARM CPU 기반)를 실행할 수 있다.
    • 허나 모든 명령어를 실시간으로 번역해야 하므로 성능이 매우 느린 단점이 있다.
  2. 가상화 -KVM과 함께 작동 (우리가 흔히 알고 있는 ‘가상머신’ 기능):

    • QEMU가 CPU를 흉내 내는 것을 멈추고, 대신 리눅스 커널의 KVM(Kernel-based Virtual Machine) 모듈에게 CPU 제어 권한을 넘기고, KVM은 호스트 CPU의 가상화 기능(Intel VT-x, AMD-V)을 이용해 게스트 OS의 명령어를 번역 없이 호스트 CPU에서 직접 실행시킨다.
    • 이건 주로 호스트와 게스트가 동일한 종류의 CPU를 사용할 때 고성능 가상머신을 실행하기 위해 사용한다. 예를들어 인텔(x86) CPU를 사용하는 리눅스 서버에서 윈도우(x86)나 또 다른 리눅스(x86) 가상머신을 실행할 수 있다.
    • 또한 CPU가 직접 명령을 처리하므로 거의 실제 컴퓨터와 맞먹는 네이티브에 가까운 성능을 낸다. 이때 QEMU의 역할은 CPU 외의 나머지 장치(디스크, 네트워크 등)를 흉내 내는 것으로 축소된다.

그래서 QEMU는 그 자체로도 만능 에뮬레이터이지만, 리눅스 커널의 KVM과 결합했을 때 가장 강력하고 빠른 가상화 엔진으로 작동하는 핵심 소프트웨어이다. 그렇기에 리눅스 환경에서 만약 가상머신을 필요로 한다면 큐무는 매우 좋은 선택이 될 것이다.




설치해보자

QEMU에 대해서 설명하느라 길어졌으니 바로 설치해보자. 내 OS(Arch Linux)에서 설치하는것이기 때문에 다른 OS는 설치 도구들을 따로 찾아야한다.

// arch linux
sudo pacman -S qemu qemu-emulators-full virt-manager virt-viewer dnsmasq vde2 bridge-utils openbsd-netcat libvirt
// arch linux
sudo pacman -S qemu qemu-emulators-full virt-manager virt-viewer dnsmasq vde2 bridge-utils openbsd-netcat libvirt

각각 패키지에 대한 설명은 이렇다 (그냥 나중에 궁금하면 알아봐도 된다.):

  • qemu: QEMU 에뮬레이터와 프로세서 가상화를 위한 하드웨어 에뮬레이터. 이는 가상 머신(VM)을 실행하는 데 필요한 핵심 엔진 역할을 한다.
  • qemu-emulators-full: QEMU가 지원하는 모든 CPU 아키텍처(x86, ARM, MIPS 등)에 대한 에뮬레이터를 포함하는 패키지. 이 패키지를 설치하면 다양한 아키텍처의 게스트 운영체제를 실행할 수 있다.
  • libvirt: 가상화 기술(QEMU, KVM 등)을 제어하는 상위 계층의 API, 데몬, 관리 도구. virsh와 같은 명령줄 도구의 핵심이며, 가상 머신, 네트워크, 스토리지를 통합적으로 관리하는 역할을 한다.
  • virt-manager: libvirt를 위한 그래픽 사용자 인터페이스(GUI). 명령어를 직접 입력하지 않고도 가상 머신을 생성하고, 시작, 중지, 관리할 수 있도록 도와준다.
  • virt-viewer: 가상 머신의 화면을 볼 수 있는 클라이언트 프로그램. virt-manager를 통해 실행 중인 가상 머신의 그래픽 콘솔에 접속할 때 사용된다.
  • dnsmasq: DHCP(Dynamic Host Configuration Protocol) 서버와 DNS(Domain Name System) 캐시 기능을 제공하는 경량 네트워크 서비스. libvirt가 게스트 가상 머신에 IP 주소를 할당하고 도메인 이름을 해결하는 데 사용된다.
  • vde2: 가상 분산 이더넷(Virtual Distributed Ethernet)을 구현하는 도구. 여러 가상 머신이나 호스트 간에 가상 네트워크를 구성하는 데 사용된다.
  • bridge-utils: 가상 네트워크 브릿지를 생성하고 관리하는 데 사용되는 유틸리티 모음. virsh가 virbr0과 같은 네트워크 브릿지를 생성할 때 이 패키지의 도구들을 이용한다.
  • openbsd-netcat: 네트워크 연결을 읽고 쓰는 데 사용되는 도구. 가상화 환경에서 디버깅이나 특수한 네트워크 설정을 할 때 필요할 수 있다.

이후 systemctl 로 컴퓨터 킬 때 자동으로 libvirtd를 활성화 해주고 실행하자.

// 컴퓨터 킬 때마다 자동 실행
sudo systemctl enable libvirtd

// 지금 실행하기
sudo systemctl start --now libvirtd
// 컴퓨터 킬 때마다 자동 실행
sudo systemctl enable libvirtd

// 지금 실행하기
sudo systemctl start --now libvirtd

이후 usergroup에 추가해줘야된다.

sudo usermod -aG libvirt $(whoami)

newgrp libvirt

// check after reboot
groups
sudo usermod -aG libvirt $(whoami)

newgrp libvirt

// check after reboot
groups

다음으로 가상 네트워크를 확인하고 실행한다.

sudo EDITOR=nano virsh net-edit default

sudo systemctl restart libvirtd

sudo virsh net-start default

sudo virsh net-autostart default
sudo EDITOR=nano virsh net-edit default

sudo systemctl restart libvirtd

sudo virsh net-start default

sudo virsh net-autostart default

마지막으로 한번 더 체크해본다.

qemu-system-x86_64 --version

// result
QEMU emulator version 10.1.2

sudo virsh net-list --all

// result
 Name      State    Autostart   Persistent
--------------------------------------------
 default   active   yes         yes
qemu-system-x86_64 --version

// result
QEMU emulator version 10.1.2

sudo virsh net-list --all

// result
 Name      State    Autostart   Persistent
--------------------------------------------
 default   active   yes         yes

이로써 초기 세팅은 마쳤다. 이후 virt-manager 명령어로 GUI를 열어보자 (앱 아이콘으로 실행해도 상관없다.)

virt-manager
virt-manager




가상머신 만들기

virt-manager

초기에는 저기에 그냥 QEMU/KVM 이라고만 있을것이다. 이제 칼리 리눅스를 설치하고 가상머신을 만들어보겠다.

kali linux iso download

왼쪽 상단에 위치한 OPEN 옆에 빛나는 모니터를 클릭해보자.

create 1

그러면 이렇게 뜰것이다. 그대로 다음 눌러보자.

create 2

설치했던 ISO 파일을 찾아서 선택하고 다음을 넘기면 된다. 만약 OS 선택이 자동적으로 안됐다면 수기로 Debian 13을 작성하여 선택하자.

create 3

다음 메모리와 CPU를 할당해줘야된다. 나는 8GB 메모리와 8 core CPU를 할당 해주었다. 이 정도면 매우 쾌적한 환경이기에 적당히 할당해주면 된다. (권장 사양은 4GB 메모리, 2 core CPU)

create 4

이후 용량을 선택해야되는데 나는 칼리리눅스 everything 이라는 제일 높은 옵션이기에 100GB로 잡아줬다.

create 5

마지막으로 확인하고 완료 누르면 된다.

이후 선택해서 OPEN 누르고 실행버튼을 클릭한 뒤, Kali linux를 초기 설치를 완료한다면

kali

아주 나이스하게 잘 실행된다. 이 포스트는 QEMU 포스트니까 칼리 리눅스 초기 설치는 각자 알아서 찾아보도록 하자.

추가로 내 컴퓨터는 초기에 마우스가 버벅여서 3D 가속화 세팅을 해서 좀 더 부드럽게 사용할 수 있게 되었으니 세팅해보자. (선택)

sudo pacman -Syu qemu-full

sudo systemctl restart libvirtd

qemu-system-x86_64 -display help | grep spice

// result
spice-app
sudo pacman -Syu qemu-full

sudo systemctl restart libvirtd

qemu-system-x86_64 -display help | grep spice

// result
spice-app

이후 virt-manager를 실행하고 두가지 세팅을 하면 된다.

video setting

video *** -> model: virtio, 3D acceleration: true

display setting

display *** -> type: spice server, listen type: none, openGL: true




끝으로

end

내가 만약 개발자로서 필요하거나 배우고싶은 OS 가 있을 때, 혹은 가상머신 프로그램을 알고싶을 때 공짜로 할 수 있는 QEMU는 좋은 선택이 될 것이다. 추가로 명령어 만으로도 가상머신 생성 및 설정 변경, 목록 확인, 시작 등 다 할 수 있으니 CLI만으로 돌리고 싶다면 따로 찾아보면 된다.