[Libguestfs] [PATCH] appliance: reorder the steps to search for appliance

Pavel Butsykin pbutsykin at virtuozzo.com
Thu Apr 27 12:54:44 UTC 2017


On 25.04.2017 18:33, Richard W.M. Jones wrote:
> On Tue, Apr 25, 2017 at 06:13:37PM +0300, Pavel Butsykin wrote:
>> On 25.04.2017 16:04, Richard W.M. Jones wrote:
>>> Can you see what:
>>>
>>>    guestfish get-path
>>
>> /usr/lib64/guestfs
>>
>>> prints?  Are you setting LIBGUESTFS_PATH at all?
>>>
>>
>> No.
>>
>> # ls /usr/lib64/guestfs
>> initrd  kernel  README.fixed  root  supermin.d
>>
>> libguestfs by default uses a single path to search fixed appliance and
>> supermin.d. It seemed to me that the presence of options "--disable
>> appliance --disable-daemon" must exclude the use of
>> build_supermin_appliance.
>> But libguestfs in any case trying to find supermin.d.
>
> OK, I see - what's actually happening is that you've got a path which
> is both a fixed appliance and a supermin appliance (although maybe it
> only appears to be a supermin appliance -- libguestfs just looks for
> the "supermin.d" entry and decides it's a supermin appliance).
>
>> Maybe it's not
>> quite right to make such decisions based on the contents of the
>> directory.
>
> Yes that's right, but see below.
>

Moreover, we have a situation with undefined behavior. if we only use
the fixed appliance, then we can't rely on the contents of directories,
because there are many ways to stumble on supermin.d

>> Also, I still don't understand what the priority of the search
>> appliances was supposed to actually use. Because in the documentation
>> the first step is to search for fixed appliance, but is actually
>> supermin.d(for building appliance).
>
> There's not a priority in this situation.  It wasn't intended that two
> different appliances would be on the exact same path.

As I see using the same path for different appliances is not a problem.
Because build_appliance() first looks for the supermin.d in the
g->path, and then the fixed appliance in the same g->path. Therefore,
setting the two paths into LIBGUESTFS_PATH=/lib64/guestfs/appliance2:
/lib64/guestfs doesn't help.

>
> Some possible solutions:
>
> (1) Make the check in lib/appliance.c: contains_supermin_appliance
> more robust.
>
> It could perhaps be changed so that it checks that at least
> "base.tar.gz" and "packages" are found within the supermin.d
> directory.  Those are the minimum two files that must be in a supermin
> appliance (see supermin(8)).

Empty supermin.d is not a problem in this situation, supermin.d with
content may belong to a different libguestfs version or come from
arbitrary utilities/packages.

> (2) If the fixed appliance was located somewhere else, you could do:
>
>    LIBGUESTFS_PATH=/path/to/somewhere/else:/usr/lib64/guestfs
>    export LIBGUESTFS_PATH
>
> and then it would look for the fixed appliance in
> /path/to/somewhere/else and use it.  If the fixed appliance exists
> there, then it would never check /usr/lib64/guestfs.

It's a bit wrong, the first step is search supermin.d in all specified
directories:
   /* Step (1). */
   r = find_path (g, contains_supermin_appliance, NULL, &supermin_path);
   if (r == -1)
     return -1;

   if (r == 1)
     /* Step (2): build supermin appliance. */
     return build_supermin_appliance (g, supermin_path,
                                      kernel, initrd, appliance);
...

So, supermin.d will be found in /usr/lib64/guestfs and the search for
the fixed applaince will not even. Here find_path() searches for
all paths in g->path.

>
> (3) You could also compile a different path into libguestfs.
>
> Unfortunately there's no way to specify it at configure time, but see
> GUESTFS_DEFAULT_PATH in the sources.
>
> (4) Delete /usr/lib64/guestfs/supermin.d

It can even be dangerous, because supermin.d may belong to any
packages or utilities.

I propose to consider a patch that adds some certainty of behaviour in
the work with appliances, and solves the above notation issue. What do
you think? (see path in the next message)

> Rich.
>




More information about the Libguestfs mailing list