Re: [libvirt-users] script called from qemu hook freezes.

daggs
2019-01-05T06:57:19Z

Greetings Laine,

> Sent: Friday, January 04, 2019 at 9:16 PM
> From: "Laine Stump" <laine@redhat.com>
> To: libvirt-users@redhat.com
> Cc: daggs <daggs@gmx.com>
> Subject: Re: [libvirt-users] script called from qemu hook freezes.
>
> On 1/4/19 11:27 AM, daggs wrote:
> > Greetings Peter,
> >
> >> Sent: Friday, January 04, 2019 at 4:47 PM
> >> From: "Peter Krempa" <pkrempa@redhat.com>
> >> To: daggs <daggs@gmx.com>
> >> Cc: libvirt-users@redhat.com
> >> Subject: Re: [libvirt-users] script called from qemu hook freezes.
> >>
> >> On Thu, Jan 03, 2019 at 18:07:58 +0100, daggs wrote:
> >>> Greetings,
> >>>
> >>> I'm executing an external script when the qemu hook is
called with start or release, the script is rather simple, upon start it
iterates over the output of lsusb -t and for each device, it looks if it should
be added to the vm we started, if so, it attaches it to the vm as follows:
> >>> virsh --connect qemu:///system "${cmd}"
"${domain}" /dev/stdin << END
> >>> <hostdev mode='subsystem' type='usb'>
> >>>
> >>>     <address bus='${busnum}'
device='${devnum}' />
> >>>
> >>> </hostdev>
> >>> END
> >>>
> >>> where cmd is attach-device, domain is the vm's name,
busnum and devnum come from the output of the lsusb -t.
> >>> my issue is that upon the first attach attempt, the cmd hangs,
I need to kill it and after than I cannot preform any virsh cmd, I must restart
the host.
> >>> if I try to execute the same cmd after the vm is up, it works
great.
> >>>
> >>> why the attach process gets stuck? do I need to execute it
under different stage?
> >>
> >> Hook scripts shall never call any libvirt API (even through
virsh). At
> >> the point when the hook script is called the VM startup process is
> >> paused until the script returns. If the script attempts to modify
the VM
> >> it gets stuck as the VM is locked at that point.
> >>
> >> You either need to add the device prior to startup, but AFAIK that
is
> >> not possible with a hook script or after but the script needs to
return.
> >>
> >> So you either fork off a process which will wait for the startup
to
> >> finish from the hook script or write an APP using the libvirt API
which
> >> will wait for the VM start event and then execute what's
necessary.
> >>
> >
> > I see, is there another way to do what I need (on startup usb hotplug)
or maybe optional hotplug (e.g. don't fail the device isn't present)?
>
> I've never used it, but does the "startupPolicy" attribute do
what you
> need? Search for that string at:
>
>     https://libvirt.org/formatdomain.html#elementsHostDevSubsys
>

yes! this it.

Thanks,

Dagg.