User Tools

Site Tools


doc:appunti:linux:sa:qemu_usb_passthrough

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
doc:appunti:linux:sa:qemu_usb_passthrough [2022/11/03 12:14] – [Avviare QEMU] niccolodoc:appunti:linux:sa:qemu_usb_passthrough [2022/11/03 12:49] (current) – [Assegnare i permessi] niccolo
Line 3: Line 3:
 Come passare completamente la gestione di una periferica USB da un sistema virtualizzante (host) **QEMU** (GNU/Linux con KVM) ad un sistema virtualizzato (guest) **Windows 10**. Procedura sperimentata su Debian GNU/Linux 11 Bullseye. Come passare completamente la gestione di una periferica USB da un sistema virtualizzante (host) **QEMU** (GNU/Linux con KVM) ad un sistema virtualizzato (guest) **Windows 10**. Procedura sperimentata su Debian GNU/Linux 11 Bullseye.
  
-Quando si avvia l'emulatore **qemu-system-x86_64** si deve specificare quale periferica USB verrà gestita all'emulatore stesso. È possibile identificare la periferica in tre modi diversi:+Il programma emulatore **qemu-system-x86_64** deve sapere quale periferica USB deve essere collegata alla macchina guest. È possibile identificare la periferica in tre modi diversi:
  
   * Identificazione con **vendorid** e **productid**. Ogni periferica USB ha un identificativo produttore/prodotto che dovrebbe essere univoco. Il sistema operativo GNU/Linux mostra tali codici con il comando **lsusb**.   * Identificazione con **vendorid** e **productid**. Ogni periferica USB ha un identificativo produttore/prodotto che dovrebbe essere univoco. Il sistema operativo GNU/Linux mostra tali codici con il comando **lsusb**.
Line 39: Line 39:
   * **Port 1.1** - La porta ha un identificativo gerarchico con il punto utilzzato come separatore: abbiamo l'hub numero **1** seguito dal numero della porta **1**.   * **Port 1.1** - La porta ha un identificativo gerarchico con il punto utilzzato come separatore: abbiamo l'hub numero **1** seguito dal numero della porta **1**.
  
-==== Avviare QEMU ====+==== Assegnare i permessi ==== 
 + 
 +È possibile eseguire il programma ''qemu-system-x86_64'' da utente non privilegiato, ma l'emulatore dovrà avere pieno accesso alla periferica USB di cui si desidera il passthrough a Windows. Dopo aver identificato **hostbus** e **hostaddr** assegnati dal kernel alla periferica, l'utente root potrà assegnare i permessi necessari. Ad esempio con: 
 + 
 +<code> 
 +chmod 0666 /dev/bus/usb/001/026 
 +</code> 
 + 
 +È possibile configurare il sistema in modo tale che una determinata periferica riceva automaticamente gli opportuni permessi ad ogni connessione. Ad esempio si potrebbe volere che la periferica sia in lettura/scrittura per gli utenti che appartengono al gruppo **plugdev** (in Debian è il gruppo degli utenti autorizzati a montare e smontare i dispostivi rimuovibili). Per ottenere questo risultato si crea un file ad esempio **/etc/udev/rules.d/99-flash-card-reader.rules** con il seguente contenuto: 
 + 
 +<file> 
 +SUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="05e3", ATTR{idProduct}=="0723", GROUP="plugdev", MODE="0660" 
 +</file> 
 + 
 +Per forzare il sistema **udev** a rileggere i file di configurazione si esegue: 
 + 
 +<code> 
 +udevadm control --reload-rules && udevadm trigger 
 +</code> 
 + 
 +Alla successiva connessione della periferica si può verificare che abbia ricevuto i giusti permessi. 
 + 
 +==== Aggiungere la periferica all'avvio di QEMU ====
  
 Se la periferica è già collegata all'host al momento dell'avvio di QEMU, è possibile passare dalla riga di comando gli opportuni parametri all'emulatore **qemu-system-x86_64**, in modo che la periferica venga **aggiunta** e compaia in **Gesione dispositivi**. Qui di seguito i **parametri** per fare il passthrough della periferica identificandola in uno dei tre modi possibili: Se la periferica è già collegata all'host al momento dell'avvio di QEMU, è possibile passare dalla riga di comando gli opportuni parametri all'emulatore **qemu-system-x86_64**, in modo che la periferica venga **aggiunta** e compaia in **Gesione dispositivi**. Qui di seguito i **parametri** per fare il passthrough della periferica identificandola in uno dei tre modi possibili:
Line 64: Line 86:
 </code> </code>
  
-Notare la presenza del device **qemu-xhci**; se la macchina ospite supporta le specifiche hardware XHCI (ogni macchina successiva al 2010 dovrebbe) è opportuno caricare tale emulazione, che supporta con un solo controller le periferiche USB 1.1, USB 2.0 e USB 3.0. Utilizzando questo driver non è necessario aggiungere la specifica ''%%bus={usb-bus.0|ehci.0}%%'' nei comandi che aggiungono le periferiche USB.+Notare la presenza del device **qemu-xhci**; se la macchina ospite supporta le specifiche hardware XHCI (ogni macchina successiva al 2010 dovrebbe) è opportuno caricare tale emulazione, che supporta con un solo controller le periferiche USB 1.1, USB 2.0 e USB 3.0. Utilizzando questo driver non è necessario aggiungere la specifica ''%%bus={usb-bus.0|ehci.0}%%'' nei comandi che aggiungono le periferiche USB. Senza esplicitare quel device l'emulazione delle periferiche **USB 3.0 non funziona** e la periferica compare in Gestione dispositivi di Windows con un **triangolo giallo con punto esclamativo**. 
 + 
 +==== Aggiungere la periferica dalla console QEMU ==== 
 + 
 +Se la periferica USB viene collegata **dopo che QEMU è stato avviato**, è possibile utilzzare la console di QEMU per aggiungere la periferica al sistema Windows guest. 
 + 
 +Attivando **Show Tabs** dal menu **View** di QEMU sarà possibile accedere alla console **compat_monitor0**, quindi si possono eseguire i comandi **info usbhost** per verificare che a periferica sia stata riconosciuta: 
 + 
 +<code> 
 +(qemu) info usbhost 
 +  Bus 1, Addr 26, Port 1.1, Speed 480 Mb/s 
 +    Class 00: USB device 05e3:0723, USB Storage 
 +</code> 
 + 
 +**ATTENZIONE**! Se QEMU non ha identificato correttamente il tipo della periferica (//USB Storage// in questo caso), è possibile che manchino i permessi di lettura/scrittura sulla periferica stessa. 
 + 
 +A questo punto la periferica può essere aggiunta con un comando del tipo: 
 + 
 +<code> 
 +(qemu) device_add usb-host,vendorid=0x05e3,productid=0x0723 
 +</code>
  
 +Immediatamente il **Gestione dispositivi** di Windows dovrebbe riconoscere la nuova periferica.
  
 ===== Web References ===== ===== Web References =====
  
   * **[[https://qemu-project.gitlab.io/qemu/system/devices/usb.html|USB emulation]]**   * **[[https://qemu-project.gitlab.io/qemu/system/devices/usb.html|USB emulation]]**
 +  * **[[https://gist.github.com/ichisadashioko/cfc6446764516bf7eccaffdb3799f041|QEMU USB passthrough user guide]]**
  
doc/appunti/linux/sa/qemu_usb_passthrough.1667474041.txt.gz · Last modified: 2022/11/03 12:14 by niccolo