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

Re: [Xen-devel]xl create PV guest with qcow/qcow2 disk images fail



On Thu, 27 Oct 2011, Chun Yan Liu wrote:
> 
> Thank you all. Have tested pv-grub and qemu-nbd trick. Both work.
> 
> Following is the test patch that starts qemu-nbd to mount a non-raw qdisk in 
> domain0, so that it can work with qcow/qcow2
> disk image and using pygrub. I don't know if we need such a patch, or prefer 
> to ask user to use pv-grub instead. Just post
> here for any chance of use. Thanks.
> 
>  
> 
> Patch description: start qemu-nbd to mount non-raw qdisk in dom0 so that xl 
> can create PV guest with qcow/qcow2 disk image
> and using pygrub.
> 
> Signed-off-by: Chunyan Liu <cyliu@xxxxxxxx>
> 
> 
> diff -r b4cf57bbc3fb tools/libxl/libxl.c
> 
> --- a/tools/libxl/libxl.cThu Oct 20 15:24:46 2011 +0800
> 
> +++ b/tools/libxl/libxl.cThu Oct 20 15:48:45 2011 +0800
> 
> @@ -1078,12 +1078,41 @@
> 
>      return rc;
> 
>  }
> 
>  
> 
> +static char * nbd_mount_disk(libxl_device_disk *disk)
> 
> +{
> 
> +    int i;
> 
> +    int nbds_max = 16;
> 
> +    char *nbd_dev, *cmd;
> 
> +    char *ret = NULL;
> 
> +
> 
> +    for (i = 0; i < nbds_max; i++) {
> 
> +        asprintf(&nbd_dev,"/dev/nbd%d", i);
> 
> +        asprintf(&cmd, "qemu-nbd -c %s %s", nbd_dev, disk->pdev_path);
> 
> +        if (system(cmd) == 0) {
> 
> +            ret = strdup(nbd_dev);
> 
> +            break;
> 
> +        }
> 
> +    }

You should use fork, libxl_postfork and exec instead of system. See
xl_cmdimpl.c:autoconnect_console for example.
Also where are nbd_dev and cmd freed?


> +
> 
> +    return ret;
> 
> +}
> 
> +
> 
> +static int nbd_unmount_disk(char *diskpath) {
> 
> +    char *cmd;
> 
> +    asprintf(&cmd, "qemu-nbd -d %s", diskpath);
> 
> +    if (system(cmd) == 0)
> 
> +        return 0;
> 
> +    else
> 
> +        return ERROR_FAIL;
> 
> +}

Same here.


