가상화는 정말 영리한 기술입니다. 컴퓨터 안에 또 다른 컴퓨터를 만드는 셈으로, 무궁무진한 가능성과 활용 사례를 열어줍니다. 하지만 딱 하나의 예외가 있습니다. 바로 게이밍입니다. 어떤 이유로든 가상 머신을 운영하는 컴퓨터 덕후에게 물어보면, 십중팔구 모든 가상화 소프트웨어의 공통적인 큰 약점을 지적할 겁니다. 바로 충분히 발전하지 못했거나 강력하지 못한 그래픽 스택입니다.
실제로 가상 머신 안에서 게스트 운영체제를 구동하면, 호스트의 기본 성능에는 한참 못 미치는 수준의 2D·3D 기능 등 그래픽 가속 제약을 받는 경우가 허다합니다. 가상화가 여러 문제를 해결해 줄 거라 기대하더라도, 게이밍만큼은 기대하기 어렵습니다. Virgil 3D는 가상화 소프트웨어에 3D 기능을 불러오고, 장차 호스트와 동등한 성능을 제공하는 것을 목표로 하는 프로젝트입니다. 이 솔루션을 구현한 것이 바로 QEMU Virgil로, QEMU/KVM 기반 가상 머신에서 SDL2와 Virgil 3D를 활성화할 수 있게 해 줍니다. 흥미롭게 들리시죠? 지금부터 자세히 살펴보겠습니다.

설정 방법
이런 작업의 가장 큰 단점은 절차가 꽤 복잡하고, 모든 것을 설정하고 돌아가게 만드는 데 시간이 걸린다는 점입니다. 다행히 Virgil 3D는 기존 snap 패키지를 활용하면 수동 컴파일 같은 번거로운 과정 없이 간편하게 시작할 수 있습니다. 참고로 저도 snap 프로젝트에 관여하고 있는 사람 중 하나이니, 편향이 느껴진다면 과감히 뒤로 물러서셔도 좋습니다!
sudo snap install qemu-virgil
sudo snap connect qemu-virgil:kvm
가상 머신 구동하기
이제 3D 가속이 활성화된 가상 머신을 시작하는 (예시) 명령어를 살펴보겠습니다. 다소 어렵게 느껴진다면, 몇 년 전에 작성한 KVM 입문 가이드를 참고해 보시길 권합니다. 거기서 다룬 내용 대부분은 지금도 유효합니다.
qemu-virgil -enable-kvm -m 4096 -device virtio-vga,virgl=on -display sdl,gl=on -netdev user,id=ethernet.0,hostfwd=tcp::10022-:22 -device rtl8139,netdev=ethernet.0 -soundhw ac97 kubuntu.img -boot d -cdrom kubuntu.iso
각 옵션의 의미는?
명령어에 포함된 옵션들을 하나씩 살펴보겠습니다.
- -enable-kvm - KVM의 완전한 가상화 지원을 사용합니다. 당연히 CPU에 필요한 확장 기능이 존재하고 BIOS에서 활성화되어 있어야 합니다.
- -m 4096 - 가상 머신 메모리를 4GB로 설정합니다.
- -device ... - 디바이스 드라이버를 추가하는 옵션입니다. 여기서는 virgl을 사용합니다.
- -display ... - 디스플레이 출력에 SDL과 OpenGL 렌더링을 사용하도록 설정합니다.
- -netdev ... - TCP 포트 포워딩이 설정된 네트워크 인터페이스를 구성합니다. 덕분에 호스트의 10022 포트를 통해 SSH로 가상 머신에 접속할 수 있습니다. 네트워크 디바이스는 RTL8139 가상 어댑터를 사용하는데, 이 어댑터는 100Mbps로 제한되므로 필요하다면 e1000을 사용할 수도 있습니다. 관련된 자세한 내용은 KVM 공식 네트워킹 문서를 참고하세요.
- -soundhw - 사운드 카드를 설정합니다.
- kubuntu.img - 가상 하드 디스크 파일 이름입니다. 아직 생성하지 않았다면 dd 명령으로 디스크 이미지(일반 또는 스파스)를 만들거나 qemu-img 명령을 사용하면 됩니다.
- -boot d - 부팅 순서를 지정하는 옵션으로, d는 CD-ROM 우선 부팅을 의미합니다.
- -cdrom kubuntu.iso - kubuntu.iso를 가상 CD 이미지로 사용합니다. 먼저 라이브 세션으로 부팅해 운영체제를 설치한 뒤, 이후 실행부터는 명령어에서 boot와 cdrom 옵션을 제거하면 됩니다.
이 외에도 가상 CPU 개수, 다양한 CPU 모델, 스냅샷, 디스크 캐싱 모드, USB 기능, 여러 메모리 관리 옵션 등 시도해 볼 수 있는 항목이 무수히 많습니다. 하지만 우리의 목표는 KVM 마스터가 되는 것이 아니라 3D를 즐기는 것이니, 다음 단계로 넘어가겠습니다.
하드 디스크 생성
가상 디스크는 다음과 같이 만들 수 있습니다.
qemu-img create -f qcow2 kubuntu.img 20g
가상 머신 시작 및 3D 그래픽 확인
Enter 키를 누르면 마법이 시작됩니다. 가상 머신이 부팅되고, 곧 선택한 게스트 운영체제의 데스크톱 화면을 만나게 됩니다. 이번 테스트에서는 Fedora 32 위에서 Kubuntu 20.04를 구동했습니다. 물론 Windows를 포함해 원하는 어떤 게스트 OS든 사용할 수 있습니다.


3D 가속 활성화 여부는 아래 명령으로 확인할 수 있습니다.
glxinfo | grep "direct rendering"

물론 이것이 모든 3D 렌더링 기능이 구현됐다는 뜻은 아니지만, 분명 훌륭한 출발점입니다. 실제로 제 Kubuntu 가상 머신은 필요한 요소들을 두루 갖추고 상당히 쾌적하게 돌아갔으며, 3D 성능도 탄탄했습니다. 검증을 위해 PassMark 베인인 테스트까지 돌려봤는데, 결과는 만족스러웠습니다.

결론
Virgil은 정말 매력적인 프로젝트입니다. 비교적 단순하고 비용 부담이 적은 솔루션이기 때문입니다. 멀티 GPU 시스템에서 PCI 버스 식별자 등을 활용해 GPU 카드를 호스트와 게스트가 각각 나눠 쓰도록 구성해 게스트에서 네이티브에 가까운 성능을 내는 고급 설정도 있습니다. 하지만 그런 구성은 평범한 덕후의 실력과 예산을 넘어서는 경우가 많습니다. 현실적으로 보통 사람들은 리눅스도, 가상화도 잘 사용하지 않으니까요.
3D 기능이 전혀 없는 상태와 완벽한 3D 환경 사이 어딘가에서, 가상 머신에 그럴듯한 그래픽 성능이 필요하다면 Virgil이 적절한 수준의 기능을 제공해 줄지도 모릅니다. 아직은 틈새 분야이고 개발 진행형이지만, 나름 잘 작동하며 제 테스트 결과 성능도 충분히 쓸 만했습니다. 가상화가 물리 하드웨어를 완전히 대체하는 단계(애초에 가능할지는 모르겠지만)에는 아직 이르지만, Virgil은 분명 올바른 방향으로 나아가는 한 걸음입니다. 직접 사용해 보고 즐겨 보세요. 여기까지입니다.
그럼, 즐거운 컴퓨팅 되세요!