QEMU USB passthrough problema

Van egy “DuoLabs CAS Interface 2 Plus” nevu hardverem (link), amit kb 8 eve nem hasznaltam, most at akartam irni egy CAS kartya Wi-Fi hozzaferesi adataut. Van hozza x86 es x86-64-es Windows driver, ez nyilvan nem fog AArch64 Windowsra telepedni, ugyhogy felraktam egy QEMU-t, az akutalis legujabbat.

igy forditottam
./configure --enable-tcg --enable-attr --enable-system --target-list=i386-softmmu,x86_64-softmmu --prefix=/opt/qemusystem --enable-cocoa --enable-slirp --enable-slirp-smbd --enable-libusb --enable-usb-redir --enable-spice
Majd feltelepitettem egy XP-t, belottem az emulalt hardverek helyett a virtio verziokat, es vegul kijott az, hgy igy inditom az XP-t:
/opt/qemusystem/bin/qemu-system-i386 \
    -name "Windows XP" \
    -uuid "522BE086-6F07-4D4F-BA5A-0A1622BDED16" \
    -monitor stdio \
    -machine type=pc,vmport=on \
    -nodefaults \
    -cpu qemu32 \
    -accel tcg,thread=multi,tb-size=512 \
    -smp cpus=2,sockets=1,cores=1,threads=2 \
    -boot order=dc \
    -m size=2G \
    -rtc base=utc \
    -audiodev coreaudio,id=audio0 \
    -blockdev driver=file,node-name=diskfile0,filename=Virtual\ Disk-flat.vmdk \
    -blockdev driver=raw,node-name=disk0,file=diskfile0 \
    -netdev user,id=usernet0,smb=${HOME},hostfwd=tcp::29000-:5900 \
    -display cocoa,show-cursor=on,zoom-to-fit=off \
    -device qxl-vga,vgamem_mb=16 \
    -device virtio-blk-pci,drive=disk0 \
    -device virtio-net-pci,netdev=usernet0,mac=00:16:3e:52:e6:34 \
    -device ich9-usb-ehci1,multifunction=on,id=ehci-1 \
    -device ich9-usb-uhci1,multifunction=on,id=uhci-1,masterbus=ehci-1.0,firstport=0 \
    -device ich9-usb-uhci2,multifunction=on,id=uhci-2,masterbus=ehci-1.0,firstport=2 \
    -device ich9-usb-uhci3,multifunction=on,id=uhci-3,masterbus=ehci-1.0,firstport=4 \
    -device ich9-usb-ehci2,multifunction=on,id=ehci-2 \
    -device ich9-usb-uhci4,multifunction=on,id=uhci-4,masterbus=ehci-2.0,firstport=0 \
    -device ich9-usb-uhci5,multifunction=on,id=uhci-5,masterbus=ehci-2.0,firstport=2 \
    -device ich9-usb-uhci6,multifunction=on,id=uhci-6,masterbus=ehci-2.0,firstport=4 \
    -device usb-kbd,bus=ehci-1.0 \
    -device usb-tablet,bus=ehci-1.0 \
    -blockdev driver=file,node-name=x86diskfile0,filename=x86\ Disk-flat.vmdk \
    -blockdev driver=raw,node-name=x86disk0,file=x86diskfile0 \
    -device virtio-blk-pci,drive=x86disk0 \
    -device sb16,audiodev=audio0,dma16=5,dma=1,iobase=544,irq=7 \
