[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [Libvir] Tricky provisioning problem with inactive domains

On Mon, Jan 15, 2007 at 09:46:37AM -0500, Daniel Veillard wrote:
> On Mon, Jan 15, 2007 at 02:14:36PM +0000, Daniel P. Berrange wrote:
> > Adding support for inactive domains was supposed to make everyone's life 
> > easier, but as luck would have it, its actually made one thing very much
> > harder. In the virt-inst/virt-manager tools provisioning works something
> > like this:
> > 
> > In paravirt case:
> > 
> >  - Create a guest using an explicit kernel/initrd from the images/xen
> >    directory on the install CD
> >  - Write a config file to /etc/xen setup to boot using pygrub
> > 
> > In fullvirt case:
> > 
> >  - Create a guest booting directly off a CDROM
> >  - Write a config file to /etc/xen setup to boot off the harddisk
> > 
> > So in both these cases, the libvirt XML config for the very first boot of
> > the guest is different, from the XML config for subsequent  boots. With 
> > the new inactive domain support in libvirt & xend, we can't write out 
> > config files directly, instead there is the virDomainDefine() API, which
> > calls to appropriate APIs in XenD. And this is where the problem arises:
> > 
> >  1. If we call virDomainDefine() to write the long term config, then 
> >     virDomainStart() will not be using the correct boot method for the
> >     initial install.
> >  2. If we call virDomainDefine() to write the initial install config,
> >     then virDomainStart() will kick off the install correctly, but on
> >     subsequent boots we'll end up booting the installer again instead
> >     of the just installed OS.
> >  3. We could just use virDomainCreate() to start installer, and try to
> >     use virDomainDefine() to write the long term config - the latter
> >     call will fail though because there will already be a running guest
> >     with that name.
> >  4. Conversely if we use virDomainDefine() to write the config, and then
> >     tried to create a one-off guest with virDomainCreate() the latter
> >     will fail due to duplicate names.
> > 
> > So, thus far the only way out of the trap I can think of is:
> > 
> >  1. Use virDomainCreate() to kick off the initial install
> >  2. Poll virDomainLookupByXXX() to watch for this initial guest shutting
> >     down
> >  3. Write out the persistent config using virDomainDefine()
> > 
> > The big problem with this, is that if the user were to exit virt-manager
> > sometime after the guest install starts, but before step 3, the config
> > for the guest will never be written, even though it has successfully
> > installed.
> > 
> > There are two further ideas I've had - both requiring additional APIs in
> > libvirt & probably XenD too.
> > 
> >  - Make it possible change the boot configuration of an existing guest.
> >    This would let us do:
> > 
> >       1. Use virDomainDefine() to define a config file suitable for installing
> >          the guest, ie using explicit kernel/initrd
> >       2. Use virDomainStart() to kick off the installer
> >       3. Uew new  API to change the guest config to remove explicit kernel
> >          & initrd config, and add a bootloader for pygrub. Or in HVM case,
> >          switch boot order to use harddisk instead of CDROM & detach the
> >          CDROM device.
> > 
> >  - Make it possible to start an existing inactive guest using an alternative
> >    one-off configuration. This would let us do:
> > 
> >        1. Use virDomainDefine() to define a config file suitable for running
> >           the guest during normal operation.
> >        2. Use virDomainStartConfig(xml) to start the guest with a special
> >           config suitable for installing the guest.
> > 
> > 
> > Ultimately I think we do need the means to change arbitrary parts of a guest
> > configuration, so I think the first option would be the preferred approach.
> > The trouble is that I think implementing this would require using the new 
> > XenAPI, or adding a number of new methods to the legacy SXPR API which is not
> > really very desirable.
>   Well the core of the problem is that there is 2 set of information, distinct
> in their value and meaning and we have only one placeholder for both. It seems
> to me that basically we are overloading the <os> block while we would need
> a separate <install> block containing the informations needed to install the
> domain.
>   Why not plit them out, and keep both in the configuration ? It seems it would
> open the door to:
>     - the user option of restarting the installation of a domain, which
>       with virtualization is certainly a more common operation than 
>       reinstalling a bare system
>     - allow to keep track of how and where a given domain was installed
>       and with what data
>     - ease provisioning of a similar domain based on the informations
>       provided in that <install> block

 Yes. The idea with <install> and <os> is ***very good***.

>   Basically we could create the domain configuration with both the <os>
> and <install> block, the install one for example missing an installation
> date, suggesting the user to run the installation process instead of
> the normal boot of the instance.
>   I'm not even sure libvirt would have to be modified for this, it will by
> default ignore the <install> block, and the application on top of it could

 I think libvirt would have to be modified for this -- at least a
 separate API which is able to loads data from the <install> block and
 returns it to libvirt based application. I'd like to use

    virt-install --config /etc/xen/myvm.xml

 when I need to re-install the domain.

> just modify the XML before calling Create() . Making libvirt install aware
> would force an API extenstion though, I'm not 100% sure that's really needed.

 It's cheap add there this API extenstion for <install> and it's
 without an impact to the old libvirt API. Our life will be more funny
 with this API ;-)

>   Did I understood correctly the problem ? I think adding extra informations
> about the install data is in any case a good idea, especialy when one think
> in terms of provisionning.



 Karel Zak  <kzak redhat com>

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]