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
Last revisionBoth sides next revision
doc:appunti:linux:sa:qemu_usb_passthrough [2022/11/03 11:01] – [Avviare QEMU] niccolodoc:appunti:linux:sa:qemu_usb_passthrough [2022/11/03 11:49] – [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 10: Line 10:
  
  
-====== Esempio: lettore di flash card USB ======+===== Esempio: lettore di flash card USB =====
  
-===== Identificare la periferica =====+==== Identificare la periferica ====
  
 Consideriamo come esempio un **lettore di flash card**. Inserendo il dispositivo in una porta USB, il sistema ospitante GNU/Linux lo identifica come segue (output del comando **lsusb**): Consideriamo come esempio un **lettore di flash card**. Inserendo il dispositivo in una porta USB, il sistema ospitante GNU/Linux lo identifica come segue (output del 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 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 54: Line 76:
 -usb -device usb-host,hostbus=1,hostport=1.1' -usb -device usb-host,hostbus=1,hostport=1.1'
 </code> </code>
 +
 +Ecco una riga di comando minimale, ma completa per avviare l'emulatore:
 +
 +<code bash>
 +qemu-system-x86_64 -m 4096 -machine accel=kvm \
 +    -device qemu-xhci \
 +    -usb -device 'usb-host,vendorid=0x05e3,productid=0x0723' \
 +    -drive 'file=win10_64bit_c.img,format=raw' -boot c
 +</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. 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 =====
 +
 +  * **[[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.txt · Last modified: 2022/11/03 11:49 by niccolo