qemu-kvm Guest VM(윈도우 10)에서 nvidia GPU path through 사용하기.
* 작업환경
Host OS: ubuntu 18.04 (EFI boot)
Guest OS: windows 10
Hypervisor : qemu-kvm
M/B: ASUS WS X299 SAGE
GPU: Gforce RTX2080 TI 4개
MEM: 128GB
CPU: Intel(R) Core(TM) i9-10900X CPU @ 3.70GHz
1. 커널의 iommu 지원 설정
/etc/default/grub 파일에서 아래 내용을 수정 또는 추가한다.
# vi /etc/default/grub ... GRUB_CMDLINE_LINUX="xhci-hcd.quirks=262144 kvm-intel.nested=1 intel_iommu=on modprobe.blacklist=nouveau" ...
커널에 적용하고 재부팅한다.
# grub-mkconfig -o /boot/efi/EFI/ubuntu/grub.cfg
2. Guest VM에서 uefi 바이오스를 지원하도록 ovmf 패키지를 설치한다.
# apt install ovmf
3. 윈도우를 설치한다. 간편하게 virt-manager를 사용한다.
ovmf 패키지를 설치하지 않았다면, 그림처럼 UEFI를 찾을 수 없다고 나온다.
ovmf 패키지를 설치하면 아래 그림처럼 UEFI 바이오스를 선택 할 수 있다.
4. 설치된 Guest 윈도우에 nvidia 드라이버를 설치해도 제대로 작동하지 않는다.
이 현상의 원인은 nvidia 그래픽 드라이버는 가상머신에서 동작하지 않기 때문이라 한다. 때문에, guest 설정을 몇 가지 해 주어야 한다.
게스트 win10의 원래 설정은 아래와 같다.
# virsh edit win10 ... <features> <acpi/> <apic/> <hyperv> <relaxed state='on'/> <vapic state='on'/> <spinlocks state='on' retries='8191'/> </hyperv> <vmport state='off'/> </features> ...
이제, 아래럼 수정해준다.
<features> <acpi/> <apic/> <hyperv> <relaxed state='on'/> <vapic state='on'/> <spinlocks state='on' retries='8191'/> <vendor_id state='on' value='1234567890ab' /> </hyperv> <kvm> <hidden state='on' /> </kvm> <vmport state='off'/> <ioapic driver='kvm' /> </features>
이제 guest os를 실행하면, 그림 처럼 GPU가 잘 작동한다.
5. 하지만 설치된 GPU 4개 중 하나는 제대로 작동하지 않는다.
– Host OS 가 사용하고 있어서 안되는 것일까?
dmesg에 관련 로그는 아래와 같다.
[20782.590073] caller pci_map_rom+0x5d/0xf0 mapping multiple BARs [20782.590075] vfio-pci 0000:68:00.0: Invalid PCI ROM header signature: expecting 0xaa55, got 0xffff [20782.590120] resource sanity check: requesting [mem 0x000c0000-0x000dffff], which spans more than PCI Bus 0000:00 [mem 0x000c4000-0x000c7fff window] [20782.590121] caller pci_map_rom+0x5d/0xf0 mapping multiple BARs [20782.590122] vfio-pci 0000:68:00.0: Invalid PCI ROM header signature: expecting 0xaa55, got 0xffff [20783.903024] virbr0: port 2(vnet0) entered forwarding state [20783.903041] virbr0: topology change detected, propagating
>>> 기타사항
참고 문서를 보면 vfio 관련 이슈가 있는듯 하지만, 여기서는 특별히 vfio 관련 설정은 하지 않았다.
>>> 참고문서
https://mathiashueber.com/fighting-error-43-nvidia-gpu-virtual-machine/
https://www.heiko-sieger.info/running-windows-10-on-linux-using-kvm-with-vga-passthrough/