This site uses cookies! Learn More

Utilizziamo i cookie per personalizzare i contenuti e gli annunci, fornire le funzioni dei social media e analizzare il nostro traffico. Inoltre forniamo informazioni sul modo in cui utilizzi il nostro sito alle agenzie pubblicitarie, agli istituti che eseguono analisi dei dati web e ai social media nostri partner.

Visualizza dettagli: italiaunix.com/cookies

Per proseguire con la navigazione del sito, devi accettare di utilizzare i nostri cookie :)

Accedi per seguire questo  
Followers 0
Luky

VGA PCI Passthrough, virtualizzazione GPU con QEMU - KVM

1 risposta in questa discussione

Premessa teorica
Salve a tutti, in questa guida illustrerò nel dettaglio come effettuare la virtualizzazione della vostra scheda video su una macchina virtuale, in modo da avere circa 95% delle prestazioni di una macchina fisica.

Perché
Di norma, qualsiasi programma che gestisce macchine virtuali, emula una scheda video software che, detta in parole povere, usa la CPU invece che la GPU fisica causando difficoltà nel rendering non solo di programmi 3d ma anche dell'usabilità in se del sistema operativo virtualizzato.

E' una tecnologia che sta prendendo forma concreta in questi ultimi anni ma che rimane tutt'ora con molti problemi, ma per ora i risultati sono incoraggianti. 
Esempi noti: LinusTechTips
In un futuro ad esempio potrebbe trovare impiego all'utilizzo di un computer centralizzato come nell'esempio di Linus non solo per giocare ma anche in ambiti di computer grafica o dove è necessaria elaborazione GPU portando molti vantaggi oltre che alla sicurezza e all'utilizzo di ambienti virtualizzati da cui derivano sicurezza e controllo.

La tecnologia che rende possibile tutto questo si chiama VT-D in particolare per intel, e consente accesso diretto a periferiche PCI della scheda madre bypassando il sistema operativo host. Dettagli qui: Sito intel

Requisiti
 

  1. - Supporto CPU con estensione VT-X e VT-D (Anche detta Intel® Virtualization Technology for Directed I/O)
     
  2. - Supporto Scheda madre/chipset per VT-D
     
  3. - 2 GPU, possibile utilizzare Intel IGPU sull'host
     
  4. - Pazienza (Molto importante) 
     
  5. - 2 Schermi o un singolo schermo con più entrate in input
     
  6. - Sistema Operativo Linux con kernel compilato con supporto per:
    PCI STUB DRIVER (Compilato come modulo preferibilmente)
    AMD/INTEL IOMMU SUPPORT
    Per verificare questo è possibile controllare la propria config attuale del kernel che certe distro offrono, in /proc/config.gz utilizzando un editor di testo.
     
  7. QEMU

Configurazione e Installazione

Testato su:
Arch Linux (canale rilascio testing) 
Qemu + KVM con V-FIO
Integrata Intel HD 530 (output DVI) 
Scheda video AMD R9 380 (output HDMI)
1 Schermo LG IPS 224
Processore i5 6400
Scheda madre MSI H170 Gaming M3
Windows 10


Guide generali per ricerca di problemi o di configurazioni particolari:
Arch Wiki
https://www.pugetsystems.com/labs/articles/Multiheaded-NVIDIA-Gaming-using-Ubuntu-14-04-KVM-585/
Documentazione QEMU
Ubuntu Forum
RedHat
Arch Forum

Passi

- Configurazione Bootloader per abilitare VT-D su linux e altre variabili particolari richieste con certe configurazioni
- Eclusione dal sistema operativo host mettendo in blacklist i driver della GPU che vogliamo virtualizzare
- Configurazione e assegnazione a vfio/pci-stub dell'indirizzo fisico della scheda video
- Configurazione QEMU

Premessa

