2022-09-24
Can't live-attach a USB device to a kvm virtual host after upgrades
I have a DS2490 USB 1-wire interface on the home server conway which is rerouted to one of the virtual machines so that that virtual machine can read the sensors on the 1-wire network. This rerouting works when the machine is started, the DS2490 USB 1-wire shows up in the virtual machine fine. From time to time this DS2490 USB 1-wire interface gets confused when I am transmitting on the radio so the solution is to detach it from the virtual machine, unplug it from the server, plug it in again and attach it to the virtual machine again. Today this had to be done and I got an unexpected error message:root@conway:~# virsh attach-device --live gosper /etc/onewire-for-gosper.xml error: Failed to attach device from /etc/onewire-for-gosper.xml error: internal error: unable to execute QEMU command 'device_add': failed to find host usb device 2:8In logfile /var/log/libvirt/libvirtd.log:2022-09-24 21:16:38.655+0000: 10923: error : qemuMonitorJSONCheckError:395 : internal error: unable to execute QEMU command 'device_add': failed to find host usb device 2:8To be complete about it: usb device 2:8 is exactly the right one!root@conway:~# lsusb | grep 2490 Bus 002 Device 008: ID 04fa:2490 Dallas Semiconductor DS1490F 2-in-1 Fob, 1-Wire adapterThis seems to be new since I upgraded the homeserver to Devuan beowulf giving me versions:| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend |/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad) ||/ Name Version Architecture Descripti +++-=====================================-===============-============-========= ii libvirt-clients 5.0.0-4+deb10u1 amd64 Programs ii libvirt-daemon 5.0.0-4+deb10u1 amd64 Virtualiz un libvirt-daemon-driver-storage-gluster(no descr un libvirt-daemon-driver-storage-rbd (no descr un libvirt-daemon-driver-storage-zfs (no descr ii libvirt-daemon-system 5.0.0-4+deb10u1 amd64 Libvirt d ii libvirt-glib-1.0-0:amd64 1.0.0-1 amd64 libvirt G ii libvirt0:amd64 5.0.0-4+deb10u1 amd64 library f First idea: AppArmor
The first search result that came up was Bug #1552241 “libvirt-bin apparmor settings for usb host device” : Bugs : libvirt package : Ubuntu. So I tried changing the /etc/apparmor.d/abstractions/libvirt-qemu file. After a few tries and reading the warnings in the rest of the file I made sure the source was AppArmor by completely disabling it. The error did not go away so I reverted the libvirt-qemu rules to the original settings, restarted AppArmor and kept debugging.Second idea: usb rights
Based on QEMU USB passthrough broken after Ubuntu 18.04 upgrade I added udev rules to make sure group libvirt-qemu had read and write rights on the usb device, with /lib/udev/rules.d/51-qemu-usb-passthrough.rules containing:SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="04fa", ATTRS{idProduct}=="2490", MODE="0664", GROUP="libvirt-qemu"And doing theroot@conway:~# udevadm control --reload-rulesAnd verifying the resulting rule:root@conway:~# udevadm test -a -p $(udevadm info -q path -n /dev/bus/usb/002/008) calling: test version 3.2.9 This program is for debugging only, it does not run any program specified by a RUN key. It may show incorrect results, because some values may be different, or not available at a simulation run. [..] GROUP 110 /lib/udev/rules.d/51-qemu-usb-passthrough.rules:1 MODE 0664 /lib/udev/rules.d/51-qemu-usb-passthrough.rules:1 handling device node '/dev/bus/usb/002/008', devnum=c189:135, mode=0664, uid=0, gid=110 [..]Indeed the right groupid, but still the same error message when trying the attach-device command.Interesting find: it's specific to the virtual machine that had the device before
Small update: I can attach the USB device to a different host and detach it from that host again. I just can't attach it to the 'original' host again. I also posted this question on serverfault: Can't live-attach a USB device to a kvm virtual host again after upgrades. Update: After a complete reboot of the homeserver the USB 1-wire interface worked again (as I could imagine). But after another interference problem it's now in the same state again. I did change the definition in both the virthost configuration and the xml file from managed='no' to managed='yes' before the reboot but that hasn't helped. Contents of the /etc/onewire-for-gosper.xml file now:<hostdev mode='subsystem' type='usb' managed='yes'> <source> <vendor id='0x04fa'/> <product id='0x2490'/> </source> </hostdev>