Mini Ghid setare GPU Passthrough pe linux ptr. a putea folosi Win in VM cu GPU nativ (Linux: host, Win: guest)

Am petrecut ceva timp incercand varii combinatii dar am reusit! Am un vm WIN care are acces nativ la GPU. De ce e important? Ptr. a folosi programe care utilizeaza GPU-ul nativ, gen Photoshop, Autodesk, etc. Sau ptr. a juca jocuri.
Vmware nu suporta asta in Workstation. Ai doar 3d acceleration care e foarte prost ca si performanta.

Lucrurile astea le-am invatat si le impartasesc cu voi, sa va usurez smulgerea parului din cap :grin:

Configuratia mea:

  • Radeon HD 7790 (guest GPU)
  • GTX 1050ti (Host GPU)
  • Ryzen 2600x
  • B450m mobo
  • in ghiduri se folosesc de obicei placi Nvidia dar uite ca merge si cu Amd gpu ca si guest GPU.

Necesitati

  • 2 GPU (pe placa de baza)
  • 2 monitoare (de preferinta, posibil sa merga si cu unul)
  • CPU/MOBO care sa suporte IOMMU (cica toate astea dupa 2014 incoace suporta)

Cum o sa mearga

  • Se baga 2 gpu-uri pe mobo. Unul va fi folosit de host (linux). Celalalt va fi folosit de VM. Sharing-ul de pe un singur GPU nu merge deocamdata.
  • Se conecteaza 1 monitor intr-un GPU (hostul, Linux), un monitor in celalalt GPU (vm, Win)
  • Se poate face share la mouse/keyboard cu ajutorul ‘evdev’. Default trebuie mouse si si keyboard separat.

Linkuri:

Troubleshoot

  • Aici e miezul ghidului astuia. Sunt cateva chestii care nu-s acoperite de ghidurile oficiale si fara de care e posibil sa nu mearga. A trebuit sa le vanez pe net si sa fac trial & error la greu ca sa-mi dau seama ce si cum.
  1. Trebuie sa aveti doar 2/3 entries in “IOMMU” group-ul ptr. VFIO. E am avut vreo 6 (GPU + Audio+Ethernet+altele) si n-a mers. Vedeti scriptul ala care listeaza grupurile IOMMU. Toate PCI bus din grupul respectiv trebuie pasate catre VFIO, altfel n-o sa mearga. Daca GPU-ul e in acelasi grup cu Ethernet-ul si altele, n-o sa mearga. Trebuie folosit grupul unde astea sunt separate (GPU+AUDIO+Eventual usb controler). Cica exista un patch ptr. asta dar are riscuri.
  2. Trebuie adaugat la VFIO folosind PCI bus id ( “Apply VFIO-pci driver by PCI bus id (via script)” in ghidul oficial). Mie nu mi-a mers cu cealalta optiune.
  3. GRUB_CMDLINE_LINUX_DEFAULT="amd_iommu=on iommu=pt kvm_amd.npt=1 kvm_amd.avic=1 kvm.ignore_msrs=1 video=efifb:off " asta-i linia in /etc/default/grub pe care o am acum. Optiunea esentiala este video:efifb:off - fara ea am avut blackscreen si habar n-am avut de ce.
  4. In loc de /dev/input/by-id/KEYBOARDNAME folositi ceva gen /dev/input/event6 (cica qemu versiunea noua nu stie sa urmeze symlinks). Aici e un mini tutorial (ptr. a seta mouse si keyboard shared device not found error)
  5. Daca tot primiti “permission denied errors” desi ati urmat sectiunea relevant din linkul cu shared mouse/key, atunci e de vina apparmour. In ghid zice ca daca faci toti pasii aia SIGUR n-o sa primesti permission denied. Dar uite ca nu-i adevarat. Trebuie adaugat permisiune in apparmour. Mini ghid aici, comment pe la mijloc
  6. Daca n-ati nimerit event-ul potrivit /dev/input/event ptr. mouse incercati si restul.
  7. Dupa ce schimbati qemu.conf si xml-ul masinii virtuale e posibil sa nu se mai aprinda monitorul de la VM. Dupa un restart merge.
  8. Dupa fiecare schimbare in qemu.conf si xml-ul masinii dati restart la libvirtd (systemctl restart libvirtd)
  9. Sunt mai multe optiune de jucat in qemu.conf dar mie imi merge asa (unde event-urile sunt unde fac point symlink-urile din /dev/input/by-id)
cgroup_device_acl = [
        "/dev/null", "/dev/full", "/dev/zero", 
        "/dev/random", "/dev/urandom",
        "/dev/ptmx", "/dev/kvm", "/dev/kqemu",
        "/dev/rtc","/dev/hpet",
        "/dev/input/event2",
        "/dev/input/event5"
]
user = "me"
#group = "evdev"
clear_emulator_capabilities = 0
  1. Nu uitati sa updatati device-urile (aceleasi path-uri) atat in qemu.conf cat si in xml-ul masinii virtuale. Xml-ul merge editat direct din qemu sau cu virsh edit VMNAME
  2. In timpul setup-ului e posibil sa fie o sectiune moarta (de vreo 30-60 de secunde) unde n-o sa vedeti input pe monitorul principal. Dupa perioada respectiva monitorul prinde brusc viata. Asta ptr. ca tocmai ce ati adaugat un GPU la VFIO si linux trebuie sa ruleze scriptul din /etc/initramfs-tools/scripts/vfio.sh ptr. a detecta monitorul corect. Daca aveti 2 monitoare in cele 2 GPU-uri de la inceput probabil n-o sa aveti problema asta.

Asta-i tot ce imi amintesc. Sper sa va ajute. (dar tot am senzatia ca o sa petreceti niste timp sapand dupa info extra :smiley: ).

E un pic dificil dar la naiba, merita. De cand imi doream sa am putere GPU nativa in VM. Native Linux + Native Win in acelasi timp? F@@K YEAH! :smiling_imp:

E putina pierdere la CPU in VM dar ptr. mine si probabil ptr. multi altii nu-i o problema.

Dual boot-ul e prea clunky si switch-ul dureaza mult. Asa switch-ul dureaza doar o secunda (trebuie apasate ambele taste CTRL deodata si evdev trimite mouse/keyboard catre VM sau inapoi).

O sa mai updatez ghidul daca apar chestii neprevazute.

4 Likes

Deci un fel de WSL cu extra steps și extra bătaie de cap? :smiley:

Pot da un exemplu de necesitate pentru native linux:

Docker compose are o funcție numită host networking. Cu WSL nu merge fiindcă n-ai o conexiune nativă.

Sunt oameni care poate vor să facă backup la tot environment-ul de dev, cu setup-ul acesta faci un backup la VM. Poți să faci un VM de Windows/client.

Prefer un lup in piele de oaie decat o oaie in piele de lup. :stuck_out_tongue:

Cum zicea cineva de pe reddit:
WSL: movie preview
WSL2: better movie preview
LInux: real movie.

PS: wsl are o tona de probleme tehnice, pe langa aspectul de usability si senzatia ca te lupti cu morile de vant, si faptul ca pana la urma esti pe Windows cu toate aspectele lui neplacute de OS (chiar daca are si multe placute).