La guida è stata fatta seguendo ciò di cui il mio computer ha avuto bisogno, non è detto che questa esatta configurazione sia supportata anche dalla vostra, potrebbe essere necessario infatti aggiungere altri parametri al bootloader per evitare crash, problemi, reset improvvisi e kernel panic. 
Rimane comunque una funzione sperimentale supportata solo da QEMU e KVM che presenta diversi problemi.
ATTENZIONE 
Se chiuderete la virtual machine sarete costretti a riavviare il computer per riavviarla una seconda volta.
Può succedere che dovrete riavviare più di una volta il computer per far partire tutto correttamente.
Può succedere in maniera del tutto casuale che la scheda video si blocchi, che linus chiama GPU resets.
E' possibile che si verifichino kernel panic o crash dei moduli.

E' stato inoltre accertato che alcune schede video NVIDIA hanno problemi di diverso genere utilizzando questa funzione.


Configurazione Bootloader e verifica corretta del caricamento di IOMMU

Con grub, per caricare iommu è necessario aggiungere alla commandline del kernel

Spoiler

intel_iommu=on

Per far ciò, possiamo modificare la config di default in

Spoiler

/etc/default/grub

con il vostro editor di testo preferito e aggiungendo in

Spoiler

GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on"



Per aggiornare il bootloader copiando la configurazione da voi creata, dare su archlinux 
 

Spoiler

grub-mkconfig -o /boot/grub/grub.cfg


 

Spoiler

update-grub2

su Ubuntu

Per verificare che tutto sia stato caricato correttamente digitare nel terminale 

Spoiler

dmesg | grep IOMMU

Dipendentemente dal processore, dovreste capire da voi se tutto ciò sia stato caricato completamente. Per avere un ulteriore conferma, controllare sul filesystem virtuale del kernel in 
 

Spoiler

/sys/kernel/iommu_groups

Se sono presenti cartelle, siete riusciti a caricare completamente l'estensione.


Esclusione della GPU dall'host


Per il corretto funzionamento della virtualizzazione è necessario che non siano caricati alcuni moduli kernel relativi alla vostra scheda da virtualizzare, dovrete quindi mettere in blacklist i driver radeon o nouveau a seconda della scheda video che utilizzate. Per far ciò, su ArchLinux ho modificato in  

Spoiler

/etc/modprobe.d/blacklist.conf 

aggiungendo 

Spoiler

blacklist radeon

Ovviamente, sostituirete radeon col driver che la vostra scheda video utilizza
ATTENZIONE, CON FGLRX O NVIDIA potrebbe dare problemi. Si consiglia l'utilizzo dei driver open.

In questo modo, al prossimo riavvio X.org partirà senza aver caricato i moduli della scheda video che vorrete virtualizzare. Necessario per il corretto caricamento.


Configurazione e assegnazione a vfio/pci-stub dell'indirizzo fisico della scheda video
 


metodo vfio-pci (TESTATO)

Caricamento moduli essenziali


A seconda della distribuzione, potrebbe essere necessario assicurarsi che i moduli vfio e pci stub siano caricati nel initramfs.
Su arch, modificare 

Spoiler

/etc/mkinitcpio.conf

Spoiler

MODULES="vfio vfio_iommu_type1 vfio_pci vfio_virqfd"

e ricostruire l'initramfs con

Spoiler

mkinitcpio -p linux

Assegnazione a vfio-pci


Sempre in

Spoiler

/etc/modprobe.d


aggiungere con un editor di testo al file procediamo all'assegnazione degli indirizzi.

Spoiler

vfio.conf

Spoiler

options vfio-pci ids=1002:6719,1002:aa80,10de:0392

Dove, separati da una virgola, inserirete l'indirizzo PCI della vostra scheda video, per vederli
 

Spoiler

lspci -nn

Riavviando il vostro computer, potrete verificare se il modulo vfio-pci ha bindato correttamente la vostra GPU con

Spoiler

dmesg | grep vfio

Dovrebbe restituire qualcosa di simile a

Spoiler