Kiprobaltam, mezei USB-to-PS/2 adaptert at tudok adni. az mukodik is, illetve a kartyaolvaso is megjelent, de nem volt keznel semmilyen kartya, hogy beledugva kiprobaljam :D
(qemu) info usbhost
  Bus 2, Addr 7, Port 1.2, Speed 480 Mb/s
    Class ff: USB device 04b4:2225
  Bus 0, Addr 10, Port 2.4.2.2, Speed 5000 Mb/s
    Class 00: USB device 11b0:6368, Multi-Reader
  Bus 64, Addr 8, Port 1.3.2, Speed 480 Mb/s
    Class 00: USB device 05ac:12a8, iPhone
  Bus 64, Addr 7, Port 1.2, Speed 480 Mb/s
    Class 00: USB device 05ac:12ab, iPad
  Bus 64, Addr 5, Port 1.5, Speed 480 Mb/s
    Class ef: USB device 05ac:1112, FaceTime HD Camera (Display)
  Bus 64, Addr 4, Port 1.7, Speed 12 Mb/s
    Class 00: USB device 05ac:9227, Apple Thunderbolt Display
  Bus 64, Addr 2, Port 1.4, Speed 12 Mb/s
    Class 00: USB device 05ac:1107, Display Audio
  Bus 0, Addr 5, Port 1.1.8, Speed 12 Mb/s
    Class 00: USB device 2188:0035, Element Hub

(qemu) device_add usb-host,hostbus=0,hostport=2.4.2.2,id=usbdev0
(qemu) device_del usbdev0

Ha viszont, ezt a CAS Interface eszkot adom at (az elozo listaban ez a 04b4:2225), akkor ehhez ugyan fel tudom telepiteni a drivert, de felkialtojeles lesz az eszkoz, mert “This device cannot start. (Code 10)”. Probaltam rootkent illetve sima mezei userkent is, az eredmeny ugyonez. Ugy emlekszem, hogy ezt virtualizalt Windowson hasznaltam anno, igy fogtam egy x86-64-es Linuxot egy masik gepen, VirtualBox-ban is felraktam egy XP-t, es lass csodat, ott ment. Tehat, az eszkoz mukodik, “at lehet adni” (ez azert volt kerdeses, mert sok, USB streaminget hasznalo eszkot nem lehet atadni, pl a legtobb capture kartyat sem).

Megfogtam hat a VMware Fusion 13.5.2-t, felraktam benne egy AArch64-es AlmaLinux 9-et, majd szinte az elobb is lathato configure parannccsal

oda is lebuildeltem ugyonezt a QEMU-t
./configure --enable-tcg --enable-attr --enable-system --target-list=i386-softmmu,x86_64-softmmu --prefix=/opt/qemusystem --enable-gtk --enable-alsa --enable-slirp --enable-slirp-smbd --enable-libusb --enable-usb-redir --enable-spice
A futtatas csak egy kicsit volt masabb:
LD_LIBRARY_PATH=/opt/qemusystem/lib64 /opt/qemusystem/bin/qemu-system-i386 \
    -name "Windows XP" \
    -uuid "522BE086-6F07-4D4F-BA5A-0A1622BDED16" \
    -monitor stdio \
    -machine type=pc,vmport=on \
    -nodefaults \
    -cpu qemu32 \
    -accel tcg,thread=multi,tb-size=512 \
    -smp cpus=2,sockets=1,cores=1,threads=2 \
    -boot order=dc \
    -m size=2G \
    -rtc base=utc \
    -blockdev driver=file,node-name=diskfile0,filename=Virtual\ Disk-flat.vmdk \
    -blockdev driver=raw,node-name=disk0,file=diskfile0 \
    -netdev user,id=usernet0,smb=${HOME},hostfwd=tcp::29000-:5900 \
    -display gtk \
    -device qxl-vga,vgamem_mb=16 \
    -device virtio-blk-pci,drive=disk0 \
    -device virtio-net-pci,netdev=usernet0,mac=00:16:3e:52:e6:34 \
    -device ich9-usb-ehci1,multifunction=on,id=ehci-1 \
    -device ich9-usb-uhci1,multifunction=on,id=uhci-1,masterbus=ehci-1.0,firstport=0 \
    -device ich9-usb-uhci2,multifunction=on,id=uhci-2,masterbus=ehci-1.0,firstport=2 \
    -device ich9-usb-uhci3,multifunction=on,id=uhci-3,masterbus=ehci-1.0,firstport=4 \
    -device ich9-usb-ehci2,multifunction=on,id=ehci-2 \
    -device ich9-usb-uhci4,multifunction=on,id=uhci-4,masterbus=ehci-2.0,firstport=0 \
    -device ich9-usb-uhci5,multifunction=on,id=uhci-5,masterbus=ehci-2.0,firstport=2 \
    -device ich9-usb-uhci6,multifunction=on,id=uhci-6,masterbus=ehci-2.0,firstport=4 \
    -device usb-kbd,bus=ehci-1.0 \
    -device usb-tablet,bus=ehci-1.0 \
    -blockdev driver=file,node-name=x86diskfile0,filename=x86\ Disk-flat.vmdk \
    -blockdev driver=raw,node-name=x86disk0,file=x86diskfile0 \
    -device virtio-blk-pci,drive=x86disk0 \

