我尝试以下方法通过 macOS 主机上运行的 Ubuntu 来宾访问 USB 存储设备:
sudo qemu-system-x86_64 -m 8G -boot d -smp 4 -net nic -net user \
-hda Ubuntu/ubuntu.img -machine type=q35,accel=hvf \
-device intel-hda -device hda-duplex \
-device nec-usb-xhci -device usb-host,vendorid=0x0781,productid=0x5580
不幸的是,我无法从访客访问 USB 设备。访客系统日志说:
... kernel: [...] usb 5-1: USB new high-speed USB device number 3 using xhci_hcd
... kernel: [...] usb 5-1: New USB device found, idVendor=0781, idProduct=5580, bcdDevice= 0.10
... kernel: [...] usb 5-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
... kernel: [...] usb 5-1: Product: Extreme
... kernel: [...] usb 5-1: Manufacturer: SanDisk
... kernel: [...] usb 5-1: SerialNumber: AA010829152XXXXXXX
... kernel: [...] usb 5-1: can't set config #1, error -32
... mtp-probe: checking bus 5 device 3: "/sys/devices/pci0000:00/0000:00:04.0/usb5/5-1"
... mtp-probe: bus: 5, device:3 was not an MTP device
如何成功访问USB设备?
使用物理设备通过 Android Studio 进行 Android 开发需要 USB。
我在文件传输模式下尝试了两个 USB 记忆棒和 Android 智能手机。
版本信息: macOS:10.13.6, qemu:5.1.0, Ubuntu:20.04.
开始之前:确保您的
vendorid
和 productid
与您要共享的设备相匹配。在您的 macOS 来宾上,您可以通过运行 来做到这一点
system_profiler SPUSBDataType
你应该得到类似的东西
USB 3.1 Bus:
Host Controller Driver: AppleUSB...
PCI Device ID: 0x1234
PCI Revision ID: 0x1234
PCI Vendor ID: 0x1234
Bus Number: 0x00
USB 3.1 Storage Device:
Product ID: 0x4242
Vendor ID: 0x2424
Version: 42
Serial Number: ABCDE
Speed: Up to 10 Gb/s
Manufacturer: FooBar
对您来说可能看起来有点不同,但这没关系。对您来说重要的产品和供应商ID是您想要共享的实际设备之一,而不是总线。所以在这种情况下,那就是
vendorid=0x2424,productid=0x4242
一旦一切正确,请确保以 root 身份运行
qemu-system-x86_64
。否则,您将没有 USB 直通的权限。我认为这就是您遇到的问题。因此,使用 qemu-system-x86_64
运行 sudo
:
sudo qemu-system-x86_64 ... -device nec-usb-xhci -device usb-host,vendorid=0x2424,productid=0x4242
libusb 将 USB 主机设备添加到虚拟机。有一个问题,如果设备已被另一个内核扩展声明,libusb 无法在 macOS 上声明该设备。似乎某些内核扩展会自动声明任何连接的设备。因此 libusb 的作者创建了一个解决方法:https://github.com/libusb/libusb/pull/911。
解决方法尚未发布,但您可以使用 homebrew 从 github 构建最新版本的 libusb 并链接它而不是稳定版本:
brew install --head libusb
brew unlink libusb
brew link --head libusb
完成此操作后,使用 sudo 和 USB 主机设备运行 qemu 应该可以正常工作。除了指定
vendorid
和
productid
,您可能还需要指定
hostbus
和
hostport
。您可以使用
info usbhost
在 qemu 监视器中获取它们。