无法从正在运行的虚拟机中分离 PCI 设备(“设备已处于拔出过程中”)

无法从正在运行的虚拟机中分离 PCI 设备(“设备已处于拔出过程中”)

我正在使用此 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/346155https://unix.stackexchange.com/questions/370098/single-line-heredocument-possible-in-bash

如果您有来自同一供应商的 2 个设备,例如 2 个 Yubikey,则使用同一供应商/产品两次将同时分离两者。但必须使用总线/设备来添加它们。当然,如果有多个相同的设备,则必须使用总线/设备来连接。不幸的是,据我所知,通过查看器菜单中的“重定向 USB 设备”添加的设备无法通过这种方式删除。

(只需将 detach 替换为 attachment 即可)(usbreset 1050:0407也不会删除它们。)

相关内容