1. 개요
QEMU는 '하이퍼바이저'를 채용했다. 이를 이용해 가상 머신 여럿을 한 플랫폼으로 돌릴 수 있다. 이와 비슷한 소프트웨어로는 VMware와 VirtualBox 등이 있다.
2. 설명
QEMU를 가상화 머신이 아닌 기본적인 에뮬레이터로 사용할 때에는 성능이 나쁘다.하지만 그건 특별한 하드웨어를 가상화할 때나 그렇고, 일반적인 데스크탑이나 서버 가상화 시에는 -enable-kvm 옵션으로 리눅스의 가상화 커널인 KVM을 적용하는데, 그러면 qemu는 에뮬레이터가 아니라 하이퍼바이저로 작동한다. 이는 VMware처럼 가상화할 수 있는 부분(CPU 등)은 하드웨어를 그대로 쓰고 (VT-x 기술) 이외의 부분만 에뮬레이션으로 처리한다. 그 결과 가상화의 성능은 기본적으로 좋은 편이다. 또, 가상 디스크에 라이트백 쓰기 캐시를 지원하여 호스트 메모리만 충분하면 일반 하드로도 SSD 부럽지 않은 쓰기 속도를 구현한다[3](윈도우 같은 건 설치하는 데에 5분도 안 걸린다).
2019년 부터 5세대 이상의 인텔 CPU에 장착된 아이리스 GPU를 이용한 VGA 전가상화를 안정판에서도 지원하여 인텔의 GPU 드라이버가 VM에서 그대로 설치되고 작동하는 등 경쟁제품들은 서버군에서만 제공하는 기능을 구현할 수 있어 데스크탑의 하이퍼바이저로는 가히 최강이다.
상술했듯 KVM을 통해 가상화를 구현하나, 이는 리눅스에서 쓰는 가상화 기술이고, 윈도우/맥에서는 HAXM을 쓴다.
3. 특징 : VGA Passthrough
다른 가상화 프로그램과 차별되는 독보적 장점은 데스크탑 환경으로 VGA Passthrough를 지원하는 것이다. VMWare는 서버용 운영체제인 ESXi로만 할 수 있고, VirtualBox의 PCI Passthrough는 VGA를 지원하지 않는다. Xen은 VGA Passthrough 성능이 상당히 낮은 데다가#참고[4] 호스트(Dom0)의 운영 기능이 매우 제한적인 탓에 데스크탑으로 사용하기 곤란하다.(Xen의 원조인 XenServer는 ESXi 처럼 호스트의 데스크탑 기능을 아예 지원하지 않는다.)
호스트는 CPU에 내장된 GPU를 쓰거나 아예 또다른 그래픽 카드를 달아서 사용하고 게스트 윈도우에 PCI Passthrough를 이용하여 가상 머신 내 운영체제에 실제 그래픽 카드 한 개를 붙여준다.[5] VMware Workstation 등에서도 그래픽 카드는 어디까지나 일부만 하드웨어와 직접 연관돼 있는데, QEMU에서 PCI Passthrough로 직접 가상 머신에 붙여주는 방법으로 옛날부터 지원이 부실하였던 '가상머신으로 게임'[6]로 을 할 수 있게 해 주었다.(덕분에 수십개의 웹페이지를 습관적으로 열어놓는 헤비 웹서퍼들은 게임과 인터넷뱅킹을 포기하지 않고서도 리눅스 + 파이어폭스의 매우 안정적인 웹서핑을 즐길 수 있게 되었다.) 이 방천으로 돌리는 게임 성능은 윈도우를 네이티브로 돌릴 때와 거의 비슷하다. 요즘의 VGA 카드는 UEFI 펌웨어에서만 VGA 패스쓰루가 정상적으로 작동한다. 이 경우 BIOS 모드를 사용해야 하는 구형 운영체제에서는 IRQ자원 관련 문제로 비디오카드를 정상적으로 사용할 수 없다. 따라서 UEFI를 지원하지 않는 XP 이하의 운영체제에서 VGA 패스쓰루를 하고싶다면 구형 VGA를 장착하거나 qemu-kvm 말고 xen을 사용하는 것이 좋다. 그러니까 윈도우 9x 이하 고전게임용이면 OpenGL로 3dfx Glide 에뮬레이션이 가능한 커스텀된 DOSBOX를, xp 용 고전게임이라면 하드웨어가속으로 dx3d를 지원하는 VirtualBox가 더 낫다.
Looking Glass라는 프로그램을 사용하면 윈도우에 내장된 DXGI(MS DirectX Graphics Infrastructure)를 이용하여 패스쓰루 VGA의 화면을 호스트의 모니터에서 볼 수 있다. 즉, 가상머신에 패스쓰루된 비디오카드 모니터를 물리적으로 연결하지 않아도 된다.
3.1. 설정 방법
1. vt-d를 지원하는 CPU와 메인보드를 준비한다.
2. 메인보드에서 vt-d를 활성화한다(BIOS 설정).
3. 커널에서 vt-d를 활성화한다(iommu 커널옵션 설정).
4. 게스트OS에 연결하려는 장치를 호스트 OS에서 분리한다(사용하는 커널 버전에 따라 vfio-pci 또는 pci-stub 설정. 3.x 대 커널은 vfio-pci를 지원하지 않고 4.x 대 커널에서 pci-stub를 사용하면 성능이 크게 하락한다.).
5. qemu의 가상머신 설정에서 해당장치를 게스트에 연결한다(실행옵션 또는 xml 행추가. virt-manager를 사용하면 간편하다).
3.2. 참고사항[편집]
0. 기본적으로 2개의 그래픽카드가 요구된다. 호스트에 하나, 게스트에 하나. 인텔 내장 그래픽을 호스트에, 외장 그래픽을 게스트에 연결하는 식의 변칙적인 방법도 있기는 하나 영미권 자료를 잘 찾아봐야 한다.
1. VGA를 세컨더리 PCI-E 포트(노스브릿지에 연결된 PCIE 레인이 아닌 사우스브릿지에 연결된 PCIE 레인)에 장착하면 해당 슬롯의 대역폭과는 별도로 아키텍처 때문에 발생하는 대역폭 부족으로 성능 저하가 상당하게 발생하므로 조금 불편하더라도 프라이머리 포트에 장착해야 한다.
2. NVIDIA의 VGA 드라이버에는 락이 걸려 있어 가상 머신 안에서는 그래픽 드라이버가 작동을 중단한다(K1, K2 등 vGPU 시장 잠식을 우려한듯). 대응책으로 게스트 운영체제에게 가상머신환경을 알리지 않도록 하는 실행 옵션 설정('-cpu host,km=off', '--features kvm_hidden=on' 등)이나 VGA 바이오스 덤프 등의 방법이 알려져 있지만 드라이버가 업데이트되면서 지속적으로 차단되고 있으므로 속편하게 AMD를 사용하는 것이 좋다.
- 그래도 NVIDIA 비디오카드를 사용하려면 능력자가 제작한 스크립트로 공식드라이버를 크랙하면 된다. 허나 제조사에서 꼼꼼하게 막아놔서 이 또한 쉽지는 않다. 요즘 드라이버는 제조사의 방해로 설치는 안되니 장치관리자에서 수작업으로 설치해야 한다. 작업메뉴얼. 드라이버에 제조사 서명이 없는 관계로 윈도우 개발자용 테스트모드에서만 게임을 할 수 있다. 배틀아이 등 안티치트 프로그램은 테스트모드를 차단하므로 대다수의 인기 FPS는 구동이 불가능하다.
- 그래도 포기할 수 없다면... 윈도우 7 이나 32비트 윈도우 10은 일반모드 에서도 드라이버 서명을 무시할 수 있다.
3. 전통적인 IBM PC 구조상 롬을 읽어올 때 VGA 장치는 일반 PCI 장치와 달리 부팅시 메모리에 읽어들인 롬을 쉐도우 카피하여 접근한다. 이때문에 패스쓰루로 VGA를 연결할 경우 ROM 정보가 쉐도우카피된 가상머신의 VGA ROM 과 섞여 시스템 안정성이 훼손될 수 있다. 따라서 바로 위 항목처럼 VGA롬을 파일로 덤프하여 사용하는 것을 권장한다. 일반적으로 <ROM Parser> 를 이용하여 추출하는데 입출력 에러가 발생하는 경우, 메모리 맵(/proc/iomem)에서 해당 VGA의 PCI 장치번호(lspci)로 VGA 주소를 찾아 메모리(/dev/mem)의 해당구간을 직접 접근(dd)하여 덤프한다.참고 그냥 여기서 다운로드하자. [9] 윈도우PE USB를 만들어서 윈도우로 부팅한 다음 GPU 제조사의 롬 업데이터로 현재 롬을 백업받는게 제일 편하다. 문제가 없으면 불필요한 작업.
4. 사운드와 키보드 마우스 등 입출력 인터페이스에 의한 버벅임이 꽤 있으므로 어지간하면 모두 패스쓰루로 연결해서 사용하는 것이 좋다. USB연결은 TCP/IP 를 이용한 리다이렉트(usbredirserver)를 이용하면 더 안정적으로 사용할 수 있다.
5. 리눅스 VGA 패스쓰루 구성 가운데 가장 골룸한 부분은 호스트 VGA 구성이다. 우선 듀얼VGA 카드 장착시 메인보드 하드웨어 호환성 문제로 부팅조차 되지 않는 경우가 많다. 그리고 구형 VGA라 드라이버 릴리즈가 오래된 경우에는 Xorg에서 듀얼VGA를 자동으로 잡지 못해 여러가지 삽질을 해가며 수동으로 설정 해야한다.
- 최선책은 CPU 내장 그래픽 활용. 이게 불가능한 경우, nvidia 일반용 카드는 부팅호환성 문제가 많기 때문에 철지난 엔트리급 쿼드로 카드를, AMD는 부팅호환성 문제는 훨씬 적지만 제조사의 리눅스용 드라이버 지원이 구질구질하므로 가급적 최신의 하드웨어를 권장한다.
- 일반 PCI VGA는 구하기도 어렵고 있어도 구형 칩셋이라 드라이버 지원에 문제가 많으니 듀얼 PCIE x16 슬롯 메인보드를 구입해야한다.
- USB 3.0을 이용한 채굴용 PCI-e 라이저카드는 리눅스에서 지원하지 않는다. 정 필요하면 그냥 케이블로 1:1 연결한 x1 to x16 소켓을 이베이에서 구매하자. 아니면 미니 그라인더로 소켓 끝을 따던가.[10]
6. virt-manager 를 사용할 경우 최초 VM 프로필 생성시에는 패스쓰루 장치를 안붙여야 한다. 특히 VGA. 프로필 생성시에 패스쓰루를 적용하면 패스쓰루된 VGA가 프라이머리로 설정되어 초기 부팅 화면이 패스쓰루된 VGA에서 출력된다. 이렇게 되면 윈도우가 제대로 부팅되지 않는 것은 물론, 부팅되어도 대부분의 경우는 오류를 일으킨다. 패스쓰루 장치는 윈도우 설치를 완료한 뒤에 붙이자.
7. 게스트 윈도우에서 계속해서 VGA와 관련된 문제가 발생한다면 제조사의 최신드라이버를 제거하고 보다 안정적인 윈도우 업데이트에서 제공하는 WHQL 드라이버를 사용해 본다. 문제가 없으면 불필요한 작업.
8. 패스쓰루 시 프로그램에서 계속 오류가 발생하는 경우가 있다. 클린프로필 생성, BIOS덤프, WHQL드라이버 사용 등을 모두 했는데도 계속해서 프로그램이 한 번씩 오류를 내면서 중단된다면 아마도 VGA 펌웨어의 문제일 것이다.(호스트 윈도우에서는 잘 돌아갈테지만 VM에서는 반드시 오류를 내뿜는다.) 해결책은 펌웨어 업데이트.(굳이 위험하게 업데이트 하지 않고 VM부팅시 롬파일을 읽어오도록 설정해도 된다.) 그러나 VGA는 메인보드와 달리 펌웨어를 업데이트해주는 제조사가가 거의 없다. 다른 회사 제품으로 카드 교체.
- 리눅스의 X윈도우는 전통적으로 1.점유율 높은 칩셋 2.인지도 높은 제조사 3.가급적 최신의 하드웨어 를 요구해 왔다. 마이너 OS의 숙명으로 Xfree86 시절부터 점유율 높은 칩셋의 메이저 제조사 제품은 듣보잡 제품과 확연한 차이가 났다. 현재에도 유효함을 확인하는 부분.
9. 노스브릿지에 PCIE 레인이 여렷 달려있는 서버용 메인보드의 경우 대부분 부트업 디스플레이 아답터 선택이 불가능하다. 우선순위가 높은 슬롯에 호스트에서 사용할 VGA를 장착해서 부트업 디스플레이로 만들어 주지 않으면 부팅 진행중 패스쓰루가 작동하는 순간 먹통이 된다.
10. 패스쓰루한 vga의 hdmi 오디오 프로세서를 사용하면 지글거림 없는 사운드를 경험할 수 있다