From: Kevin Wolf <kwolf@redhat.com>
To: aliguori@linux.vnet.ibm.com
Cc: kwolf@redhat.com, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH 13/18] qemu-img: Add 'resize' command to grow/shrink disk images
Date: Fri, 30 Apr 2010 16:00:35 +0200 [thread overview]
Message-ID: <1272636040-17374-14-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1272636040-17374-1-git-send-email-kwolf@redhat.com>
From: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
This patch adds a 'resize' command to grow/shrink disk images. This
allows changing the size of disk images without copying to a new image
file. Currently only raw files support resize.
Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
qemu-img-cmds.hx | 6 +++
qemu-img.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
qemu-img.texi | 12 +++++++
3 files changed, 110 insertions(+), 0 deletions(-)
diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx
index f96876a..c079019 100644
--- a/qemu-img-cmds.hx
+++ b/qemu-img-cmds.hx
@@ -49,5 +49,11 @@ DEF("rebase", img_rebase,
"rebase [-f fmt] [-u] -b backing_file [-F backing_fmt] filename")
STEXI
@item rebase [-f @var{fmt}] [-u] -b @var{backing_file} [-F @var{backing_fmt}] @var{filename}
+ETEXI
+
+DEF("resize", img_resize,
+ "resize filename [+ | -]size")
+STEXI
+@item rebase @var{filename} [+ | -]@var{size}
@end table
ETEXI
diff --git a/qemu-img.c b/qemu-img.c
index 74311a5..c21d999 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -1225,6 +1225,98 @@ static int img_rebase(int argc, char **argv)
return 0;
}
+static int img_resize(int argc, char **argv)
+{
+ int c, ret, relative;
+ const char *filename, *fmt, *size;
+ int64_t n, total_size;
+ BlockDriverState *bs;
+ QEMUOptionParameter *param;
+ QEMUOptionParameter resize_options[] = {
+ {
+ .name = BLOCK_OPT_SIZE,
+ .type = OPT_SIZE,
+ .help = "Virtual disk size"
+ },
+ { NULL }
+ };
+
+ fmt = NULL;
+ for(;;) {
+ c = getopt(argc, argv, "f:h");
+ if (c == -1) {
+ break;
+ }
+ switch(c) {
+ case 'h':
+ help();
+ break;
+ case 'f':
+ fmt = optarg;
+ break;
+ }
+ }
+ if (optind + 1 >= argc) {
+ help();
+ }
+ filename = argv[optind++];
+ size = argv[optind++];
+
+ /* Choose grow, shrink, or absolute resize mode */
+ switch (size[0]) {
+ case '+':
+ relative = 1;
+ size++;
+ break;
+ case '-':
+ relative = -1;
+ size++;
+ break;
+ default:
+ relative = 0;
+ break;
+ }
+
+ /* Parse size */
+ param = parse_option_parameters("", resize_options, NULL);
+ if (set_option_parameter(param, BLOCK_OPT_SIZE, size)) {
+ /* Error message already printed when size parsing fails */
+ exit(1);
+ }
+ n = get_option_parameter(param, BLOCK_OPT_SIZE)->value.n;
+ free_option_parameters(param);
+
+ bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR);
+
+ if (relative) {
+ total_size = bdrv_getlength(bs) + n * relative;
+ } else {
+ total_size = n;
+ }
+ if (total_size <= 0) {
+ error("New image size must be positive");
+ }
+
+ ret = bdrv_truncate(bs, total_size);
+ switch (ret) {
+ case 0:
+ printf("Image resized.\n");
+ break;
+ case -ENOTSUP:
+ error("This image format does not support resize");
+ break;
+ case -EACCES:
+ error("Image is read-only");
+ break;
+ default:
+ error("Error resizing image (%d)", -ret);
+ break;
+ }
+
+ bdrv_delete(bs);
+ return 0;
+}
+
static const img_cmd_t img_cmds[] = {
#define DEF(option, callback, arg_string) \
{ option, callback },
diff --git a/qemu-img.texi b/qemu-img.texi
index ac97854..c1b1f27 100644
--- a/qemu-img.texi
+++ b/qemu-img.texi
@@ -106,6 +106,18 @@ they are displayed too.
@item snapshot [-l | -a @var{snapshot} | -c @var{snapshot} | -d @var{snapshot} ] @var{filename}
List, apply, create or delete snapshots in image @var{filename}.
+
+@item resize @var{filename} [+ | -]@var{size}
+
+Change the disk image as if it had been created with @var{size}.
+
+Before using this command to shrink a disk image, you MUST use file system and
+partitioning tools inside the VM to reduce allocated file systems and partition
+sizes accordingly. Failure to do so will result in data loss!
+
+After using this command to grow a disk image, you must use file system and
+partitioning tools inside the VM to actually begin using the new space on the
+device.
@end table
Supported image file formats:
--
1.6.6.1
next prev parent reply other threads:[~2010-04-30 14:21 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-04-30 14:00 [Qemu-devel] [PULL 00/18] Block patches Kevin Wolf
2010-04-30 14:00 ` [Qemu-devel] [PATCH 01/18] block: separate raw images from the file protocol Kevin Wolf
2010-04-30 14:00 ` [Qemu-devel] [PATCH 02/18] block: Split bdrv_open Kevin Wolf
2010-04-30 14:00 ` [Qemu-devel] [PATCH 03/18] block: Avoid forward declaration of bdrv_open_common Kevin Wolf
2010-04-30 14:00 ` [Qemu-devel] [PATCH 04/18] block: Open the underlying image file in generic code Kevin Wolf
2010-04-30 14:00 ` [Qemu-devel] [PATCH 05/18] block: bdrv_has_zero_init Kevin Wolf
2010-04-30 14:00 ` [Qemu-devel] [PATCH 06/18] vmdk: Fix COW Kevin Wolf
2010-04-30 14:00 ` [Qemu-devel] [PATCH 07/18] vmdk: Clean up backing file handling Kevin Wolf
2010-04-30 14:00 ` [Qemu-devel] [PATCH 08/18] vmdk: Convert to bdrv_open Kevin Wolf
2010-04-30 14:00 ` [Qemu-devel] [PATCH 09/18] block: Set backing_hd to NULL after deleting it Kevin Wolf
2010-04-30 14:00 ` [Qemu-devel] [PATCH 10/18] qcow2: Avoid shadowing variable in alloc_clusters_noref() Kevin Wolf
2010-04-30 14:00 ` [Qemu-devel] [PATCH 11/18] raw-posix: Use pread/pwrite instead of lseek+read/write Kevin Wolf
2010-04-30 14:00 ` [Qemu-devel] [PATCH 12/18] block: Cache total_sectors to reduce bdrv_getlength calls Kevin Wolf
2010-04-30 14:00 ` Kevin Wolf [this message]
2010-04-30 14:00 ` [Qemu-devel] [PATCH 14/18] qcow2: Remove abort on free_clusters failure Kevin Wolf
2010-04-30 14:00 ` [Qemu-devel] [PATCH 15/18] qcow2: Implement bdrv_truncate() for growing images Kevin Wolf
2010-04-30 14:00 ` [Qemu-devel] [PATCH 16/18] block: Add wr_highest_sector blockstat Kevin Wolf
2010-04-30 14:00 ` [Qemu-devel] [PATCH 17/18] qemu-img rebase: Fix output image corruption Kevin Wolf
2010-04-30 14:00 ` [Qemu-devel] [PATCH 18/18] block: Release allocated options after bdrv_open Kevin Wolf
2010-05-03 13:01 ` [Qemu-devel] Re: [PULL 00/18] Block patches Anthony Liguori
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=1272636040-17374-14-git-send-email-kwolf@redhat.com \
--to=kwolf@redhat.com \
--cc=aliguori@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
/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).