我正在使用此 virsh 配置转发主机 USB 集线器:
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x13' slot='0x00' function='0x3'/>
</source>
<address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
</hostdev>
这很完美。但是,我希望能够随时从 VM 热连接/断开此 USB 集线器。理论上这应该可行:
$ virsh detach-device my-vm-name pci-root-usb-hub.xml
Device detached successfully
好的,看起来很有希望,但是 PCI 设备实际上尚未分离。我仍然可以看到我的网络摄像头并在虚拟机内移动鼠标。如果我再次运行该命令:
$ virsh detach-device my-vm-name pci-root-usb-hub.xml
error: Failed to detach device from pci-root-usb-hub.xml
error: internal error: unable to execute QEMU command 'device_del': Device hostdev2 is already in the process of unplug
看起来它在那里冻结了。如果不关闭虚拟机,我无法真正将 PCI 设备从虚拟机中分离出来。
我无法在libvirtd.log
或中发现任何错误qemu/my-vm-name.log
。这不起作用有什么明显的原因吗?
- 主机操作系统:Arch Linux(内核 5.13.12)
- 客户操作系统:Windows 10
答案1
追随这些足迹:
https://www.reddit.com/r/VFIO/comments/gib29u/comment/fqdlo6a/
https://github.com/olavmrk/usb-libvirt-hotplug
..我能够将 xml (可以全部在一行上)归结为以下内容:
virsh detach-device 28 /dev/stdin <<DL
<hostdev type="usb"><source><vendor id="0x1050"/><product id="0x0407"/></source></hostdev>
DL
..detach 也只接受总线和设备编号:
virsh detach-device 28 /dev/stdin <<DL
<hostdev type="usb"><source><address bus="3" device="26"/></source></hostdev>
DL
..可以使用 Heredoc 单行书写:
eval $'virsh detach-device 28 /dev/stdin << DL \n<hostdev type="usb"><source><vendor id="0x1050"/><product id="0x0407"/></source></hostdev>\nDL'
https://unix.stackexchange.com/a/465068/346155(https://unix.stackexchange.com/questions/370098/single-line-heredocument-possible-in-bash)
如果您有来自同一供应商的 2 个设备,例如 2 个 Yubikey,则使用同一供应商/产品两次将同时分离两者。但必须使用总线/设备来添加它们。当然,如果有多个相同的设备,则必须使用总线/设备来连接。不幸的是,据我所知,通过查看器菜单中的“重定向 USB 设备”添加的设备无法通过这种方式删除。
(只需将 detach 替换为 attachment 即可)(usbreset 1050:0407
也不会删除它们。)