From: Kashyap Chamarthy <kashyap.cv@gmail.com>
To: Stefan Hajnoczi <stefanha@redhat.com>
Cc: "Kevin Wolf" <kwolf@redhat.com>,
qemu-devel@nongnu.org, "Benoît Canet" <benoit@irqsave.net>
Subject: Re: [Qemu-devel] [PATCH] qemu-img: Add --backing-chain option to info command
Date: Sat, 13 Oct 2012 01:49:54 +0530 [thread overview]
Message-ID: <CAOaxAcbDNmO2265LNvmCur0DPOEu29SEWOG66jTB5owNs1jxOA@mail.gmail.com> (raw)
In-Reply-To: <CAOaxAcZ-dgLcmT3adfs--3_GsOnmBwFgdCaCY5h-NYOyo9F5cA@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 6733 bytes --]
On Sat, Oct 13, 2012 at 12:46 AM, Kashyap Chamarthy
<kashyap.cv@gmail.com> wrote:
> On Fri, Oct 12, 2012 at 7:39 PM, Stefan Hajnoczi <stefanha@redhat.com> wrote:
>> The qemu-img info --backing-chain option enumerates the backing file
>> chain. For example, for base.qcow2 <- snap1.qcow2 <- snap2.qcow2 the
>> output becomes:
>>
>> $ qemu-img info --backing-chain snap2.qcow2
>> image: snap2.qcow2
>> file format: qcow2
>> virtual size: 100M (104857600 bytes)
>> disk size: 196K
>> cluster_size: 65536
>> backing file: snap1.qcow2
>> backing file format: qcow2
>>
>> image: snap1.qcow2
>> file format: qcow2
>> virtual size: 100M (104857600 bytes)
>> disk size: 196K
>> cluster_size: 65536
>> backing file: base.qcow2
>> backing file format: qcow2
>>
>> image: base.qcow2
>> file format: qcow2
>> virtual size: 100M (104857600 bytes)
>> disk size: 136K
>> cluster_size: 65536
>>
>> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
>> ---
>> qemu-img.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++--------------
>> 1 file changed, 76 insertions(+), 22 deletions(-)
>>
>> diff --git a/qemu-img.c b/qemu-img.c
>> index f17f187..c717f3e 100644
>> --- a/qemu-img.c
>> +++ b/qemu-img.c
>> @@ -1249,7 +1249,10 @@ static void dump_human_image_info(ImageInfo *info)
>> }
>> }
>>
>> -enum {OPTION_OUTPUT = 256};
>> +enum {
>> + OPTION_OUTPUT = 256,
>> + OPTION_BACKING_CHAIN = 257,
>> +};
>>
>> typedef enum OutputFormat {
>> OFORMAT_JSON,
>> @@ -1260,7 +1263,9 @@ static int img_info(int argc, char **argv)
>> {
>> int c;
>> OutputFormat output_format = OFORMAT_HUMAN;
>> - const char *filename, *fmt, *output;
>> + bool chain = false;
>> + const char *output;
>> + char *filename, *fmt;
>> BlockDriverState *bs;
>> ImageInfo *info;
>>
>> @@ -1272,6 +1277,7 @@ static int img_info(int argc, char **argv)
>> {"help", no_argument, 0, 'h'},
>> {"format", required_argument, 0, 'f'},
>> {"output", required_argument, 0, OPTION_OUTPUT},
>> + {"backing-chain", no_argument, 0, OPTION_BACKING_CHAIN},
>> {0, 0, 0, 0}
>> };
>> c = getopt_long(argc, argv, "f:h",
>> @@ -1285,17 +1291,20 @@ static int img_info(int argc, char **argv)
>> help();
>> break;
>> case 'f':
>> - fmt = optarg;
>> + fmt = g_strdup(optarg);
>> break;
>> case OPTION_OUTPUT:
>> output = optarg;
>> break;
>> + case OPTION_BACKING_CHAIN:
>> + chain = true;
>> + break;
>> }
>> }
>> if (optind >= argc) {
>> help();
>> }
>> - filename = argv[optind++];
>> + filename = g_strdup(argv[optind++]);
>>
>> if (output && !strcmp(output, "json")) {
>> output_format = OFORMAT_JSON;
>> @@ -1303,31 +1312,76 @@ static int img_info(int argc, char **argv)
>> output_format = OFORMAT_HUMAN;
>> } else if (output) {
>> error_report("--output must be used with human or json as argument.");
>> - return 1;
>> + goto err;
>> }
>>
>> - bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING, false);
>> - if (!bs) {
>> - return 1;
>> + if (chain && output_format == OFORMAT_JSON) {
>> + printf("[\n");
>> }
>>
>> - info = g_new0(ImageInfo, 1);
>> - collect_image_info(bs, info, filename, fmt);
>> + do {
>> + bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING,
>> + false);
>> + if (!bs) {
>> + goto err;
>> + }
>>
>> - switch (output_format) {
>> - case OFORMAT_HUMAN:
>> - dump_human_image_info(info);
>> - dump_snapshots(bs);
>> - break;
>> - case OFORMAT_JSON:
>> - collect_snapshots(bs, info);
>> - dump_json_image_info(info);
>> - break;
>> - }
>> + info = g_new0(ImageInfo, 1);
>> + collect_image_info(bs, info, filename, fmt);
>>
>> - qapi_free_ImageInfo(info);
>> - bdrv_delete(bs);
>> + switch (output_format) {
>> + case OFORMAT_HUMAN:
>> + dump_human_image_info(info);
>> + dump_snapshots(bs);
>> + break;
>> + case OFORMAT_JSON:
>> + collect_snapshots(bs, info);
>> + dump_json_image_info(info);
>> + break;
>> + }
>> +
>> + g_free(filename);
>> + g_free(fmt);
>> + filename = NULL;
>> + fmt = NULL;
>> +
>> + if (chain) {
>> + if (info->has_full_backing_filename) {
>> + filename = g_strdup(info->full_backing_filename);
>> + } else if (info->has_backing_filename) {
>> + filename = g_strdup(info->backing_filename);
>> + }
>> +
>> + if (filename && info->has_backing_filename_format) {
>> + fmt = g_strdup(info->backing_filename_format);
>> + }
>> +
>> + /* Print delimiters between items */
>> + if (filename) {
>> + switch (output_format) {
>> + case OFORMAT_HUMAN:
>> + printf("\n");
>> + break;
>> + case OFORMAT_JSON:
>> + printf(",\n");
>> + break;
>> + }
>> + }
>> + }
>> +
>> + qapi_free_ImageInfo(info);
>> + bdrv_delete(bs);
>> + } while (filename);
>> +
>> + if (chain && output_format == OFORMAT_JSON) {
>> + printf("]\n");
>> + }
>> return 0;
>> +
>> +err:
>> + g_free(filename);
>> + g_free(fmt);
>> + return 1;
>> }
>>
>> #define SNAPSHOT_LIST 1
>> --
>> 1.7.11.4
>>
>
> Thanks a lot Stefan for making this. Just tested this with latest qemu
> git. Works like a charm:
>
> [kashyap@moon qemu]$ ./qemu-img info --backing-chain
> /var/lib/libvirt/images/snap4-of-test-f17base.qcow2
> image: /var/lib/libvirt/images/snap4-of-test-f17base.qcow2
> file format: qcow2
> virtual size: 1.0G (1073741824 bytes)
> disk size: 3.6M
> cluster_size: 65536
> backing file: /var/lib/libvirt/images/snap1-of-test-f17base.qcow2
> backing file format: qcow2
>
> image: /var/lib/libvirt/images/snap1-of-test-f17base.qcow2
> file format: qcow2
> virtual size: 1.0G (1073741824 bytes)
> disk size: 968K
> cluster_size: 65536
> backing file: /export/vmimgs2/test-f17base.img
> backing file format: raw
>
> image: /export/vmimgs2/test-f17base.img
> file format: raw
> virtual size: 1.0G (1073741824 bytes)
> disk size: 607M
> [kashyap@moon qemu]$
Attached a documentation patch for the '--backing-chain' option.
/kashyap
[-- Attachment #2: 0001-Add-documentation-for-qemu-img-info-backing-chain.patch --]
[-- Type: application/octet-stream, Size: 2365 bytes --]
From eb4c4bc92c035c42c23c30c5e7ee73b54f9cf3a8 Mon Sep 17 00:00:00 2001
From: Kashyap Chamarthy <kashyap.cv@gmail.com>
Date: Sat, 13 Oct 2012 01:30:37 +0530
Subject: [PATCH] Add documentation for 'qemu-img info --backing-chain'
Signed-off-by: Kashyap Chamarthy <kashyap.cv@gmail.com>
---
qemu-img.texi | 19 ++++++++++++++++++-
1 file changed, 18 insertions(+), 1 deletion(-)
diff --git a/qemu-img.texi b/qemu-img.texi
index 8b05f2c42801a2535ab4390b47bc415eb880625a..6bbb7a774797fb0cb702d2ff6fc585d90cc0984a 100644
--- a/qemu-img.texi
+++ b/qemu-img.texi
@@ -28,6 +28,10 @@ Command parameters:
is the disk image format. It is guessed automatically in most cases. See below
for a description of the supported disk formats.
+@item --backing-chain
+will enumerate information about backing files in a disk image chain. Refer
+below for further description.
+
@item size
is the disk image size in bytes. Optional suffixes @code{k} or @code{K}
(kilobyte, 1024) @code{M} (megabyte, 1024k) and @code{G} (gigabyte, 1024M)
@@ -129,7 +133,7 @@ created as a copy on write image of the specified base image; the
@var{backing_file} should have the same content as the input's base image,
however the path, image format, etc may differ.
-@item info [-f @var{fmt}] [--output=@var{ofmt}] @var{filename}
+@item info [-f @var{fmt}] [--output=@var{ofamt}] [--backing-chain] @var{filename}
Give information about the disk image @var{filename}. Use it in
particular to know the size reserved on disk which can be different
@@ -137,6 +141,19 @@ from the displayed size. If VM snapshots are stored in the disk image,
they are displayed too. The command can output in the format @var{ofmt}
which is either @code{human} or @code{json}.
+If a disk image has a backing file chain, information about each disk image in
+the chain can be recursively enumerated by using the option @code{--backing-chain}
+
+For instance, if you have an image chain like:
+
+ base.qcow2 <- snap1.qcow2 <- snap2.qcow2
+
+To enumerate information about each disk image in the above chain, starting from top to base, do:
+
+ @example
+ qemu-img info --backing-chain snap2.qcow2
+ @end example
+
@item snapshot [-l | -a @var{snapshot} | -c @var{snapshot} | -d @var{snapshot} ] @var{filename}
List, apply, create or delete snapshots in image @var{filename}.
--
1.7.12.1
next prev parent reply other threads:[~2012-10-12 20:19 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-12 14:09 [Qemu-devel] [PATCH] qemu-img: Add --backing-chain option to info command Stefan Hajnoczi
2012-10-12 14:18 ` Eric Blake
2012-10-12 14:24 ` Eric Blake
2012-10-12 14:27 ` Kevin Wolf
2012-10-12 14:32 ` Eric Blake
2012-10-12 14:38 ` Kevin Wolf
2012-10-12 14:50 ` Eric Blake
2012-10-12 19:16 ` Kashyap Chamarthy
2012-10-12 20:19 ` Kashyap Chamarthy [this message]
2012-10-12 20:31 ` Eric Blake
2012-10-13 15:50 ` Kashyap Chamarthy
2012-10-13 21:36 ` Eric Blake
2012-10-14 6:10 ` Kashyap Chamarthy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAOaxAcbDNmO2265LNvmCur0DPOEu29SEWOG66jTB5owNs1jxOA@mail.gmail.com \
--to=kashyap.cv@gmail.com \
--cc=benoit@irqsave.net \
--cc=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).