[Libguestfs] libguestfs init problem

Richard W.M. Jones rjones at redhat.com
Wed May 6 09:08:57 UTC 2015


On Wed, May 06, 2015 at 08:42:09AM +0800, fu lirong wrote:
>   (1) make quickcheck
> 
>  works  well ,after the command  the terminal shows:
> 
> ===== TEST FINISHED OK =====

That's good.

> (2) what your program does ( I executed  ./autogen.sh   、  ./configure  、
> make 、 make check as I mentioned before , when I execute make check ,there
> is something wrong  and I ignored it  .  I started to run a C program  )
> 
> a. I copy the code  in prog.c   (a C program I made  ) under  libguestfs-1.28.1
> ,and the code is :
> 
>  /* Example showing how to create a disk image. */
> 
>  #include <stdio.h>
>  #include <stdlib.h>
>  #include <string.h>
>  #include <fcntl.h>
>  #include <unistd.h>
>  #include <guestfs.h>
> 
>  int
>  main (int argc, char *argv[])
>  {
>    guestfs_h *g;
>    size_t i;
> 
>    g = guestfs_create ();
>    if (g == NULL) {
>      perror ("failed to create libguestfs handle");
>      exit (EXIT_FAILURE);
>    }
> 
>    /* Set the trace flag so that we can see each libguestfs call. */
>    guestfs_set_trace (g, 1);
> 
>    /* Create a raw-format sparse disk image, 512 MB in size. */
>    if (guestfs_disk_create (g, "disk.img", "raw", UINT64_C(512)*1024*1024,
>                             -1) == -1)
>      exit (EXIT_FAILURE);
> 
>    /* Add the disk image to libguestfs. */
>    if (guestfs_add_drive_opts (g, "disk.img",
>          GUESTFS_ADD_DRIVE_OPTS_FORMAT, "raw", /* raw format */
>          GUESTFS_ADD_DRIVE_OPTS_READONLY, 0, /* for write */
>          -1) /* this marks end of optional arguments */
>        == -1)
>      exit (EXIT_FAILURE);
> 
>    /* Run the libguestfs back-end. */
>    if (guestfs_launch (g) == -1)
>      exit (EXIT_FAILURE);
> 
>    /* Get the list of devices.  Because we only added one drive
>     * above, we expect that this list should contain a single
>     * element.
>     */
>    char **devices = guestfs_list_devices (g);
>    if (devices == NULL)
>      exit (EXIT_FAILURE);
>    if (devices[0] == NULL || devices[1] != NULL) {
>      fprintf (stderr, "error: expected a single device from list-devices\n");
>      exit (EXIT_FAILURE);
>    }
> 
>    /* Partition the disk as one single MBR partition. */
>    if (guestfs_part_disk (g, devices[0], "mbr") == -1)
>      exit (EXIT_FAILURE);
> 
>    /* Get the list of partitions.  We expect a single element, which
>     * is the partition we have just created.
>     */
>    char **partitions = guestfs_list_partitions (g);
>    if (partitions == NULL)
>      exit (EXIT_FAILURE);
>    if (partitions[0] == NULL || partitions[1] != NULL) {
>      fprintf (stderr, "error: expected a single partition from
> list-partitions\n");
>      exit (EXIT_FAILURE);
>    }
> 
>    /* Create a filesystem on the partition. */
>    if (guestfs_mkfs (g, "ext4", partitions[0]) == -1)
>      exit (EXIT_FAILURE);
> 
>    /* Now mount the filesystem so that we can add files. */
>    if (guestfs_mount (g, partitions[0], "/") == -1)
>      exit (EXIT_FAILURE);
> 
>    /* Create some files and directories. */
>    if (guestfs_touch (g, "/empty") == -1)
>      exit (EXIT_FAILURE);
>    const char *message = "Hello, world\n";
>    if (guestfs_write (g, "/hello", message, strlen (message)) == -1)
>      exit (EXIT_FAILURE);
>    if (guestfs_mkdir (g, "/foo") == -1)
>      exit (EXIT_FAILURE);
> 
>    /* This one uploads the local file /etc/resolv.conf into
>     * the disk image.
>     */
>    if (guestfs_upload (g, "/etc/resolv.conf", "/foo/resolv.conf") == -1)
>      exit (EXIT_FAILURE);
> 
>    /* Because we wrote to the disk and we want to detect write
>     * errors, call guestfs_shutdown.  You don't need to do this:
>     * guestfs_close will do it implicitly.
>     */
>    if (guestfs_shutdown (g) == -1)
>      exit (EXIT_FAILURE);
> 
>    guestfs_close (g);
> 
>    /* Free up the lists. */
>    for (i = 0; devices[i] != NULL; ++i)
>      free (devices[i]);
>    free (devices);
>    for (i = 0; partitions[i] != NULL; ++i)
>      free (partitions[i]);
>    free (partitions);
> 
>    exit (EXIT_SUCCESS);
>  }
> 
> 
> b. I executed   cc prog.c -o prog `pkg-config libguestfs --cflags --libs`
> c . I executed    . /prog /var/lib/libvirt/images/vm.img  (the vm.img is
> the images that the KVM monitor created under /lib/libvirt/images)  and
> the vm virtual machine is running.  after this command ,the  errors appears:
> 
> libguestfs: error: aug_init: aug_init: / (flags 48): Syntax error in lens
> definition: /usr/share/guestfs/guestfs_lvm_conf.aug:28.25-.40:Could not
> load module Quote for Quote.do_dquote
> /usr/share/guestfs/guestfs_lvm_conf.aug:28.25-.40:Undefined variable
> Quote.do_dquote
> /usr/share/guestfs/guestfs_lvm_conf.aug:29.31-.44:Could not load module Rx
> for Rx.relinteger
> /usr/share/guestfs/guestfs_lvm_conf.aug:29.31-.44:Undefined variable
> Rx.relinteger
> /usr/share/guestfs/guestfs_lvm_conf.aug:32.20-.23:Undefined variable int
> /usr/share/guestfs/guestfs_lvm_conf.aug:40.17-.29:Undefined variable
> flat_literal

It's strange because the program above doesn't call any Augeas
functions in libguestfs.  Perhaps you're compiling a different
program?

Anyway, I'm pretty sure this _is_ a bug in libguestfs, owing to the
way we try to add rules to Augeas, which has been a constant source of
pain.  Ask Pino about that code.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-top is 'top' for virtual machines.  Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://people.redhat.com/~rjones/virt-top




More information about the Libguestfs mailing list