Невозможно отсоединить устройство 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
их тоже не удаляю)