> +
> 
>  char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk 
> *disk)
> 
>  {
> 
>      libxl__gc gc = LIBXL_INIT_GC(ctx);
> 
>      char *dev = NULL;
> 
>      char *ret = NULL;
> 
>      int rc;
> 
> +    char *mdev = NULL;
> 
>  
> 
>      rc = libxl__device_disk_set_backend(&gc, disk);
> 
>      if (rc) goto out;
> 
> @@ -1118,8 +1147,12 @@
> 
>              break;
> 
>          case LIBXL_DISK_BACKEND_QDISK:
> 
>              if (disk->format != LIBXL_DISK_FORMAT_RAW) {
> 
> -                LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "cannot 
> locally"
> 
> -                           " attach a qdisk image 
> if the format is not raw");
> 
> +                LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "attaching 
> a non-raw qdisk image to domain 0\n");
> 
> +                mdev = nbd_mount_disk(disk);
> 
> +                if (mdev)
> 
> +                    dev = mdev;
> 
> +                else
> 
> +                    LIBXL__LOG(ctx, LIBXL__LOG_ERROR, 
> "fail to mount image with qemu-nbd");
> 
>                  break;
> 
>              }
> 
>              LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "locally 
> attaching qdisk %s\n",
> 
> @@ -1135,11 +1168,13 @@
> 
>   out:
> 
>      if (dev != NULL)
> 
>          ret = strdup(dev);
> 
> +    if (mdev)
> 
> +        free(mdev);
> 
>      libxl__free_all(&gc);
> 
>      return ret;
> 
>  }
> 
>  
> 
> -int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk *disk)
> 
> +int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk *disk, 
> char *diskpath)
> 
>  {
> 
>      /* Nothing to do for PHYSTYPE_PHY. */
> 
>  
> 
> @@ -1147,6 +1182,19 @@
> 
>       * For other device types assume that the blktap2 process is
> 
>       * needed by the soon to be started domain and do nothing.
> 
>       */
> 
> +    int ret;
> 
> +
> 
> +    switch (disk->backend) {
> 
> +        case LIBXL_DISK_BACKEND_QDISK:
> 
> +            if (disk->format != LIBXL_DISK_FORMAT_RAW) {
> 
> +                LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Locally 
> detach a non-raw "
> 
> +                    "qdisk image");
> 
> +                ret = nbd_unmount_disk(diskpath);
> 
> +                return ret;
> 
> +            }
> 
> +        default:
> 
> +            break;
> 
> +    }
> 
>  
> 
>      return 0;
> 
>  }
> 
> diff -r b4cf57bbc3fb tools/libxl/libxl.h
> 
> --- a/tools/libxl/libxl.hThu Oct 20 15:24:46 2011 +0800
> 
> +++ b/tools/libxl/libxl.hThu Oct 20 15:48:45 2011 +0800
> 
> @@ -390,7 +390,7 @@
> 
>   * Make a disk available in this domain. Returns path to a device.
> 
>   */
> 
>  char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk 
> *disk);
> 
> -int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk *disk);
> 
> +int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk *disk, 
> char *diskpath);
> 
>  
> 
>  int libxl_device_nic_init(libxl_device_nic *nic, int dev_num);
> 
>  int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid, libxl_device_nic 
> *nic);
> 
> diff -r b4cf57bbc3fb tools/libxl/libxl_bootloader.c
> 
> --- a/tools/libxl/libxl_bootloader.cThu Oct 20 15:24:46 2011 +0800
> 
> +++ b/tools/libxl/libxl_bootloader.cThu Oct 20 15:48:45 2011 +0800
> 
> @@ -424,7 +424,7 @@
> 
>      rc = 0;
> 
>  out_close:
> 
>      if (diskpath) {
> 
> -        libxl_device_disk_local_detach(ctx, disk);
> 
> +        libxl_device_disk_local_detach(ctx, disk, diskpath);
> 
>          free(diskpath);
> 
>      }
> 
>      if (fifo_fd > -1)
> 
> 
> >>> Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> 10/19/2011 9:40 PM 
> >>> >>>
> On Wed, 19 Oct 2011, Fajar A. Nugraha wrote:
> > On Wed, Oct 19, 2011 at 5:55 PM, Stefano Stabellini
> > <stefano.stabellini@xxxxxxxxxxxxx> wrote:
> > >> This is a PV guest configured with pygrub, correct?
> > >> If so, qcow/qcow2 are not supported in this scenario.
> > >>
> > >> You could:
> > >>
> > >> - avoid using pygrub (specify the kernel manually) and keep using 
> > >> qcow/qcow2;
> > >> - switch to raw disks and keep using pygrub;
> > >> - install a Linux kernel that support blktap2 (like the XCP kernel, see
> > >>   http://wiki.xen.org/xenwiki/XenDom0Kernels) and switch to VHD 
> > >>format.
> > >>
> > >
> > > The way to make it work would be to call qemu-nbd and nbd-client from xl
> > > so that a /dev/nbd0 comes up in dom0 and pygrub can use it to extract
> > > the kernel and initrd from the qcow2 image.
> >
> > would pv-grub work? If yes, it would give better performance compared
> > to nbd workaround.
> 
> Yes, it should. That would be the other alternative.
> 
> 
> 
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.