This is an old revision of the document!
QEMU USB device passthrough
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:
- 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 tramite hostbus e hostaddr. Quando una periferica viene connessa ad una porta USB, il sistema operativo GNU/Linux le assegna un indirizzo host relativo al bus USB (un PC generalmente ha diversi bus USB). L'indirizzo è univoco rispetto al bus; si tratta di un numero che si incrementa ad ogni nuova periferica aggiunta. Quindi una periferica che ha ricevuto ad esempio hostaddr 8, se viene scollegata e poi nuovamente collegata può ricevere hostaddr 9. Quando una periferica è connessa è possibile vedere quali hostbus e hostaddr le sono stati assegnati con il comando lsusb.
- Identificazione tramite hostbus e hostport. La posizione fisica di una porta USB è univocamente determinata da due identificatori: uno per il bus USB ed un altro per la porta. Questa modalità consente di determinare a priori la periferica USB da passare all'emulatore, senza sapere marca e modello della periferica e senza consultare quale address ha ricevuto dal kernel. Sarà sufficiente utilizzare sempre la stessa porta fisica per il collegamento. Per ispezionare la gerarchia di bus USB e porte è possibile utilizzare il comando lsusb -t.
Esempio: lettore di flash card USB
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):
Bus 001 Device 026: ID 05e3:0723 Genesys Logic, Inc. GL827L SD/MMC/MS Flash Card Reader
In particolare notiamo:
- Bus 001 - La periferica è collegata al primo bus USB dell'host. Altre porte USB dell'host possono essere collegate a bus diversi.
- Device 026 - Il sistema operativo ha essegnato alla periferica indirizzo 26 sul bus #1. Tale indirizzo cambia se la periferica viene scollegata e quindi ricollegata.
- ID 05e3:0723 - I due numeri esadecimale sono il vendorid e productid codificati nell'hardware della periferica.
Se vogliamo conoscere la posizione fisica sul bus USB utilizziamo il comando lsusb -t:
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/3p, 480M |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/6p, 480M |__ Port 1: Dev 26, If 0, Class=Mass Storage, Driver=usbfs, 480M
In questo caso notiamo:
- Bus 01 - Il bus USB è sempre il numero 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.
Qui di seguito i parametri per lanciare il programma qemu-system-x86_64 e fare il passthrough della periferica identificandola in uno dei tre modi possibili:
-usb -device usb-host,vendorid=0x05e3,productid=0x0723
-usb -device usb-host,hostbus=1,hostaddr=26
-usb -device usb-host,hostbus=1,hostport=1.1'