[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 13/18] qemu-img: Add 'resize' command to grow/shrink
From: |
Kevin Wolf |
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 |
From: Stefan Hajnoczi <address@hidden>
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 <address@hidden>
Signed-off-by: Kevin Wolf <address@hidden>
---
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
address@hidden rebase @var{filename} [+ | address@hidden
@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}.
+
address@hidden resize @var{filename} [+ | address@hidden
+
+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
- [Qemu-devel] [PATCH 07/18] vmdk: Clean up backing file handling, (continued)
- [Qemu-devel] [PATCH 07/18] vmdk: Clean up backing file handling, Kevin Wolf, 2010/04/30
- [Qemu-devel] [PATCH 04/18] block: Open the underlying image file in generic code, Kevin Wolf, 2010/04/30
- [Qemu-devel] [PATCH 09/18] block: Set backing_hd to NULL after deleting it, Kevin Wolf, 2010/04/30
- [Qemu-devel] [PATCH 10/18] qcow2: Avoid shadowing variable in alloc_clusters_noref(), Kevin Wolf, 2010/04/30
- [Qemu-devel] [PATCH 11/18] raw-posix: Use pread/pwrite instead of lseek+read/write, Kevin Wolf, 2010/04/30
- [Qemu-devel] [PATCH 12/18] block: Cache total_sectors to reduce bdrv_getlength calls, Kevin Wolf, 2010/04/30
- [Qemu-devel] [PATCH 14/18] qcow2: Remove abort on free_clusters failure, Kevin Wolf, 2010/04/30
- [Qemu-devel] [PATCH 17/18] qemu-img rebase: Fix output image corruption, Kevin Wolf, 2010/04/30
- [Qemu-devel] [PATCH 15/18] qcow2: Implement bdrv_truncate() for growing images, Kevin Wolf, 2010/04/30
- [Qemu-devel] [PATCH 18/18] block: Release allocated options after bdrv_open, Kevin Wolf, 2010/04/30
- [Qemu-devel] [PATCH 13/18] qemu-img: Add 'resize' command to grow/shrink disk images,
Kevin Wolf <=
- [Qemu-devel] [PATCH 16/18] block: Add wr_highest_sector blockstat, Kevin Wolf, 2010/04/30