[    0.456472] VFIO - User Level meta-driver version: 0.3
[    0.470269] vfio_pci: add [10de:13c2[ffff:ffff]] class 0x000000/00000000
[    0.483631] vfio_pci: add [10de:0fbb[ffff:ffff]] class 0x000000/00000000
[    0.496998] vfio_pci: add [8086:8ca0[ffff:ffff]] class 0x000000/00000000
[    2.420184] vfio-pci 0000:0a:00.0: enabling device (0000 -> 0003)
[   38.590395] vfio_ecap_init: 0000:0a:00.0 hiding ecap 0x1e@0x258
[   38.590413] vfio_ecap_init: 0000:0a:00.0 hiding ecap 0x19@0x900
[   38.606881] vfio-pci 0000:0a:00.1: enabling device (0000 -> 0002)
[   38.620241] vfio-pci 0000:00:1b.0: enabling device (0000 -> 0002)
...

metodo pci-stub (NON PERSONALMENTE TESTATO)

In caso abbiate problemi a bindare con vfio, potreste provare ad utilizzare il modulo pci-stub. Pci stub richiede alcune modifiche sempre al bootloader come spiegato in precedenza aggiungendo oltre a intel_iommu=on :
 

Spoiler

pci-stub.ids=1002:6719,1002:aa80

Sempre utilizzando gli indirizzi trovati in precedenza con lspci -n


in /etc/mkinitcpio.conf invece

Spoiler

MODULES="... pci-stub ..."

Dopo aver ricreato l'initramfs con mkinitcpio -p linux e il bootloader con grub-mkconfig se è stato tutto eseguito correttamente
 

Spoiler

[    2.390128] pci-stub: add 1002:6719 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[    2.390143] pci-stub 0000:01:00.0: claimed by stub
[    2.390150] pci-stub: add 1002:AA80 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[    2.390159] pci-stub 0000:01:00.1: claimed by stub
[    2.390150] pci-stub: add 1002:0392 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[    2.390159] pci-stub 0000:04:00.0: claimed by stub

Differenze con ubuntu


Il procedimento su ubuntu è lo stesso, ma in modo diverso dovremmo effettuare le operazioni qui descritte. Per avere meglio idea su procedimenti specifici a questa distribuzione in caso di problemi, consultate i link generali di aiuto in particolare sull'ubuntu forum.

Al posto di bindare gli indirizzi con vfio-pci o con pci-stub è possibile utilizzare lo script utilizzato lì. 

Caricamento moduli essenziali
 

Spoiler

/etc/modules

aggiungendo

Spoiler

lp
rtc
pci_stub
vfio
vfio_iommu_type1
vfio_pci
kvm
kvm_amd

 

metodo Assegnazione PCI al posto di utilizzare GRUB solo con PCI-STUB (Solo ubuntu)
e, sempre per pci-stub, aggiungere in 

Spoiler

/etc/initramfs-tools/modules

Spoiler

pci_stub ids=1002:6719,1002:aa80,8086:1539,1912:0014,1412:1724,1849:1539

Ovviamente ricreando l'initramfs con update-initramfs

Per vfio-pci il procedimento è uguale ad arch visto che modprobe.d è presente.


Configurazione QEMU

Se non avete avuto problemi con i passi precedenti, possiamo procedere con la configurazione della macchina virtuale vera e propria.
Per far partire QEMU usiamo preferibilmente il bios-uefi (alias ovmf)

Non starò a trattare su come configurare e creare una macchina virtuale con QEMU, per dettagli su come funziona QEMU


 

Alcune persone sono riuscite a farlo partire senza BIOS uefi virtualizzando la scheda video ma personalmente non l'ho testato, dipende comunque da come avviate il vostro sistema operativo guest e sopratutto come lo installate visto che non potrete cambiarlo in seguito.

 sudo pacman -S ovmf
sudo apt-get install ovmf

I passi essenziali sono:
Aggiungere BIOS UEFI (Testato)
Aggiungere scheda video con vfio-pci (Testato)


Premesso che abbiate ora già una macchina virtuale funzionante, prima di aggiungere 
vfio-pci effettuate delle prove.

