我在 Linux 服务器上有以下 USB 设备:
# lsusb -t
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/2p, 480M
|__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/6p, 480M
|__ Port 2: Dev 3, If 0, Class=HID, Driver=usbfs, 1.5M
|__ Port 3: Dev 4, If 0, Class=hub, Driver=hub/4p, 480M
|__ Port 1: Dev 8, If 0, Class=print, Driver=usbfs, 12M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/2p, 480M
|__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/6p, 480M
我想将整个 USB 集线器 (Dev 4) 传递给 Windows XP 客户机。这样,连接到集线器和从集线器移除的设备应该由客户机自动处理(对吗?)。
我尝试使用以下代码virsh attach-device
:
<hostdev mode='subsystem' type='usb' managed='yes'>
<source>
<address type='usb' bus='0x002' port='1.3' />
</source>
</hostdev>
但它不起作用:
error: Failed to attach device from attach_hub.xml
error: internal error usb address needs device id
我究竟做错了什么?
答案1
中心的 xml:https://libvirt.org/formatdomain.html#elementsHub
一个例子:
<hub type='usb'> <address type='usb' bus='0' port='1'/> </hub>
https://www.redhat.com/archives/libvir-list/2011-August/msg00816.html
答案2
我知道这个帖子已经有几年了,但我已经在这个确切的主题上做了几天的工作,觉得这个问题可以使用我的一些答案。
第一的,根据Libvirt 域格式文档,以下代码片段概述了正确的<hostdev>
语法:
...
<devices>
<hostdev mode='subsystem' type='usb'>
<source startupPolicy='optional'>
<vendor id='0x1234'/>
<product id='0xbeef'/>
</source>
<boot order='2'/>
</hostdev>
</devices>
...
错误的原因是由于您的 USB缺少<vendor>
和标签<product>
<source>
第二,如果您运行的是 Ubuntu 16.04 或更高版本(像我一样),那么在使用热插拔时,您将成功收到具有上述 XML 设备格式的 USB 直通消息virsh attach-device
,但该设备永远不会连接到虚拟机。这是 AppArmor 的错误。我在另一个线程链接到此 AppArmor Libvirt 配置解决 USB 直通问题,我可以确认这可以解决我的问题。
相关的 AppArmor 代码片段:
为了使软件程序能够正确访问 USB 设备,必须更改 qemu 的 apparmor 抽象。编辑
/etc/apparmor.d/abstractions/libvirt-qemu
添加一行:
# this lets qemu read all USB device information and might be considered a security risk
/run/udev/data/* r,
第三,其他答案中引用的“USB 集线器”不是主机范围内的集线器,而是虚拟机范围内的集线器。来自同一个 Libvirt 文档:
hub 元素有一个可选的子元素,其 type='usb',可以将设备绑定到特定的控制器[...]
许多设备都有一个可选的子元素来描述设备在呈现给客户的虚拟总线上的位置。
希望这对某人有帮助:)
答案3
如果有人仍在寻找,请使用以下表格:
<address type='usb' bus='0' device='1'/>
设备条目对应于 lsusb -t 输出的“Dev”条目