如何使用qemu模拟USB存储设备连接?

Ray*_*nda 5 usb emulation qemu

I'm writing a program for controlling USB storage device connections (this is a classic subject). All it's ok with my program, but now, I want to write some tests. So in order to do that, I realized I'll need some way of simulate USB connections.

不仅是连接,我还需要能够设置设备属性:容量、格式等......

Ray*_*nda 5

我在QEMU 文档中找到了解决方案:

\n
\n

USB仿真

\n

QEMU 可以模拟 PCI UHCI、OHCI、EHCI 或 XHCI USB 控制器。您可以插入虚拟 USB 设备或真实主机 USB 设备(仅适用于某些主机操作系统)。QEMU 将根据需要自动创建并连接虚拟 USB 集线器以连接多个 USB 设备。[\xe2\x80\xa6]

\n

连接 USB 设备

\n

USB设备可以通过-device usb-...命令行选项或device_addmonitor命令来连接。可用设备有:

\n
usb-storage,drive=drive_id
\n

由drive_id 支持的大容量存储设备(请参阅《系统仿真用户指南》中的磁盘映像章节)。这是 99% 的 USB 记忆棒使用的经典仅批量传输协议。此示例显示它连接到 XHCI USB 控制器以及由原始格式磁盘映像支持的驱动器:

\n
qemu-system [...]                                          \\\n -drive if=none,id=stick,format=raw,file=/path/to/file.img \\\n -device nec-usb-xhci,id=xhci                              \\\n -device usb-storage,bus=xhci.0,drive=stick\n
Run Code Online (Sandbox Code Playgroud)\n
usb-uas
\n

USB 连接的 SCSI 设备。这不会创建 SCSI 磁盘,因此您需要在命令行上显式创建scsi-hdscsi-cd设备,并使用该-drive选项指定这些磁盘所支持的内容。一台usb-uas设备可以处理多个逻辑单元(磁盘)。此示例创建三个逻辑单元:两个磁盘和一个 cdrom 驱动器:

\n
qemu-system [...]                                                \\\n -drive if=none,id=uas-disk1,format=raw,file=/path/to/file1.img  \\\n -drive if=none,id=uas-disk2,format=raw,file=/path/to/file2.img  \\\n -drive if=none,id=uas-cdrom,media=cdrom,format=raw,file=/path/to/image.iso \\\\\n -device nec-usb-xhci,id=xhci                                    \\\n -device usb-uas,id=uas,bus=xhci.0                               \\\n -device scsi-hd,bus=uas.0,scsi-id=0,lun=0,drive=uas-disk1       \\\n -device scsi-hd,bus=uas.0,scsi-id=0,lun=1,drive=uas-disk2       \\\n -device scsi-cd,bus=uas.0,scsi-id=0,lun=5,drive=uas-cdrom\n
Run Code Online (Sandbox Code Playgroud)\n
usb-bot
\n

仅限散装运输存储设备。这为来宾提供了与 相同的 USB 批量传输协议接口usb-storage,但 QEMU 命令行选项的工作方式与此类似usb-uas,并且不会自动为您创建 SCSI 磁盘。usb-bot最多支持 16 个 LUN。与 不同的是usb-uas,LUN 编号必须是连续的,即对于三个设备,您必须使用 0+1+2。上面示例中的 0+1+5 编号usb-uas不适用于usb-bot.

\n
usb-mtp,rootdir=dir
\n

媒体传输协议设备,使用 dir 作为呈现给来宾的文件树的根。

\n
\n

其他可用设备有:usb-ccidusb-audiousb-kbdu2f-{emulated,passthru}canokey等。

\n