Itt, tehat, bebootoltam ugyonazt az imaget, amit az elobb. Atadtam a VMware menujeben, a VMwareben futo Linuxnak az eszkozt, majd miutan megjelent a virtualizalt Linuxban, az elozo parancshoz hasonloan atadtam az emulalt QEMU-nak. Lass csodat, ez is mukodik.

Ami meg fura, hogy az UTM app alatt is mukodik, ami szinten egy QEMU frontend. Ami feltunt, hogy a VMware es az UTM entitlementjei kozott is szerepel a “com.apple.vm.device-access”, ami az Apple doksija szerint, pont a virtualisgep USB passthroughhoz kell. Azt is megneztem, hogy libusb-t es libusbredir-t hasznal a QEMU eszkozatadashoz. Itt, azt irjak, hogy ha nincs meg ez az entitlement, akkor root-kent ugyonugy mukodnie kellene a dolognak, mint userkent, az entitlement birtokaban (tehat, elvileg van a libusbben osx tamogatas ehhez), viszont, szerintem, nem megy.

Irtam az Applenak, hogy szeretnek kerni jogosultsagot ennek az entitlementnek a hasznalatahoz, de 99% biztos vagyok benne, hogy el fogjak utasitani.

Valaki szorakozott mar ilyesmi dologgal? Illetve, tud valaki mas olyan QEMU frontendrol,

  • ami nem sandboxos, illetve tetszoleges helyen tudja tarolni az imageket (az UTM ragaszkodik ahhoz, hogy a disk imagek qcow formatumban a ~/Library/Containers alatt legyenek)
  • szabadon belenyulhatok a QEMU-nak adott parameterekbe
  • a qemu osszes architekturajahoz szallit binarist, amit a leheto legtobb featureval konfiguraltak
  • kivulrol is hivogathatom belole a QEMU binarisait
  • rendelkezik ezzel az entitlementtel, hogy mukodjon benne az eszkozatadas

Azert gyanakszom egyebkent az entitlementre, mert UTM es VMware eseten is van jovahagyas, hogy atadom az eszkozt, viszont a kezzel, sajat magamnak inditott QEMU eseten nincs.

szerk: Nyilvan, az elso otletem az lett volna, hogy eleg lenne az x86/x86-64-es drivert portolni AArch64 Windowsra, majd ez megoldana minden problemat, mert a VMware jol at tudja adni az eszkozt. Ezt meg is tudnam csinalni, ugyhogy, meg is kerestem, hogy az eredeti vendor meg letezik, de mivel 66x leirjak, a weboldalukon sok-sok helyre, hogy ezekkel a regi hardverekkel mar semennyire nem foglalkoznak (latszolag total mas a profil), ne irjon nekik senki levelet, igy nincs ertelme levelet irnom, hogy elkerjem a driveruk forrasat.

1 Like

