On Fri, Jan 04, 2019 at 17:27:48 +0100, daggs wrote:
> Greetings Peter,
> 
> > Sent: Friday, January 04, 2019 at 4:47 PM
> > From: "Peter Krempa" <pkre...@redhat.com>
> > To: daggs <da...@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'>
> > >   <source>
> > >    <address bus='${busnum}' device='${devnum}' />
> > >   </source>
> > > </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)?

If you need programatic logic to decide which device to plug in you
either use the above suggestion to use a daemon using libvirt API or
fork off a separate process or do the logic prior to start by
pre-constructing the XML and using 'virsh create xmlfile' which will be
used as the running config without modifying the persistent one.

Attachment: signature.asc
Description: PGP signature

_______________________________________________
libvirt-users mailing list
libvirt-users@redhat.com
https://www.redhat.com/mailman/listinfo/libvirt-users

Reply via email to