欢迎光临散文网 会员登陆 & 注册

[QEMU]USB 仿真

2022-07-21 23:10 作者:-小白之家-  | 我要投稿

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-usbusb-bus.0

可以使用标准交换机将 EHCI 控制器添加到虚拟机。强烈建议为控制器指定一个 ID,以便 USB 2.0 总线获得一个单独的名称,例如 。这将为您提供一个名为 的USB 2.0总线。-device-device usb-ehci,id=ehciehci.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 配套控制器,每个控制器有两个端口。masterbusfirstportmasterbusfirstport

文档中有一个配置文件,它将为您完成所有这些操作,您可以像这样使用它:

qemu-system-x86_64 -readconfig docs/config/ich9-ehci-uhci.cfg

然后用于将 USB 设备分配到该总线。bus=ehci.0

将开关用于计算机将创建类似的 USB 控制器配置。-usbq35


连接 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-hdscsi-cd-driveusb-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-storageusb-uasusb-botusb-uasusb-uasusb-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 ``portdevice_del

(qemu) device_add usb-tablet,bus=usb-bus.0,port=1,id=my-tablet(qemu) device_del my-tablet

热插拔 USB 存储

和 设备可以热插拔。在热插拔的情况下,它们被添加,因此在属性显式设置为 true 之前,来宾将看不到设备。这允许您在使设备对客户机可见之前连接一个或多个 scsi 设备。工作流如下所示:usb-botusb-uasattached = falseattached

  1. device-add usb-bot,id=foo

  2. device-add scsi-{hd,cd},bus=foo.0,lun=0

  3. (可选)添加更多设备(lun 1 ...35 千米赛

  4. scripts/qmp/qom-set foo.attached = true


在 Linux 主机上使用主机 USB 设备

警告:这是一项实验性功能。QEMU在使用它时会变慢。尚不支持需要实时流式传输的 USB 设备(即 USB 摄像机)。

  1. 如果使用早期的 Linux 2.4 内核,请验证没有 Linux 驱动程序实际使用 USB 设备。一个简单的方法是通过将相应的内核模块从 重命名为 来禁用它。mydriver.omydriver.o.disabled

  2. 验证它是否正常工作(默认情况下,大多数 Linux 发行版应启用它)。您应该看到类似下面的内容:/proc/bus/usb

    ls /proc/bus/usb001  devices  drivers

  3. 由于只有 root 可以直接访问 USB 设备,因此您可以以 root 身份启动 QEMU,也可以更改要使用的 USB 设备的权限。对于测试,以下就足够了:

    chown -R myuid /proc/bus/usb

  4. 启动 QEMU 并在监视器中执行:

    info usbhost  Device 1.2, speed 480 Mb/s    Class 00: USB device 1234:5678, USB DISK

    你应该会看到可以使用的设备列表(切勿尝试使用集线器,这将不起作用)。

  5. 使用以下方法在 QEMU 中添加设备:

    device_add usb-host,vendorid=0x1234,productid=0x5678

    通常,来宾操作系统应报告插入了新的 USB 设备。您可以使用该选项执行相同的操作。-device usb-host,...

  6. 现在,您可以尝试在 QEMU 中使用主机 USB 设备。

重新启动 QEMU 时,您可能需要拔下并再次插入 USB 设备才能使其再次工作(这是一个错误)。

usb-host用于指定主机设备的属性

上面的示例使用 和 来指定要传递的主机设备,但这不是指定主机设备的唯一方法。 支持以下属性:vendoridproductidusb-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


[QEMU]USB 仿真的评论 (共 条)

分享到微博请遵守国家法律