Невозможно отсоединить устройство PCI от работающей виртуальной машины («Устройство уже находится в процессе отключения»)

Я пересылаю хост USB-концентратор, используя эту конфигурацию virsh:

      <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>

Это работает отлично. Однако я хочу иметь возможность в любой момент подключить/отсоединить этот 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 Yubikeys, двукратное использование одного и того же производителя/продукта приведет к отключению обоих. Но для их добавления необходимо использовать шину/устройство. Конечно, для подключения необходимо использовать шину/устройство, если имеется несколько одинаковых устройств. К сожалению, те, которые были добавлены через «Перенаправление USB-устройств» в меню просмотра, на самом деле не могут быть удалены таким образом.

(для этого просто замените detach на Attach) (usbreset 1050:0407их тоже не удаляю)

Другие вопросы по тегам