Passthrough Qemu USB (invité Windows)

15

J'ai un USB ADC / DAC et un système d'acquisition de données propriétaire protégé par HASP pour cela, les deux ne fonctionnent pas sous Linux. J'essaye de le faire fonctionner dans la machine virtuelle Windows en utilisant qemu. Voici les appareils:

$ lsusb
...
Bus 003 Device 011: ID 0529:0001 Aladdin Knowledge Systems HASP copy protection dongle
Bus 003 Device 010: ID 16b2:1001

$ ls -l /dev/bus/usb/003
...
crw-rw-r-- 1 root qemu 189, 265 дек 22 18:29 010
crw-rw-rw- 1 root qemu 189, 266 дек 22 18:29 011

Mon utilisateur est membre du groupe qemu. Ligne de commande Qemu:

qemu-system-x86_64 \
    -enable-kvm \
    -m 2G \
    -device usb-ehci,id=usb,bus=pci.0,addr=0x4 \
        --device usb-host,vendorid=0x16b2,productid=0x1001 \ # ADC/DAC
    -device piix3-usb-uhci,id=usb1,bus=pci.0,addr=0x5 \
        --device usb-host,vendorid=0x0529,productid=0x0001 \ # HASP
    -usbdevice tablet \
    -net nic \
    -net bridge,br=br0 \
    -vga qxl \
    -spice port=5930,disable-ticketing \
    -device virtio-serial-pci \
    -device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0 \
    -chardev spicevmc,id=spicechannel0,name=vdagent \
    -drive file=/mnt/data/win-patch.img,if=virtio

Le problème est que les deux appareils s'affichent en invité, mais ne fonctionnent pas. L'ADC / DAC doit s'identifier comme un lecteur de bloc USB et apparaît comme l'un dans la liste des appareils, mais ne fonctionne pas. J'ai installé des pilotes HASP pour mon dongle sur le système invité, mais le logiciel DAS ne le reconnaît pas. Qu'est-ce que je fais mal? Capture d'écran d'invité Windows

Axon
la source

Réponses:

21

J'ai finalement obtenu de l'aide sur l'autre forum. Le problème semble être lié à l'implémentation du bus USB dans le chipset I440FX qui est émulé par qemu par défaut (détails ici ). La solution consiste à émuler le chipset ICH9 à la place. Cela se fait en ajoutant un -M q35paramètre. J'ai également changé la façon dont les périphériques USB sont spécifiés et la ligne de commande finale ressemble à ceci:

qemu-system-x86_64 \
    -enable-kvm \
    -M q35 \
    -m 2G \
    -usb -usbdevice host:16b2:1001 \
    -usb -usbdevice host:0529:0001 \
    -usbdevice tablet \
    -net nic \
    -net bridge,br=br0 \
    -vga qxl \
    -spice port=5930,disable-ticketing \
    -device virtio-serial-pci \
    -device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0 \
    -chardev spicevmc,id=spicechannel0,name=vdagent \
    -drive file=/mnt/data/win-patch.img,if=virtio

Tout fonctionne parfaitement maintenant.


Mise à jour pour 2019: l' usb-deviceoption est déconseillée; vous pouvez obtenir le même résultat en le remplaçant par -usb -deviceet en spécifiant l'ID du produit et du fournisseur en nombres hexadécimaux, de la même manière:

qemu-system-x86_64 \
    -enable-kvm \
    -M q35 \
    -m 2G \
    -usb -device usb-host:productid=0x16b2,vendorid=0x1001 \
    -usb -device usb-host:productid=0x0529,vendorid=0x0001 \
    -usbdevice tablet \
    -net nic \
    -net bridge,br=br0 \
    -vga qxl \
    -spice port=5930,disable-ticketing \
    -device virtio-serial-pci \
    -device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0 \
    -chardev spicevmc,id=spicechannel0,name=vdagent \
    -drive file=/mnt/data/win-patch.img,if=virtio

référence: https://git.qemu.org/?p=qemu.git;a=blob_plain;f=docs/usb2.txt;hb=HEAD

Axon
la source