[QEMU]USB 仿真

QEMU可以模拟PCI UHCI,OHCI,EHCI或XHCI USB控制器。您可以插入虚拟 USB 设备或真正的主机 USB 设备(仅适用于某些主机操作系统)。QEMU 将根据需要自动创建和连接虚拟 USB 集线器,以连接多个 USB 设备。
USB 控制器
XHCI 控制器支持
QEMU 具有 XHCI 主机适配器支持。与EHCI和UHCI相比,XHCI硬件设计对虚拟化更加友好,因此XHCI仿真使用的资源更少(尤其是CPU)。因此,如果您的来宾支持 XHCI(对于 2010 年左右或之后发布的任何操作系统,情况应该如此),我们建议您使用它:
qemu-device qemu-xhci
XHCI支持USB 1.1,USB 2.0和USB 3.0设备,因此这是您唯一需要的控制器。由于系统中只有一个 USB 控制器(因此只有一个 USB 总线),因此在添加 USB 设备时无需使用 bus= 参数。
超宽带控制器支持
QEMU EHCI 适配器支持 USB 2.0 设备。它可以单独使用,也可以与USB 1.1设备的配套控制器(UHCI,OHCI)一起使用。配套控制器设置使用起来更方便,因为它提供了一个支持 USB 2.0 和 USB 1.1 设备的 USB 总线。有关详细信息,请参阅下一节。
在独立模式下运行 EHCI 时,您也可以为 USB 1.1 设备添加 UHCI 或 OHCI 控制器。但是,每个控制器都会创建自己的总线,因此有两个完全独立的USB总线:一个由UHCI控制器驱动的USB 1.1总线和一个由EHCI控制器驱动的USB 2.0总线。设备必须手动连接到正确的控制器。
将 UHCI 控制器添加到机器的最简单方法是交换机。QEMU将创建UHCI控制器作为PIIX3芯片组的功能。USB 1.1总线将带有名称。pc
-usb
usb-bus.0
可以使用标准交换机将 EHCI 控制器添加到虚拟机。强烈建议为控制器指定一个 ID,以便 USB 2.0 总线获得一个单独的名称,例如 。这将为您提供一个名为 的USB 2.0总线。-device
-device usb-ehci,id=ehci
ehci.0
使用交换机添加 USB 设备时,可以指定它们应连接到的总线。下面是一个完整的示例:-device
qemu-system-x86_64 -M pc ${otheroptions} \ -drive if=none,id=usbstick,format=raw,file=/path/to/image \ -usb \ -device usb-ehci,id=ehci \ -device usb-tablet,bus=usb-bus.0 \ -device usb-storage,bus=ehci.0,drive=usbstick
这会将 USB 平板电脑连接到 UHCI 适配器,将 USB 大容量存储设备连接到 EHCI 适配器。
配套控制器支持
UHCI 和 OHCI 控制器可以连接到由 EHCI 创建的 USB 总线作为配套控制器。这是通过指定 和 属性来完成的。 指定控制器应附加到的总线名称。 指定控制器应连接到的第一个端口,这是必需的,因为通常一个具有六个端口的 EHCI 控制器具有三个 UHCI 配套控制器,每个控制器有两个端口。masterbus
firstport
masterbus
firstport
文档中有一个配置文件,它将为您完成所有这些操作,您可以像这样使用它:
qemu-system-x86_64 -readconfig docs/config/ich9-ehci-uhci.cfg
然后用于将 USB 设备分配到该总线。bus=ehci.0
将开关用于计算机将创建类似的 USB 控制器配置。-usb
q35
连接 USB 设备
USB 设备可以使用命令行选项或监视命令进行连接。可用设备包括:-device usb-...
device_add
usb-mouse
虚拟鼠标。激活后,这将覆盖 PS/2 鼠标仿真。
usb-tablet
使用绝对坐标的指针设备(如触摸屏)。这意味着QEMU能够报告鼠标位置,而无需抓住鼠标。激活时还会覆盖 PS/2 鼠标仿真。
usb-storage,drive=drive_id
由drive_id支持的大容量存储设备(请参阅《系统仿真用户指南》中的“磁盘映像”一章)。这是99%的USB记忆棒使用的经典仅批量传输协议。此示例显示它连接到 XHCI USB 控制器,并具有由原始格式磁盘映像支持的驱动器:
qemu-system-x86_64 [...] \ -drive if=none,id=stick,format=raw,file=/path/to/file.img \ -device nec-usb-xhci,id=xhci \ -device usb-storage,bus=xhci.0,drive=stick
usb-uas
USB 连接的 SCSI 设备。这不会创建 SCSI 磁盘,因此您需要在命令行上显式创建 or 设备,并使用该选项指定这些磁盘由哪些磁盘支持。一个设备可以处理多个逻辑单元(磁盘)。此示例创建三个逻辑单元:两个磁盘和一个 CDROM 驱动器:
scsi-hd
scsi-cd
-drive
usb-uas
qemu-system-x86_64 [...] \ -drive if=none,id=uas-disk1,format=raw,file=/path/to/file1.img \ -drive if=none,id=uas-disk2,format=raw,file=/path/to/file2.img \ -drive if=none,id=uas-cdrom,media=cdrom,format=raw,file=/path/to/image.iso \ -device nec-usb-xhci,id=xhci \ -device usb-uas,id=uas,bus=xhci.0 \ -device scsi-hd,bus=uas.0,scsi-id=0,lun=0,drive=uas-disk1 \ -device scsi-hd,bus=uas.0,scsi-id=0,lun=1,drive=uas-disk2 \ -device scsi-cd,bus=uas.0,scsi-id=0,lun=5,drive=uas-cdrom
usb-bot
仅批量传输存储设备。这为来宾提供了与 相同的 USB 仅批量传输协议接口,但 QEMU 命令行选项的工作方式与 类似,不会自动为您创建 SCSI 磁盘。 最多支持 16 个 LUN。与 不同,LUN 编号必须是连续的,即对于三个设备,必须使用 0+1+2。上面示例中的 0+1+5 编号不适用于 。
usb-storage
usb-uas
usb-bot
usb-uas
usb-uas
usb-bot
usb-mtp,rootdir=dir
媒体传输协议设备,使用 dir 作为呈现给来宾的文件树的根。
usb-host,hostbus=bus,hostaddr=addr
通过总线和加法器标识的主机设备
usb-host,vendorid=vendor,productid=product
通过由供应商和产品 ID 标识的主机设备
usb-wacom-tablet
虚拟 Wacom 数位笔合作伙伴平板电脑。该设备与上述设备类似,但它可以与tslib库一起使用,因为除了触摸坐标之外,它还报告触摸压力。
tablet
usb-kbd
标准 USB 键盘。将覆盖 PS/2 键盘(如果存在)。
usb-serial,chardev=id
串行转换器。这模拟连接到主机字符设备ID的FTDI FT232BM芯片。
usb-braille,chardev=id
盲文设备。这将使用 BrlAPI 在 id 引用的真实或假设备上显示盲文输出。
usb-net[,netdev=id]
支持 CDC 以太网和 RNDIS 协议的网络适配器。id 指定用 定义的 netdev。例如,用户模式网络可以与
-netdev …,id=id
qemu-system-x86_64 [...] -netdev user,id=net0 -device usb-net,netdev=net0
usb-ccid
智能卡读卡器设备
usb-audio
USB 音频设备
u2f-{emulated,passthru}
通用第二因素设备
canokey
实现FIDO2,OpenPGP,PIV等的开源安全密钥。有关详细信息,请参阅 CanoKey QEMU。
物理端口寻址
对于上述所有 USB 设备,默认情况下,QEMU 会将设备插入指定 USB 总线上的下一个可用端口,如果未显式指定,则插入到某些可用的 USB 总线上。如果需要,还可以指定设备在来宾中显示的物理端口。这可以使用该属性完成。UHCI 有两个根端口 (1,2)。EHCI 有六个根端口 (1-6),模拟 (1.1) USB 集线器有八个端口。port
将平板电脑插入 UHCI 端口 1 的工作原理如下:
-device usb-tablet,bus=usb-bus.0,port=1
将集线器插入 UHCI 端口 2 的工作原理如下:
-device usb-hub,bus=usb-bus.0,port=2
将虚拟 U 盘插入刚刚插入的集线器的端口 4,按如下方式工作:
-device usb-storage,bus=usb-bus.0,port=2.4,drive=...
在监视器中,属性规范。如果您也想拔下设备,则应指定一些可用于引用设备的唯一ID。然后,您可以使用 稍后拔下设备。例如:device_add` command also accepts a ``port
device_del
(qemu) device_add usb-tablet,bus=usb-bus.0,port=1,id=my-tablet(qemu) device_del my-tablet
热插拔 USB 存储
和 设备可以热插拔。在热插拔的情况下,它们被添加,因此在属性显式设置为 true 之前,来宾将看不到设备。这允许您在使设备对客户机可见之前连接一个或多个 scsi 设备。工作流如下所示:usb-bot
usb-uas
attached = false
attached
device-add usb-bot,id=foo
device-add scsi-{hd,cd},bus=foo.0,lun=0
(可选)添加更多设备(lun 1 ...35 千米赛
scripts/qmp/qom-set foo.attached = true
在 Linux 主机上使用主机 USB 设备
警告:这是一项实验性功能。QEMU在使用它时会变慢。尚不支持需要实时流式传输的 USB 设备(即 USB 摄像机)。
如果使用早期的 Linux 2.4 内核,请验证没有 Linux 驱动程序实际使用 USB 设备。一个简单的方法是通过将相应的内核模块从 重命名为 来禁用它。
mydriver.o
mydriver.o.disabled
验证它是否正常工作(默认情况下,大多数 Linux 发行版应启用它)。您应该看到类似下面的内容:
/proc/bus/usb
ls /proc/bus/usb001 devices drivers
由于只有 root 可以直接访问 USB 设备,因此您可以以 root 身份启动 QEMU,也可以更改要使用的 USB 设备的权限。对于测试,以下就足够了:
chown -R myuid /proc/bus/usb
启动 QEMU 并在监视器中执行:
info usbhost Device 1.2, speed 480 Mb/s Class 00: USB device 1234:5678, USB DISK
你应该会看到可以使用的设备列表(切勿尝试使用集线器,这将不起作用)。
使用以下方法在 QEMU 中添加设备:
device_add usb-host,vendorid=0x1234,productid=0x5678
通常,来宾操作系统应报告插入了新的 USB 设备。您可以使用该选项执行相同的操作。
-device usb-host,...
现在,您可以尝试在 QEMU 中使用主机 USB 设备。
重新启动 QEMU 时,您可能需要拔下并再次插入 USB 设备才能使其再次工作(这是一个错误)。
usb-host
用于指定主机设备的属性
上面的示例使用 和 来指定要传递的主机设备,但这不是指定主机设备的唯一方法。 支持以下属性:vendorid
productid
usb-host
hostbus=<nr>
指定设备必须连接到的总线编号
hostaddr=<nr>
指定来宾操作系统为设备分配的设备地址
hostport=<str>
指定设备连接到的物理端口
vendorid=<hexnr>
指定设备的供应商 ID
productid=<hexnr>
指定设备的产品 ID。
从理论上讲,您可以根据需要组合所有这些属性。在实践中,只有少数组合是有用的:
vendorid
和 – 匹配特定设备,当它出现在主机中的某个位置时,将其传递给来宾。productid
hostbus
和 – 匹配主机中的特定物理端口,插入其中的任何设备都会传递给来宾。hostport
hostbus
和 – 对于临时传递最有用,因为 hostaddr 不稳定。下次将设备插入主机时,它将获得一个新的hostaddr。hostaddr
请注意,在主机上,USB 1.1 设备由 UHCI/OHCI 处理,USB 2.0 由 EHCI 处理。这意味着插入主机上相同物理端口的不同 USB 设备可能会显示在不同的主机总线上,具体取决于速度。假设插入给定物理端口的设备在 2.0 设备上显示为总线 1 + 端口 1,对于 1.1 设备显示为总线 3 + 端口 1,则可以通过插入该端口的任何设备,并将其分配给 QEMU 中的正确 USB 总线,如下所示:
qemu-system-x86_64 -M pc [...] \
-usb \
-device usb-ehci,id=ehci \
-device usb-host,bus=usb-bus.0,hostbus=3,hostport=1 \
-device usb-host,bus=ehci.0,hostbus=1,hostport=1