Ahh, megfejtettem! A QEMU kodjaban hagy valamennyi kivannivalot a minosege az USB atadas kodjanak. Szoval, ha kikeruljuk a QEMU-t, es csak az libusbredir-t hasznaljuk, akkor kisimunak a rancok es betelepszik lelkunkbe a vilagbeka! Masik elonye ennek a megoldasnak, hogy a QEMU-nak nem kell rootkent futnia, illetve, ugy is futhat a TE gepeden a QEMU, hogy egy masik gepen van bedugva az eszkoz. Sott, tovabbmegyek, mivel az egesz protokoll igy halozati alapon megy, akar az is kivitelezheto, hogy valami masik helyen fut a QEMU (ahol pl van KVM gyorsitas) te pedig a sajat gepedbe dugod be a fizikai USB eszkot. Semmi mas nem szukseges, csak az, hogy a kliens (ami ebben az esetben a QEMU) el tudja erni a szervert (ami az a gep, ahova az eszkoz fizikailag be van dugva).

A hasznalata is pofonegyszeru, a QEMU-ba kell tamogatas illetve kell maga a szerver alkalmazas. A szerver alkalmazas az a libusbredir csomagban van, tulajdonkeppen, ez maga a “mintakod” az egeszre. A QEMU-nal meg be kell kapcsolni, de ha fenn van a libusbredir, akkor szerintem magatol megtalalja. Ha pedig van meg szabad port az emulalt PC-ben, akkor maris lehet arra attacholni a devicet.

Ki kell talalni mit akar megosztani (04b4:2225) az ember, majd el kell inditani a szervert, megadva, hogy milyen interfacen es porton listeneljen kliensekre varva:

sudo usbredirect --device 04b4:2225 --as 127.0.0.1:6543

Ezutan a QEMU monitorban letre kell hozni egy karakeres eszkot, ami erre a socketre csatlakozik, illetve hozza kell adni az eszkozt a virtualis gephez. Itt fontos a reconnect=1, mert ha megszakad a socket kapcsolat, pl mert resetelni kene az eszkot vagy ilyenek, akkor ha kilovod a szervert, ujra inditva, visszacsatlakozik es ujra megjelenik felcsatalkoztatva az emulalt gepre.

chardev-add socket,id=charredir0,host=127.0.0.1,port=6543,reconnect=1
device_add usb-redir,chardev=charredir0,id=redir0

Ha pedig mar nem kell, akkor lehet torolni. Nalam 50 esetbol 49x torlodott a socket is, amikor az eszkot toroltem, de az ordog nem alszik.

device_del redir0
chardev-remove charredir0

Nekem egyebkent, tul bonyolult es korlatozo az UTM (nem tudom tetszoleges helyre rakni a disk imageket, nem tudok tetszoleges hardvert belerakni az emulalt gepbe, kivenni olyat, amit o mindenkeppen be akar rakni, stb stb), ezert szorakozok a pucer QEMU-val. Viszont most, hogy ez megy, lehet ossze kene rakni valami minimalis GUI-t, amivel ezeket a binarisokat tudja inditgatni a szoftver (illetve magat a QEMU-t is), Igy ugye lehetne kattingatos eszozatadas, pont ugy, mintha vmWare lenne.

3 Likes

Értem? :slight_smile: .

Igen.
Nos oszinte leszek. Elvezettel szoktam olvasni @Czo zongemenyeit - meg akkor is, ha lovesem sincs idonkent hogy mirol van szo :slight_smile:

1 Like

Úgy elmennék vele kocsmázni és sör és tüske mellett próbálni beszélgetni nőkről és pornóról.

1 Like

Nem a kocsma lesz a hely, ahol a veletlen is azt tudja hozni, hogy osszefutunk :smiley:

Dehát futottunk már össze kocsmában! :slight_smile:

Az nem veletlen volt :smiley:

1 Like

Jó, ezt a kis csúsztatást megérte : )

1 Like

Ez a téma automatikusan bezárult 60 nappal az utolsó válasz után. Az új válaszok már nem engedélyezettek.