[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



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;

+        }

+    }

+

+    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;

+}

+

 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®.