QEMU로 ReactOS를 구동하는 스크린샷 |
공식 홈페이지
1. 개요
QEMU는 Quick EMUlator의 약자로 x86, PowerPC, ARM 등을 지원하는 에뮬레이터 또는 하이퍼바이저, 버추얼라이저이다. 보통 Linux의 커널 가상 머신(KVM) 기술과 함께 사용되며, 웹서버나 클라우드 서버를 운영하는 호스팅 업체나 데이터 센터에서 다수의 가상 머신을 운용하기 위하여 사용된다.2. 특징
2.1. 하드웨어 가속
QEMU는 에뮬레이터 모드와 버추얼라이져 모드가 있다. 리눅스의 KVM과 함께 사용시 Type 1 하이퍼바이져가 되어 Bare Metal 고속을 지원한다. CPU가 VT-x등의 가상화 기술을 지원해야한다. 2015년 이후 모든 CPU는 VT-x와 같은 가상화 기술이 탑재되어 있다. QEMU는 리눅스 서버에서 많이 사용중이며 특히 VPS서버가 KVM/QEMU로 동작된다. 그외도 거의 대부분의 운영체제를 돌릴 수 있다.2.2. PCI Passthrough
Linux에서는 PCI 기기 패스스루를 지원한다. 호스트가 점유하고 있는 하드웨어 기기를 게스트에 직접 연결시키는 것이다.다른 가상화 프로그램과 차별되는 독보적 장점은 데스크탑 환경으로 VGA Passthrough를 지원하는 것이다. VMWare는 서버용 운영체제인 ESXi로만 할 수 있고, VirtualBox의 PCI Passthrough는 VGA를 지원하지 않는다. Xen은 VGA Passthrough 성능이 상당히 낮은 데다가 #참고[1] 호스트(Dom0)의 운영 기능이 매우 제한적인 탓에 데스크탑으로 사용하기 곤란하다.(Xen의 원조인 XenServer는 ESXi 처럼 호스트의 데스크탑 기능을 아예 지원하지 않는다.)
호스트는 CPU에 내장된 GPU를 쓰거나 아예 또다른 그래픽 카드를 달아서 사용하고 게스트 윈도우에 PCI Passthrough를 이용하여 가상 머신 내 운영체제에 실제 GPU를 한 개를 붙여준다. QEMU에서 PCI Passthrough로 직접 가상 머신에 붙여주는 방법이다.
이를 자동으로 설정해주는 Looking Glass, GPU PT시 vfio 드라이버와 기본 드라이버를 로드/언로드 설정을 해주는 유틸도 있다.
2.2.1. 설정 방법
- vt-d를 지원하는 CPU와 메인보드를 준비한다.
- 메인보드에서 vt-d를 활성화한다(BIOS 설정).
- 커널에서 vt-d를 활성화한다(iommu 커널옵션 설정).
- 게스트OS에 연결하려는 장치를 호스트 OS에서 분리한다(사용하는 커널 버전에 따라 vfio-pci 또는 pci-stub 설정. 3.x 대 커널은 vfio-pci를 지원하지 않고 4.x 대 커널에서 pci-stub를 사용하면 성능이 크게 하락한다.).
- qemu의 가상머신 설정에서 해당장치를 게스트에 연결한다(실행옵션 또는 xml 행추가. virt-manager를 사용하면 간편하다).
2.2.2. 참고사항
2개 이상의 GPU로 구성되는 경우가 일반적이나 싱글 GPU로도 가능하다. #전통적인 IBM PC 구조상 롬을 읽어올 때 VGA 장치는 일반 PCI 장치와 달리 부팅시 메모리에 읽어들인 롬을 쉐도우 카피하여 접근한다. 이때문에 패스쓰루로 VGA를 연결할 경우 ROM 정보가 쉐도우카피된 가상머신의 GPU 펌웨어 과 섞여 시스템 안정성이 훼손될 수 있다. 따라서 바로 위 항목처럼 GPU 펌웨어를 파일로 덤프하여 사용하는 것을 권장한다. 일반적으로 <ROM Parser> 를 이용하여 추출하는데 입출력 에러가 발생하는 경우, 메모리 맵(/proc/iomem)에서 해당 VGA의 PCI 장치번호(lspci)로 VGA 주소를 찾아 메모리(/dev/mem)의 해당구간을 직접 접근(dd)하여 덤프한다. # 또는 덤프하지 않고 여기서 펌웨어를 내려받을 수도 있다. 다만 GPU 펌웨어는 변형이 조금씩 있기 때문에 해당 GPU에서 추출한 펌웨어가 아니면 작동하지 않을 수 있으므로 직접 추출하는 것을 권장한다. Windows PE 부팅 USB를 만들어서 부팅한 다음 GPU 제조사의 롬 업데이터로 현재 롬을 백업할 수도 있다.
사운드와 키보드 마우스 등 입출력 인터페이스에 의한 버벅임이 발생할 수 있다.[2] virtio의 passthrough로 /dev/input 에 있는 입력장치 이벤트를 패스쓰루 하면 끊김 없이 사용할 수 있다. # 또한 패스쓰루한 GPU의 hdmi 오디오 프로세서를 사용하면 지글거림 없는 사운드를 경험할 수 있다
virt-manager를 사용하는 경우 최초 VM 프로필 생성시에는 패스쓰루 장치를 안붙여야 한다. 특히 프로필 생성시에 패스쓰루를 적용하면 패스쓰루된 VGA가 프라이머리로 설정되어 초기 부팅 화면이 패스쓰루된 VGA에서 출력된다. 이렇게 되면 게스트가 제대로 부팅되지 않는 것은 물론, 부팅되어도 대부분의 경우 오류를 일으킨다. 패스쓰루 장치는 게스트에서 운영체제 설치를 완료한 뒤에 붙이자.
3. 활용
3.1. Windows
Windows 게스트에서 관련 드라이버를 설치하기 위해서는 virtio-win 게스트 드라이버를 설치해야 한다.GPU Full Pass-Through, vGPU 쉐어링 등을 사용할 수 있으며, 따로 GPU 가상화가 불가능한 경우에는 QXL/SPICE, VirtIO(VirGL)/SPICE 모드[3] 등을 사용할 수 있다.
게스트의 Windows에서 VGA Passthrough 시 관련한 문제가 지속적으로 발생한다면 제조사의 최신 드라이버를 제거하고 보다 안정적인 윈도우 업데이트에서 제공하는 WHQL 드라이버를 사용해보는 것을 권장한다. 새로운 프로필 생성, VBIOS 덤프, WHQL 드라이버 사용 등을 모두 시도해보았는데도 계속해서 프로그램이 한 번씩 오류를 내면서 중단된다면 아마도 GPU 펌웨어의 문제일 것이다. 펌웨어를 업데이트하면 해결될 수도 있다.[4] 그러나 업데이트 이후에도 지속되거나 신규 펌웨어가 없다면[5] 다른 GPU로 바꾸는 것도 대안일 수 있다.
3.2. 고전게임머신
- 비디오카드 선정조건 : 1) Windows 98 Driver 정식지원, 2) PCIE 인터페이스 사용
- PCI방식 카드는 하드웨어 가속기능 활성시 사용하기 어려울 정도로 오류가 많이 발생한다
- TNT2 급 3D 성능을 발휘하는 PCIE 1x 방식의 Matrox G550 추천
- 고성능을 원한다면 Geforce 6600 도 선택 가능하다. 그러나 이쪽은 기판에 콘덴서가 있기 때문에 내구수명이 있고, 이정도 3D 성능을 요구하는 게임은 거의 다 XP를 지원하기 때문에 윈도우98 이하 전용의 정말로 고전 3D게임에서는 G550의 성능도 부족하지 않다. 그리고 G550은 PCIE 1x 슬롯으로 출시되어, 보급형 메인보드에도 장착이 가능하다.
vGPU 기능은 현존 VGA의 드라이버를 그대로 사용하므로 고전게임의 구동에는 도움이 되지 않지만[6] Voodoo 1, 2는 단일 VGA가 아니라 외장 3D 가속 카드이며 PCI 슬롯을 사용하기 때문에 현행 VGA와 달리 손쉽게 패스쓰루가 가능하다.[7] 요즘은 호스트 리눅스의 MESA GL에 VM의 3dfx voodoo 가상장치를 직접 연결하는 방식이 개발되고 있다 #참고 (3dfx의 glide는 여러가지 wrapper의 등장으로 현재의 윈도우에서도 네이티브로 지원되고 있다.)
qemu-3dfx를 사용했다는 위 영상을 보면 windows xp에서 directx 9.0을 지원하고 있다. qemu-3dfx 프로젝트는 컴파일된 실행파일을 제공하지 않으므로 qemu의 소스를 직접 패치해서 컴파일해야 한다. 실행파일을 제공하지 않는 이유는... 개발자에게 후원금을 지불하면 개발자가 사용하는 OS에 적합한 커스텀 qemu 실행파일과 게스트 윈도우용 래퍼를 제공해주기 때문이다.
커스텀된 qemu에서 제공하는 글라이드 가속 인터페이스(호스트의 mesaGL과 연결) 위에서 dgVoodoo2를 이용하여 directx 9.0을 에뮬레이션하는듯 하다.
3.2.1. 설치 및 설정 방법
- 게스트 OS 프로필에서 설치할 Windows 9x를 선택한다.(USB 컨트롤러 선정에 영향을 미치며, 미설정 시 USB 드라이버가 작동하지 않을 수 있다.)
- 440fx 메인보드를 선택한다.
- Windows 9x를 설치한다.
- Windows 9x는 재부팅하면 게스트가 멈추는 문제가 있으므로 시스템이 멈추면 강제종료 후 다시 켜준다. 패스쓰루 VGA를 연결하면 재부팅 문제가 확연히 줄어든다.
- pnp bios가 제대로 설치되지 않기 때문에 pnp 기능이 작동하지 않는다. 인식을 위해서는 inf-update를 설치해야 하는데 인텔 inf 패치 프로그램이 440fx 가상보드를 인식못한다. 다음과 같이 수동으로 설치한다.
- 장치관리자에서 느낌표가 떠있는 pnp bios의 드라이버 재설치를 선택한다.
- 모든장치목록에서 설치를 선택하여 'PCI 버스'를 선택하면 pnp bios가 정상적으로 인식되어 시스템 장치드라이버들이 설치되기 시작한다.
- 패스쓰루한 PCIE VGA 장치를 연결한다.
- 패스쓰루한 VGA가 검색되면 드라이버를 설치한 후, 재부팅하지 않은 상태에서 기존의 VGA 드라이버를 삭제한다. 가상 VGA가 메인 VGA로 잡히면 듀얼 디스플레이 지원이 미흡한 Windows 9x 특성상 패스쓰루 VGA 드라이버가 작동하지 못할 가능성이 높다.
- Windows 9x와 호스트 리눅스의 파일공유는 Samba를 사용하면 공유폴더를 사용할 수 있다.
- 하드디스크의 방식을 SCSI로 변경하면 디스크 성능을 개선할 수 있다. 일단 IDE 방식으로 설치한 다음 SCSI 컨트롤러를 추가한다. LSI 895A 컨트롤러 드라이버 파일을 구해 INF를 우클릭으로 설치한다. 장치관리자에서 SCSI 장치 제어기를 새로고침하면 업데이트된다. 재부팅하여 정상 작동 여부를 확인한 뒤 하드디스크의 방식을 SCSI로 변경하면 된다.
3.2.1.1. Windows 98
- Windows 98은 재부팅하면 게스트가 멈추는 문제가 있으므로 시스템이 멈추면 강제종료 후 다시 켜준다. 패스쓰루 VGA를 연결하면 재부팅 문제가 확연히 줄어든다.
- 사운드 드라이버를 설치하면 소리가 안나는데, USB 사운드코덱을 패스쓰루로 연결하여 해결할 수 있다. 또한 USB DAC도 내장된 기본 드라이버로 사용할 수 있다.
3.2.1.2. Windows 95
- Windows 95는 IDE 에뮬레이션이 불안정해서 큰 파일을 복사하면 수시로 재부팅된다. 따라서 IDE 방식으로 설치한 후 디스크 방식을 SCSI로 바꾸는 작업을 해야 한다.
- 랜카드를 pcnet으로 직접 입력하면 95의 내장드라이버로 자동설치된다. PNP 바이오스를 설치하면 8139랜카드도 설치할 수 있다.
- 사운드는 SB16, adlib 2개를 함께 추가해야 자동설치된 sb16에서 소리가 출력된다. adlib은 virt-manager에서 지원하지 않으니 virsh로 수동구성 해야한다.
- 파일전송은 프리웨어 ftp 서버인 war ftp daemon을 인터넷에서 구할 수 있다.
- 마우스의 스크롤 휠을 사용하려면 로지텍의 Mouse Ware를 설치한다.
3.3. 해킨토시
3.3.1. macOS Sierra 이하 버전 설치 방법
자세한 설치방법- 메인보드 아키텍처 p35, mac 지원 패치된 UEFI OVMF 펌웨어, 클로버 부트로더 사용.
- enoch 커널로더는 비추. BIOS 환경에서만 작동하며 네이티브 설치이미지를 읽지 못하기 때문에 클로버 부팅디스크를 또 사용해야한다.
- qemu command line 옵션을 입력하려면 xml 파일 맨 첫줄의 도메인 타입 선언 항목에 libvirt.org 스키마를 추가해야 한다. gui 실행시 수동설정이 손실되는 것을 막기 위해 vi 등 일반 편집기를 사용하지 말고 virt-manager에 내장된 virsh를 사용한다.
- 클로버 부트로더를 설치하려면 OSX가 필요하기때문에 인터넷에서 돌아다니는 해킨토시용 부팅USB를 다운받아 클로버 부트로더를 실행하고 클로버 화면에서 OSX 설치시디의 베이스시스템을 선택한다.
- 그래픽은 QXL 장치를 선택한 후, 가상머신의 OVMF UEFI 옵션으로 들어가 디바이스 화면해상도를 클로버 부트로더에서 설정한 화면해상도와 일치시켜야 한다. 그렇지 않으면 다윈 로더의 부트 메시지 화면부터 깨져 나온다. 설정값을 모르겠으면 부팅USB의 config.plist 파일을 열어 해상도 값을 확인한다. 해상도 설정값이 없으면 FHD로 적용된다.
- 최초 설치 이후 OS 재설치시 하드에 기본탑재하는 베이스 시스템으로 부팅하여 OS를 설치하면 재부팅후 시스템이 멈춘다. OS는 반드시 설치CD에 탑재된 베이스 시스템으로 부팅하여 설치한다.
- OS 설치 후 클로버 부트로더의 설정도구를 설치하고 부팅USB의 설정값을 교정한다.
- 설정 자동추출 파일로 생성한 설정은 PC에 매우 적합하다. 이 생성값에 화면 해상도 수정과 클럭 주파수 수정을 위한 qemu 옵션 설정 정도만 더한다.
- 부팅USB에 기 탑재된 kext 파일들만 설정도구를 이용해서 업데이트 한다. 아무 드라이버나 막 설치하면 부팅에 실패한다.
- 호스트-게스트의 마우스 공용을 위해 qemu의 USB 터치스크린을 가상장치를 사용하려면 qemu용 드라이버를 추가로 설치해야 한다.
- 이정도만 설정해주고 클로버를 최신버전으로 업데이트하면 심하게 버벅이던 동작이 매끄러워진다.
- 클로버 부트로더를 업데이트시 쓸데없는 드라이버를 설치하면 부팅이 안된다. UEFI 드라이버 가운데 DataHubDxe만 설치한다.
- 클로버 부트로더를 잘못설정하면 정상적인 부팅을 할 수 없으므로 OS 하드에는 부트로더를 설치하지 말고 백업본을 만든 부팅용 USB를 사용하는 것이 좋다.
3.3.2. macOS High Sierra 이상 버전 설치 방법
자세한 설치 방법OpenCore를 사용해서 GPU 패스쓰루가 지원된다. Nvidia GPU 드라이버는 macOS High Sierra까지만 지원된다. ISO 형식이 아닌 DMG 패키지로 제공하므로 맥에서 부팅용 USB를 제작해서 이미지로 변환하는 절차가 필요하다.
3.4. IBM AIX 학습
서버 공부를 위해 AIX를 가정용 데스크톱에서 설치해 볼 수 있다. 물론 가상환경이므로 여러대 만들어서 HACMP 등 클러스터 구성연습도 가능하다. AIX 7.2 부팅방법 pseries를 구현하려면 openfirmware를 사용해야 한다. openfirmware 참고자료 qemu는 AIX의 LPAR를 에뮬레이션하므로 화면을 보기 위해서는 VIDEO를 none 로 제거하고 libvirt의 virsh console 명령 등을 이용해서 VM의 콘솔에 접속해야 한다.AIX 7.2 버전은 오류없이 설치/작동하며 5.1 이하 버전은 커스텀된 RS/6000 머신의 BIOS와 튜닝된 qemu 프로그램 에서만 오류없이 작동한다. AIX 5.1 설치방법
4. GUI 프론트엔드
QEMU는 기본적으로 터미널에서 사용하는 프로그램이나, 이용의 편의성을 위해 각종 GUI 프론트엔드가 개발되고 있다. Windows, Linux, 또는 FreeBSD에서는 Qt5로 제작된 QtEmu[8]를 사용할 수 있다. QtEmu 사용법 Apple Silicon SoC를 탑재한 MacBook, iMac 등에서는 UTM을 사용할 수 있다.그 외에도 QEMU-Launcher나 AQEMU 같은 프로그램이 있었지만 이들의 경우 현재 개발 중단 상태. Linux를 지원하는 대표적인 GUI 프론트엔드인 virt-manager에 대해서는 아래 서술된다.
4.1. 가상 머신 관리자 (virt-manager)
Linux에서는 Red Hat에서 주도하는 virt-manager가 있다. virt-manager는 libvirt 기반으로 복잡한 QEMU의 여러 설정들을 GUI로 조정할 수 있다. libvirt 위키 그래도 리눅서답게 GUI 없이 터미널에서 실행하려면 간단하게는 qemu-system-x86_64 -enable-kvm -drive format=qcow2,file=/home/namu/image.img부터 시작해서 여러가지 옵션을 줄 수 있다.UEFI 펌웨어 사용 시 해당 libvirt의 버전에 따라 snapshot 기능이 동작하지 않을 수 있다.
5. 기타
- 다른 아키텍처를 가상화하는, x86에서 ARM이나 MIPS 같은 것으로는 현 시기에 사실상 유일한 방법이 QEMU를 사용하는 것이다. 따라서 현재 가령 안드로이드 개발 시에 사용하는 에뮬레이터 역시 QEMU 기반이고, 이 밖에도 QEMU가 지원하는 아키텍처를 에뮬레이션하는 경우이면 전부 사용된다.
- QEMU 버전을 개조하여 PC-9801를 에뮬레이트할 수 있다. 참고. 실제 PC-9801 컴퓨터의 바이오스 롬을 이용하여 그 컴퓨터로 에뮬레이션할 수 있다. 그리고 Anex86이나 Neko Project와 비교하여 Windows 98과 같은 운영체제도 설치할 수 있다. 또, IMG로도 부팅할 수 있기 때문에 적절한 변환 툴만 이용해주면 구동할 수 있게 된다. 다만 FPU가 가상화되지 않아서 설치 속도가 많이 느리다. 하드 디스크의 경우 헤드, 실린더, 섹터의 수를 정확히 입력해 줘야 오류없이 된다.
-
파워맥 전용 프론트 엔드로 QEmulator도 있으며 QtEmu의 PowerMac 지원 수정판도 있다.
- Macrumors 포럼에서 macOS용 QEMU로 Windows부터 시작해서 Linux, macOS(...) 등등 온갖 OS를 부팅하는 기행을 보여주고 있다.(...) 심지어 2018년엔 Windows 10(!)도 부팅에 성공한 모양.[9]
- OpenOSX에서 이것을 이용하여 WinTel(...)이라는 가상 머신을 개발한적이 있다.[10]
- UTM이라는 iOS용 프론트엔드가 나왔다!
- Time Stamp Counter를 활성화하면 CPU에 따라서 클럭 집계값이 다르게 나온다.[11]
- 가상 디스크에 라이트백 쓰기 캐시를 지원한다. 호스트 메모리만 충분하면 일반 하드로도 SSD 부럽지 않은 쓰기 속도를 구현할 수 있다.
- 2019년 부터 5세대 이상의 인텔 내장 GPU를 이용한 VGA 전가상화를 안정판에서도 지원하여 인텔의 GPU 드라이버가 VM에서 그대로 설치되고 작동한다.
6. 안드로이드
안드로이드로 Windows XP 같은 운영체제와 그 프로그램들을 돌릴 수 있다. 하지만 키보드 등이 잘 되지 않고, Bochs와 Limbo PC Emulator[12] 등보다 성능 및 기능이 그다지 좋지 않아서 별로 사용되지는 않는 편이다. 만약 돌려보고 싶으면 윈도우 95나 NT 4.0 을 추천한다.Termux에서 QEMU를 실행하여 VNC 클라이언트로 연결하는 방식이기에 Limbo와 다르게 불편할수있다.
7. QEMU/Wine
와인(소프트웨어)과 QEMU의 결합체. 가상 머신 없이 IBM PC 호환기종이 아닌 하드웨어 + 운영체제로도 직접 윈도우용 바이너리(실행 파일)를 실행하는 것을 할 수 있게 해주는 플랫폼[13]이다. 본래는 SPARC, PowerPC 계열 CPU로 Win32 바이너리(윈도우용 실행파일)를 직접 사용하고자 시작하였으며, 현재는 ARM 계열 CPU를 주 타겟으로 개발이 진행된다. 안정화되면 안드로이드나 iOS로 별도 가상 머신 없이 직접 윈도우용 소프트웨어를 실행할 수 있게 된다.8. 같이보기
[1]
하이퍼바이저별 VGA Passthrough 성능비교 논문
[2]
TCP/IP 리다이렉트를 이용한 USB 연결 (usbredirserver)이 지원 중단되었으며 qemu가 버전업 되면서 USB IO 패스쓰루가 크게 불안정해져서 금세 연결이 끊어진다.
[3]
절전 모드, Windows 게스트 한정으로 마우스 커서 하드웨어 가속 및 3D 그래픽 가속이 작동하지 않는다.
[4]
굳이 위험하게 업데이트 하지 않고 VM부팅시 롬파일을 읽어오도록 설정해도 된다.
[5]
GPU는 메인보드와 달리 펌웨어를 업데이트해주는 제조사가 거의 없다.
[6]
VBE Mini Port 드라이버를 사용하면 되기야 한다. DirectX 지원이 가능하냐가 문제지만..
[7]
Voodoo 1, 2는 별도의 그래픽 카드에 연결하는 방식을 사용한다. 그러다보니 Connectix Virtual PC v3나 INSIGNIA SoftPC/SoftWindows에서도 Voodoo를 장착하고 드라이버를 설치하면 작동이 된다. 단 QEMU와 다르게 이 둘은 당시 기술력으로 인해 호환성 문제가 있었다.
[8]
본래 2008년경 중단된 프로젝트였으나 Qt5로 포크된 게 지금까지 개발되고 있다. 구버전의 경우 PowerMac도 지원되었다.
[9]
하지만 CPU 클럭이 33MHz(...)로 인식된다.(...)
[10]
2.1버전 한정. 그 이전 버전은 Bochs기반이다.
[11]
PowerPC에서 실행하면 최대 33MHz까진 나오는듯 하다.
[12]
사실
Limbo PC Emulator도 QEMU 구버전 기반이다. 최신 버전에 포함된 업데이트가 ARM과 호환성을 떨어뜨린다고 한다.
[13]
Java와 사실상 동작 원리가 같다.