가상머신 (VM)

이번 포스트는 글이 많으니 참고하자.
내 컴퓨터가 윈도우 나 맥 혹은 리눅스인데 간혹 다른 운영체제를 필요로 할 때가 있다. 그럴 때 사용하는 것이 바로 가상머신이다. 가상머신 이름처럼 내 컴퓨터 위에 가상에서 OS를 실행하여 원하던 운영체제를 사용할 수 있게 해주는것이다.
대표적으로는 VMware, VirtualBox, Hyper-V 등이 있지만 오늘은 QEMU 에 대해서 알아보자.
QEMU

QEMU는 한마디로 말하자면 “컴퓨터를 흉내내는 카멜레온” 같은 녀석이다. 컴퓨터의 핵심 부품인 CPU, 메모리, 하드 디스크, 네트워크 카드 등을 전부 소프트웨어로 흉내 내어, 컴퓨터 안에 또 다른 가상의 컴퓨터를 만들고 실행할 수 있는 매우 강력한 프로그램이며, 심지어 오픈소스(무료) 이다.
QEMU에서는 두 가지의 핵심 작동 모드가 있다.
-
시스템 전체 에뮬레이션 (QEMU의 가장 근본적인 기능):
- QEMU가 가상 컴퓨터의 모든 부품, 특히 CPU까지 100% 소프트웨어로 흉내 낸다. 게스트 OS가 보내는 CPU 명령어를 하나하나 번역해서 호스트 CPU가 알아들을 수 있는 명령어로 바꿔준다.
- 이 때문에 주로 서로 다른 종류의 CPU를 가진 시스템을 실행할 때 사용한다. 예를들어 인텔(x86) CPU가 탑재된 윈도우 PC에서 라즈베리파이의 OS(ARM CPU 기반)를 실행할 수 있다.
- 허나 모든 명령어를 실시간으로 번역해야 하므로 성능이 매우 느린 단점이 있다.
-
가상화 -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
가상머신 만들기

초기에는 저기에 그냥 QEMU/KVM 이라고만 있을것이다. 이제 칼리 리눅스를 설치하고 가상머신을 만들어보겠다.
왼쪽 상단에 위치한 OPEN 옆에 빛나는 모니터를 클릭해보자.

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

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

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

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

마지막으로 확인하고 완료 누르면 된다.
이후 선택해서 OPEN 누르고 실행버튼을 클릭한 뒤, Kali linux를 초기 설치를 완료한다면

아주 나이스하게 잘 실행된다. 이 포스트는 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 *** -> model: virtio, 3D acceleration: true

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