MacOS requires root to pass through USB devices properly
Host environment
- Operating system: macOS 14.0 (23A344)
- OS/kernel version: Darwin XXX 23.0.0 Darwin Kernel Version 23.0.0: Fri Sep 15 14:41:43 PDT 2023; root:xnu-10002.1.13~1/RELEASE_ARM64_T6000 arm64
- Architecture: arm
- QEMU flavor: qemu-system-aarch64
- QEMU version: QEMU emulator version 8.0.4
- QEMU command line:
I'm not sure how to simplify it.
qemu-system-aarch64 -cpu host -accel hvf -smp 8 -m 12288 -M virt -drive file=pflash0.img,format=raw,if=pflash,readonly=on -drive file=pflash1.img,format=raw,if=pflash -device virtio-gpu-pci -display default,show-cursor=on -device qemu-xhci -device usb-kbd -device usb-tablet -monitor unix:qemu-monitor-socket,server,nowait -device intel-hda -device hda-duplex -device virtio-rng-pci -drive file=qemu-arm64.test.img,format=raw,if=virtio,cache=writethrough -nographic -serial mon:stdio -nic user,hostfwd=tcp::8888-:22 -usb -device usb-ehci,id=ehci -device usb-host,vendorid=0x0bda,productid=0x2838 -device usb-host,vendorid=0x0456,productid=0xb673,guest-reset=true,guest-resets-all=true
Built and installed from MacPorts.
Emulated/Virtualized environment
- Operating system: FreeBSD
- OS/kernel version: FreeBSD freebsd 15.0-CURRENT FreeBSD 15.0-CURRENT aarch64 1500000 #4 identvm-n265260-eb6601f5e18: Sun Sep 10 00:42:41 UTC 2023 root@freebsd:/usr/obj/usr/src/arm64.aarch64/sys/GENERIC arm64
- Architecture: aarch64
Description of problem
If I run qemu as a normal user, the PlutoSDR USB device will not work in the VM. For example, the umass device will remain attached to the host system, and will not appear in the guest system. The device will appear in the guest system, but it will fail to be configured:
usb_alloc_device: Failure selecting configuration index 0:USB_ERR_STALLED, port 2, addr 2 (ignored)
I believe that similar issues are happening w/ guest OS's Ubuntu 20.04 and 22.04, but I have not tested them to confirm.
There is no error message (that I noticed) that reports that this might be an issue and that you need to run qemu as root.
Steps to reproduce
- Run qemu like above
- Plug in a PlutoSDR
- See that the device appears in the guest, but does not attach completely
Additional information
The confusing part is that a simple device, an RTL-SDR device will appear to work fine when passed through w/o running as root making things more confusing to debug.
When run qemu as a normal user, the console (includes FreeBSD kernel messages:
login: qemu-system-aarch64: libusb_detach_kernel_driver: -3 [ACCESS]
qemu-system-aarch64: libusb_detach_kernel_driver: -3 [ACCESS]
qemu-system-aarch64: libusb_detach_kernel_driver: -3 [ACCESS]
qemu-system-aarch64: libusb_detach_kernel_driver: -3 [ACCESS]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_detach_kernel_driver: -3 [ACCESS]
qemu-system-aarch64: libusb_detach_kernel_driver: -3 [ACCESS]
qemu-system-aarch64: libusb_detach_kernel_driver: -3 [ACCESS]
qemu-system-aarch64: libusb_detach_kernel_driver: -3 [ACCESS]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_detach_kernel_driver: -3 [ACCESS]
qemu-system-aarch64: libusb_detach_kernel_driver: -3 [ACCESS]
qemu-system-aarch64: libusb_detach_kernel_driver: -3 [ACCESS]
qemu-system-aarch64: libusb_detach_kernel_driver: -3 [ACCESS]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
usb_alloc_device: Failure selecting configuration index 0:USB_ERR_STALLED, port 2, addr 2 (ignored)
ugen1.2: <Analog Devices Inc. PlutoSDR (ADALM-PLUTO)> at usbus1
qemu-system-aarch64: libusb_detach_kernel_driver: -3 [ACCESS]
qemu-system-aarch64: libusb_detach_kernel_driver: -3 [ACCESS]
qemu-system-aarch64: libusb_detach_kernel_driver: -3 [ACCESS]
qemu-system-aarch64: libusb_detach_kernel_driver: -3 [ACCESS]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_detach_kernel_driver: -3 [ACCESS]
qemu-system-aarch64: libusb_detach_kernel_driver: -3 [ACCESS]
qemu-system-aarch64: libusb_detach_kernel_driver: -3 [ACCESS]
qemu-system-aarch64: libusb_detach_kernel_driver: -3 [ACCESS]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
It's not clear what action, if any needs to be taken w/ these error messages. At a minimum, qemu should complain loudly about needing to be run as root, but would be best if it didn't need to run as root, like other VM systems.
If I run qemu as root (via sudo), it attachs as expected:
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
qemu-system-aarch64: libusb_kernel_driver_active: -5 [NOT_FOUND]
ugen1.2: <Analog Devices Inc. PlutoSDR (ADALM-PLUTO)> at usbus1
umass0 on uhub0
umass0: <Mass Storage> on usbus1
umass0: SCSI over Bulk-Only; quirks = 0x0000
umass0:0:0: Attached to scbus0
da0 at umass-sim0 bus 0 scbus0 target 0 lun 0
da0: <Linux File-Stor Gadget 0414> Removable Direct Access SCSI-2 device
da0: 40.000MB/s transfers
da0: 30MB (61441 512 byte sectors)
da0: quirks=0x2<NO_6_BYTE>
urndis0 on uhub0
urndis0: <RNDIS Communications Control> on usbus1
umodem0 on uhub0
umodem0: <CDC Abstract Control Model (ACM)> on usbus1
umodem0: data interface 4, has no CM over data, has no break
Trying root was inspired by: https://github.com/libusb/libusb/issues/1014
From that issue, it appears that this is a qemu build issue and does not have the proper entitlements.