Questa è la mia configurazione, ho evidenziato ciò che è necessario al corretto caricamento della scheda video.

Per creare la macchina virtuale ho utilizzato come controller del disco VirtIO che consiglio anche se le prestazioni avendo un SSD non sono delle migliori. Sconsiglio l'utilizzo di una partizione fisica come ho fatto io visto che i driver preinstallati che avevo utilizzato avviandolo come PC fisico si sono rivelati incompatibili con la macchina virtuale, è consigliabile quindi utilizzare una installazione pulita di WIndows 10 o altro.

Il bios uefi tipicamente risiede in /usr/share/ovmf e dovrete caricarlo a mano.

 

Spoiler

!/bin/sh
export QEMU_AUDIO_DRV="pa"
qemu-system-x86_64 \
        -enable-kvm \
        -m 4096 \
        -usbdevice mouse \
        -drive if=pflash,format=raw,readonly,file=/usr/share/ovmf/ovmf_x64.bin \
        -cpu host,kvm=off,check \
        -smp sockets=1,cores=4 \
        -vga std \
        -soundhw hda \
        -device virtio-scsi-pci,id=scsi \
        -drive file=/dev/sdb,id=disk,format=raw,if=none,cache=none,aio=native -device scsi-hd,drive=disk \
        -device vfio-pci,host=01:00.0 \
        -device vfio-pci,host=01:00.1
 

Dopo di che, a seconda dell'output che utilizzate, switchate e vedrete la vostra macchina virtuale utilizzare la vostra scheda video fisica. Potete comodamente installare i driver della vostra scheda video e iniziare a provare qualche gioco.


Dal momento che non sono riuscito a far funzionare tutto ciò con libvirt non so se per problemi di compatibilità, in caso di aggiornamenti aggiornerò il post per correggere eventuali errori o aggiungere altre cose.

Ho fatto un video di quel che sono riuscito a far partire

POST IN AGGIORNAMENTO

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Crea un account o accedi per lasciare un commento

You need to be a member in order to leave a comment

Crea un account

Iscriviti per un nuovo account nella nostra community. È facile!


Registra un nuovo account

Accedi

Sei già registrato? Accedi qui.


Accedi Ora
Accedi per seguire questo  
Followers 0

  • Chi è Online Visualizza tutti

    Non ci sono utenti registrati online

  • Risposte

    • FreeBSD vs OpenBSD: quale preferite?
      FreeBSD o OpenBSD? Semplicità d'uso, diffusione, e flessibilità, oppure sicurezza estrema? Io personalmente ho messo le mani solo sul primo, ma sono molto tentato di provare il secondo. Ditemi le vostre opinioni, esperienze, e gli usi che ritenete siano più adatti ad ognuno!
    • FreeBSD vs OpenBSD: quale preferite?
      FreeBSD o OpenBSD? Semplicità d'uso, diffusione, e flessibilità, oppure sicurezza estrema? Io personalmente ho messo le mani solo sul primo, ma sono molto tentato di provare il secondo. Ditemi le vostre opinioni, esperienze, e gli usi che ritenete siano più adatti ad ognuno!
    • Calcolare le potenze in C
      Grazie della dritta, ho risolto 
    • Calcolare le potenze in C
      Potrei sbagliarmi ma non dovresti compilare linkando il riferimento alla libreria math? (-lm come argomento a gcc sd non erro)
    • [ARTICOLO]KDE Neon UE 5.6 rilasciato
      Per chi non lo sapesse, KDE Neon è una distribuzione realizzata direttamente dal team di KDE, è attualmente basata su Ubuntu 16.04 LTS e il suo obiettivo è fornire all'utente finale un ambiente KDE-centrico sempre aggiornato all'ultima versione possibile. Se volete provarla sul fondo troverete il link di download, ma vi avviso che non è ancora una distribuzione adatta all'uso quotidiano: Per maggiori informazioni: KDE Neon KDE Neon Download Fonte.
      Visualizza tutto articolo