qapi: add QMP dispatch functions
[qemu/mdroth.git] / qemu-img.c
blob54137a4e922aed1e7d63540da105d1ef1776a9dd
1 /*
2 * QEMU disk image utility
4 * Copyright (c) 2003-2008 Fabrice Bellard
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
24 #include "qemu-common.h"
25 #include "qemu-option.h"
26 #include "qemu-error.h"
27 #include "osdep.h"
28 #include "sysemu.h"
29 #include "block_int.h"
30 #include <stdio.h>
32 #ifdef _WIN32
33 #include <windows.h>
34 #endif
36 typedef struct img_cmd_t {
37 const char *name;
38 int (*handler)(int argc, char **argv);
39 } img_cmd_t;
41 /* Default to cache=writeback as data integrity is not important for qemu-tcg. */
42 #define BDRV_O_FLAGS BDRV_O_CACHE_WB
43 #define BDRV_DEFAULT_CACHE "writeback"
45 static void format_print(void *opaque, const char *name)
47 printf(" %s", name);
50 /* Please keep in synch with qemu-img.texi */
51 static void help(void)
53 const char *help_msg =
54 "qemu-img version " QEMU_VERSION ", Copyright (c) 2004-2008 Fabrice Bellard\n"
55 "usage: qemu-img command [command options]\n"
56 "QEMU disk image utility\n"
57 "\n"
58 "Command syntax:\n"
59 #define DEF(option, callback, arg_string) \
60 " " arg_string "\n"
61 #include "qemu-img-cmds.h"
62 #undef DEF
63 #undef GEN_DOCS
64 "\n"
65 "Command parameters:\n"
66 " 'filename' is a disk image filename\n"
67 " 'fmt' is the disk image format. It is guessed automatically in most cases\n"
68 " 'cache' is the cache mode used to write the output disk image, the valid\n"
69 " options are: 'none', 'writeback' (default), 'writethrough' and 'unsafe'\n"
70 " 'size' is the disk image size in bytes. Optional suffixes\n"
71 " 'k' or 'K' (kilobyte, 1024), 'M' (megabyte, 1024k), 'G' (gigabyte, 1024M)\n"
72 " and T (terabyte, 1024G) are supported. 'b' is ignored.\n"
73 " 'output_filename' is the destination disk image filename\n"
74 " 'output_fmt' is the destination format\n"
75 " 'options' is a comma separated list of format specific options in a\n"
76 " name=value format. Use -o ? for an overview of the options supported by the\n"
77 " used format\n"
78 " '-c' indicates that target image must be compressed (qcow format only)\n"
79 " '-u' enables unsafe rebasing. It is assumed that old and new backing file\n"
80 " match exactly. The image doesn't need a working backing file before\n"
81 " rebasing in this case (useful for renaming the backing file)\n"
82 " '-h' with or without a command shows this help and lists the supported formats\n"
83 " '-p' show progress of command (only certain commands)\n"
84 "\n"
85 "Parameters to snapshot subcommand:\n"
86 " 'snapshot' is the name of the snapshot to create, apply or delete\n"
87 " '-a' applies a snapshot (revert disk to saved state)\n"
88 " '-c' creates a snapshot\n"
89 " '-d' deletes a snapshot\n"
90 " '-l' lists all snapshots in the given image\n";
92 printf("%s\nSupported formats:", help_msg);
93 bdrv_iterate_format(format_print, NULL);
94 printf("\n");
95 exit(1);
98 #if defined(WIN32)
99 /* XXX: put correct support for win32 */
100 static int read_password(char *buf, int buf_size)
102 int c, i;
103 printf("Password: ");
104 fflush(stdout);
105 i = 0;
106 for(;;) {
107 c = getchar();
108 if (c == '\n')
109 break;
110 if (i < (buf_size - 1))
111 buf[i++] = c;
113 buf[i] = '\0';
114 return 0;
117 #else
119 #include <termios.h>
121 static struct termios oldtty;
123 static void term_exit(void)
125 tcsetattr (0, TCSANOW, &oldtty);
128 static void term_init(void)
130 struct termios tty;
132 tcgetattr (0, &tty);
133 oldtty = tty;
135 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
136 |INLCR|IGNCR|ICRNL|IXON);
137 tty.c_oflag |= OPOST;
138 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
139 tty.c_cflag &= ~(CSIZE|PARENB);
140 tty.c_cflag |= CS8;
141 tty.c_cc[VMIN] = 1;
142 tty.c_cc[VTIME] = 0;
144 tcsetattr (0, TCSANOW, &tty);
146 atexit(term_exit);
149 static int read_password(char *buf, int buf_size)
151 uint8_t ch;
152 int i, ret;
154 printf("password: ");
155 fflush(stdout);
156 term_init();
157 i = 0;
158 for(;;) {
159 ret = read(0, &ch, 1);
160 if (ret == -1) {
161 if (errno == EAGAIN || errno == EINTR) {
162 continue;
163 } else {
164 ret = -1;
165 break;
167 } else if (ret == 0) {
168 ret = -1;
169 break;
170 } else {
171 if (ch == '\r') {
172 ret = 0;
173 break;
175 if (i < (buf_size - 1))
176 buf[i++] = ch;
179 term_exit();
180 buf[i] = '\0';
181 printf("\n");
182 return ret;
184 #endif
186 static int set_cache_flag(const char *mode, int *flags)
188 *flags &= ~BDRV_O_CACHE_MASK;
190 if (!strcmp(mode, "none") || !strcmp(mode, "off")) {
191 *flags |= BDRV_O_CACHE_WB;
192 *flags |= BDRV_O_NOCACHE;
193 } else if (!strcmp(mode, "writeback")) {
194 *flags |= BDRV_O_CACHE_WB;
195 } else if (!strcmp(mode, "unsafe")) {
196 *flags |= BDRV_O_CACHE_WB;
197 *flags |= BDRV_O_NO_FLUSH;
198 } else if (!strcmp(mode, "writethrough")) {
199 /* this is the default */
200 } else {
201 return -1;
204 return 0;
207 static int print_block_option_help(const char *filename, const char *fmt)
209 BlockDriver *drv, *proto_drv;
210 QEMUOptionParameter *create_options = NULL;
212 /* Find driver and parse its options */
213 drv = bdrv_find_format(fmt);
214 if (!drv) {
215 error_report("Unknown file format '%s'", fmt);
216 return 1;
219 proto_drv = bdrv_find_protocol(filename);
220 if (!proto_drv) {
221 error_report("Unknown protocol '%s'", filename);
222 return 1;
225 create_options = append_option_parameters(create_options,
226 drv->create_options);
227 create_options = append_option_parameters(create_options,
228 proto_drv->create_options);
229 print_option_help(create_options);
230 free_option_parameters(create_options);
231 return 0;
234 static BlockDriverState *bdrv_new_open(const char *filename,
235 const char *fmt,
236 int flags)
238 BlockDriverState *bs;
239 BlockDriver *drv;
240 char password[256];
241 int ret;
243 bs = bdrv_new("image");
245 if (fmt) {
246 drv = bdrv_find_format(fmt);
247 if (!drv) {
248 error_report("Unknown file format '%s'", fmt);
249 goto fail;
251 } else {
252 drv = NULL;
255 ret = bdrv_open(bs, filename, flags, drv);
256 if (ret < 0) {
257 error_report("Could not open '%s': %s", filename, strerror(-ret));
258 goto fail;
261 if (bdrv_is_encrypted(bs)) {
262 printf("Disk image '%s' is encrypted.\n", filename);
263 if (read_password(password, sizeof(password)) < 0) {
264 error_report("No password given");
265 goto fail;
267 if (bdrv_set_key(bs, password) < 0) {
268 error_report("invalid password");
269 goto fail;
272 return bs;
273 fail:
274 if (bs) {
275 bdrv_delete(bs);
277 return NULL;
280 static int add_old_style_options(const char *fmt, QEMUOptionParameter *list,
281 const char *base_filename,
282 const char *base_fmt)
284 if (base_filename) {
285 if (set_option_parameter(list, BLOCK_OPT_BACKING_FILE, base_filename)) {
286 error_report("Backing file not supported for file format '%s'",
287 fmt);
288 return -1;
291 if (base_fmt) {
292 if (set_option_parameter(list, BLOCK_OPT_BACKING_FMT, base_fmt)) {
293 error_report("Backing file format not supported for file "
294 "format '%s'", fmt);
295 return -1;
298 return 0;
301 static int img_create(int argc, char **argv)
303 int c, ret = 0;
304 uint64_t img_size = -1;
305 const char *fmt = "raw";
306 const char *base_fmt = NULL;
307 const char *filename;
308 const char *base_filename = NULL;
309 char *options = NULL;
311 for(;;) {
312 c = getopt(argc, argv, "F:b:f:he6o:");
313 if (c == -1) {
314 break;
316 switch(c) {
317 case '?':
318 case 'h':
319 help();
320 break;
321 case 'F':
322 base_fmt = optarg;
323 break;
324 case 'b':
325 base_filename = optarg;
326 break;
327 case 'f':
328 fmt = optarg;
329 break;
330 case 'e':
331 error_report("option -e is deprecated, please use \'-o "
332 "encryption\' instead!");
333 return 1;
334 case '6':
335 error_report("option -6 is deprecated, please use \'-o "
336 "compat6\' instead!");
337 return 1;
338 case 'o':
339 options = optarg;
340 break;
344 /* Get the filename */
345 if (optind >= argc) {
346 help();
348 filename = argv[optind++];
350 /* Get image size, if specified */
351 if (optind < argc) {
352 int64_t sval;
353 sval = strtosz_suffix(argv[optind++], NULL, STRTOSZ_DEFSUFFIX_B);
354 if (sval < 0) {
355 error_report("Invalid image size specified! You may use k, M, G or "
356 "T suffixes for ");
357 error_report("kilobytes, megabytes, gigabytes and terabytes.");
358 ret = -1;
359 goto out;
361 img_size = (uint64_t)sval;
364 if (options && !strcmp(options, "?")) {
365 ret = print_block_option_help(filename, fmt);
366 goto out;
369 ret = bdrv_img_create(filename, fmt, base_filename, base_fmt,
370 options, img_size, BDRV_O_FLAGS);
371 out:
372 if (ret) {
373 return 1;
375 return 0;
379 * Checks an image for consistency. Exit codes:
381 * 0 - Check completed, image is good
382 * 1 - Check not completed because of internal errors
383 * 2 - Check completed, image is corrupted
384 * 3 - Check completed, image has leaked clusters, but is good otherwise
386 static int img_check(int argc, char **argv)
388 int c, ret;
389 const char *filename, *fmt;
390 BlockDriverState *bs;
391 BdrvCheckResult result;
393 fmt = NULL;
394 for(;;) {
395 c = getopt(argc, argv, "f:h");
396 if (c == -1) {
397 break;
399 switch(c) {
400 case '?':
401 case 'h':
402 help();
403 break;
404 case 'f':
405 fmt = optarg;
406 break;
409 if (optind >= argc) {
410 help();
412 filename = argv[optind++];
414 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS);
415 if (!bs) {
416 return 1;
418 ret = bdrv_check(bs, &result);
420 if (ret == -ENOTSUP) {
421 error_report("This image format does not support checks");
422 bdrv_delete(bs);
423 return 1;
426 if (!(result.corruptions || result.leaks || result.check_errors)) {
427 printf("No errors were found on the image.\n");
428 } else {
429 if (result.corruptions) {
430 printf("\n%d errors were found on the image.\n"
431 "Data may be corrupted, or further writes to the image "
432 "may corrupt it.\n",
433 result.corruptions);
436 if (result.leaks) {
437 printf("\n%d leaked clusters were found on the image.\n"
438 "This means waste of disk space, but no harm to data.\n",
439 result.leaks);
442 if (result.check_errors) {
443 printf("\n%d internal errors have occurred during the check.\n",
444 result.check_errors);
448 bdrv_delete(bs);
450 if (ret < 0 || result.check_errors) {
451 printf("\nAn error has occurred during the check: %s\n"
452 "The check is not complete and may have missed error.\n",
453 strerror(-ret));
454 return 1;
457 if (result.corruptions) {
458 return 2;
459 } else if (result.leaks) {
460 return 3;
461 } else {
462 return 0;
466 static int img_commit(int argc, char **argv)
468 int c, ret, flags;
469 const char *filename, *fmt, *cache;
470 BlockDriverState *bs;
472 fmt = NULL;
473 cache = BDRV_DEFAULT_CACHE;
474 for(;;) {
475 c = getopt(argc, argv, "f:ht:");
476 if (c == -1) {
477 break;
479 switch(c) {
480 case '?':
481 case 'h':
482 help();
483 break;
484 case 'f':
485 fmt = optarg;
486 break;
487 case 't':
488 cache = optarg;
489 break;
492 if (optind >= argc) {
493 help();
495 filename = argv[optind++];
497 flags = BDRV_O_RDWR;
498 ret = set_cache_flag(cache, &flags);
499 if (ret < 0) {
500 error_report("Invalid cache option: %s", cache);
501 return -1;
504 bs = bdrv_new_open(filename, fmt, flags);
505 if (!bs) {
506 return 1;
508 ret = bdrv_commit(bs);
509 switch(ret) {
510 case 0:
511 printf("Image committed.\n");
512 break;
513 case -ENOENT:
514 error_report("No disk inserted");
515 break;
516 case -EACCES:
517 error_report("Image is read-only");
518 break;
519 case -ENOTSUP:
520 error_report("Image is already committed");
521 break;
522 default:
523 error_report("Error while committing image");
524 break;
527 bdrv_delete(bs);
528 if (ret) {
529 return 1;
531 return 0;
535 * Checks whether the sector is not a zero sector.
537 * Attention! The len must be a multiple of 4 * sizeof(long) due to
538 * restriction of optimizations in this function.
540 static int is_not_zero(const uint8_t *sector, int len)
543 * Use long as the biggest available internal data type that fits into the
544 * CPU register and unroll the loop to smooth out the effect of memory
545 * latency.
548 int i;
549 long d0, d1, d2, d3;
550 const long * const data = (const long *) sector;
552 len /= sizeof(long);
554 for(i = 0; i < len; i += 4) {
555 d0 = data[i + 0];
556 d1 = data[i + 1];
557 d2 = data[i + 2];
558 d3 = data[i + 3];
560 if (d0 || d1 || d2 || d3) {
561 return 1;
565 return 0;
569 * Returns true iff the first sector pointed to by 'buf' contains at least
570 * a non-NUL byte.
572 * 'pnum' is set to the number of sectors (including and immediately following
573 * the first one) that are known to be in the same allocated/unallocated state.
575 static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum)
577 int v, i;
579 if (n <= 0) {
580 *pnum = 0;
581 return 0;
583 v = is_not_zero(buf, 512);
584 for(i = 1; i < n; i++) {
585 buf += 512;
586 if (v != is_not_zero(buf, 512))
587 break;
589 *pnum = i;
590 return v;
594 * Compares two buffers sector by sector. Returns 0 if the first sector of both
595 * buffers matches, non-zero otherwise.
597 * pnum is set to the number of sectors (including and immediately following
598 * the first one) that are known to have the same comparison result
600 static int compare_sectors(const uint8_t *buf1, const uint8_t *buf2, int n,
601 int *pnum)
603 int res, i;
605 if (n <= 0) {
606 *pnum = 0;
607 return 0;
610 res = !!memcmp(buf1, buf2, 512);
611 for(i = 1; i < n; i++) {
612 buf1 += 512;
613 buf2 += 512;
615 if (!!memcmp(buf1, buf2, 512) != res) {
616 break;
620 *pnum = i;
621 return res;
624 #define IO_BUF_SIZE (2 * 1024 * 1024)
626 static int img_convert(int argc, char **argv)
628 int c, ret = 0, n, n1, bs_n, bs_i, compress, cluster_size, cluster_sectors;
629 int progress = 0, flags;
630 const char *fmt, *out_fmt, *cache, *out_baseimg, *out_filename;
631 BlockDriver *drv, *proto_drv;
632 BlockDriverState **bs = NULL, *out_bs = NULL;
633 int64_t total_sectors, nb_sectors, sector_num, bs_offset;
634 uint64_t bs_sectors;
635 uint8_t * buf = NULL;
636 const uint8_t *buf1;
637 BlockDriverInfo bdi;
638 QEMUOptionParameter *param = NULL, *create_options = NULL;
639 QEMUOptionParameter *out_baseimg_param;
640 char *options = NULL;
641 const char *snapshot_name = NULL;
642 float local_progress;
644 fmt = NULL;
645 out_fmt = "raw";
646 cache = "unsafe";
647 out_baseimg = NULL;
648 compress = 0;
649 for(;;) {
650 c = getopt(argc, argv, "f:O:B:s:hce6o:pt:");
651 if (c == -1) {
652 break;
654 switch(c) {
655 case '?':
656 case 'h':
657 help();
658 break;
659 case 'f':
660 fmt = optarg;
661 break;
662 case 'O':
663 out_fmt = optarg;
664 break;
665 case 'B':
666 out_baseimg = optarg;
667 break;
668 case 'c':
669 compress = 1;
670 break;
671 case 'e':
672 error_report("option -e is deprecated, please use \'-o "
673 "encryption\' instead!");
674 return 1;
675 case '6':
676 error_report("option -6 is deprecated, please use \'-o "
677 "compat6\' instead!");
678 return 1;
679 case 'o':
680 options = optarg;
681 break;
682 case 's':
683 snapshot_name = optarg;
684 break;
685 case 'p':
686 progress = 1;
687 break;
688 case 't':
689 cache = optarg;
690 break;
694 bs_n = argc - optind - 1;
695 if (bs_n < 1) {
696 help();
699 out_filename = argv[argc - 1];
701 if (options && !strcmp(options, "?")) {
702 ret = print_block_option_help(out_filename, out_fmt);
703 goto out;
706 if (bs_n > 1 && out_baseimg) {
707 error_report("-B makes no sense when concatenating multiple input "
708 "images");
709 ret = -1;
710 goto out;
713 qemu_progress_init(progress, 2.0);
714 qemu_progress_print(0, 100);
716 bs = qemu_mallocz(bs_n * sizeof(BlockDriverState *));
718 total_sectors = 0;
719 for (bs_i = 0; bs_i < bs_n; bs_i++) {
720 bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, BDRV_O_FLAGS);
721 if (!bs[bs_i]) {
722 error_report("Could not open '%s'", argv[optind + bs_i]);
723 ret = -1;
724 goto out;
726 bdrv_get_geometry(bs[bs_i], &bs_sectors);
727 total_sectors += bs_sectors;
730 if (snapshot_name != NULL) {
731 if (bs_n > 1) {
732 error_report("No support for concatenating multiple snapshot");
733 ret = -1;
734 goto out;
736 if (bdrv_snapshot_load_tmp(bs[0], snapshot_name) < 0) {
737 error_report("Failed to load snapshot");
738 ret = -1;
739 goto out;
743 /* Find driver and parse its options */
744 drv = bdrv_find_format(out_fmt);
745 if (!drv) {
746 error_report("Unknown file format '%s'", out_fmt);
747 ret = -1;
748 goto out;
751 proto_drv = bdrv_find_protocol(out_filename);
752 if (!proto_drv) {
753 error_report("Unknown protocol '%s'", out_filename);
754 ret = -1;
755 goto out;
758 create_options = append_option_parameters(create_options,
759 drv->create_options);
760 create_options = append_option_parameters(create_options,
761 proto_drv->create_options);
763 if (options) {
764 param = parse_option_parameters(options, create_options, param);
765 if (param == NULL) {
766 error_report("Invalid options for file format '%s'.", out_fmt);
767 ret = -1;
768 goto out;
770 } else {
771 param = parse_option_parameters("", create_options, param);
774 set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
775 ret = add_old_style_options(out_fmt, param, out_baseimg, NULL);
776 if (ret < 0) {
777 goto out;
780 /* Get backing file name if -o backing_file was used */
781 out_baseimg_param = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
782 if (out_baseimg_param) {
783 out_baseimg = out_baseimg_param->value.s;
786 /* Check if compression is supported */
787 if (compress) {
788 QEMUOptionParameter *encryption =
789 get_option_parameter(param, BLOCK_OPT_ENCRYPT);
791 if (!drv->bdrv_write_compressed) {
792 error_report("Compression not supported for this file format");
793 ret = -1;
794 goto out;
797 if (encryption && encryption->value.n) {
798 error_report("Compression and encryption not supported at "
799 "the same time");
800 ret = -1;
801 goto out;
805 /* Create the new image */
806 ret = bdrv_create(drv, out_filename, param);
807 if (ret < 0) {
808 if (ret == -ENOTSUP) {
809 error_report("Formatting not supported for file format '%s'",
810 out_fmt);
811 } else if (ret == -EFBIG) {
812 error_report("The image size is too large for file format '%s'",
813 out_fmt);
814 } else {
815 error_report("%s: error while converting %s: %s",
816 out_filename, out_fmt, strerror(-ret));
818 goto out;
821 flags = BDRV_O_RDWR;
822 ret = set_cache_flag(cache, &flags);
823 if (ret < 0) {
824 error_report("Invalid cache option: %s", cache);
825 return -1;
828 out_bs = bdrv_new_open(out_filename, out_fmt, flags);
829 if (!out_bs) {
830 ret = -1;
831 goto out;
834 bs_i = 0;
835 bs_offset = 0;
836 bdrv_get_geometry(bs[0], &bs_sectors);
837 buf = qemu_malloc(IO_BUF_SIZE);
839 if (compress) {
840 ret = bdrv_get_info(out_bs, &bdi);
841 if (ret < 0) {
842 error_report("could not get block driver info");
843 goto out;
845 cluster_size = bdi.cluster_size;
846 if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) {
847 error_report("invalid cluster size");
848 ret = -1;
849 goto out;
851 cluster_sectors = cluster_size >> 9;
852 sector_num = 0;
854 nb_sectors = total_sectors;
855 local_progress = (float)100 /
856 (nb_sectors / MIN(nb_sectors, cluster_sectors));
858 for(;;) {
859 int64_t bs_num;
860 int remainder;
861 uint8_t *buf2;
863 nb_sectors = total_sectors - sector_num;
864 if (nb_sectors <= 0)
865 break;
866 if (nb_sectors >= cluster_sectors)
867 n = cluster_sectors;
868 else
869 n = nb_sectors;
871 bs_num = sector_num - bs_offset;
872 assert (bs_num >= 0);
873 remainder = n;
874 buf2 = buf;
875 while (remainder > 0) {
876 int nlow;
877 while (bs_num == bs_sectors) {
878 bs_i++;
879 assert (bs_i < bs_n);
880 bs_offset += bs_sectors;
881 bdrv_get_geometry(bs[bs_i], &bs_sectors);
882 bs_num = 0;
883 /* printf("changing part: sector_num=%" PRId64 ", "
884 "bs_i=%d, bs_offset=%" PRId64 ", bs_sectors=%" PRId64
885 "\n", sector_num, bs_i, bs_offset, bs_sectors); */
887 assert (bs_num < bs_sectors);
889 nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
891 ret = bdrv_read(bs[bs_i], bs_num, buf2, nlow);
892 if (ret < 0) {
893 error_report("error while reading");
894 goto out;
897 buf2 += nlow * 512;
898 bs_num += nlow;
900 remainder -= nlow;
902 assert (remainder == 0);
904 if (n < cluster_sectors) {
905 memset(buf + n * 512, 0, cluster_size - n * 512);
907 if (is_not_zero(buf, cluster_size)) {
908 ret = bdrv_write_compressed(out_bs, sector_num, buf,
909 cluster_sectors);
910 if (ret != 0) {
911 error_report("error while compressing sector %" PRId64,
912 sector_num);
913 goto out;
916 sector_num += n;
917 qemu_progress_print(local_progress, 100);
919 /* signal EOF to align */
920 bdrv_write_compressed(out_bs, 0, NULL, 0);
921 } else {
922 int has_zero_init = bdrv_has_zero_init(out_bs);
924 sector_num = 0; // total number of sectors converted so far
925 nb_sectors = total_sectors - sector_num;
926 local_progress = (float)100 /
927 (nb_sectors / MIN(nb_sectors, IO_BUF_SIZE / 512));
929 for(;;) {
930 nb_sectors = total_sectors - sector_num;
931 if (nb_sectors <= 0) {
932 break;
934 if (nb_sectors >= (IO_BUF_SIZE / 512)) {
935 n = (IO_BUF_SIZE / 512);
936 } else {
937 n = nb_sectors;
940 while (sector_num - bs_offset >= bs_sectors) {
941 bs_i ++;
942 assert (bs_i < bs_n);
943 bs_offset += bs_sectors;
944 bdrv_get_geometry(bs[bs_i], &bs_sectors);
945 /* printf("changing part: sector_num=%" PRId64 ", bs_i=%d, "
946 "bs_offset=%" PRId64 ", bs_sectors=%" PRId64 "\n",
947 sector_num, bs_i, bs_offset, bs_sectors); */
950 if (n > bs_offset + bs_sectors - sector_num) {
951 n = bs_offset + bs_sectors - sector_num;
954 if (has_zero_init) {
955 /* If the output image is being created as a copy on write image,
956 assume that sectors which are unallocated in the input image
957 are present in both the output's and input's base images (no
958 need to copy them). */
959 if (out_baseimg) {
960 if (!bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
961 n, &n1)) {
962 sector_num += n1;
963 continue;
965 /* The next 'n1' sectors are allocated in the input image. Copy
966 only those as they may be followed by unallocated sectors. */
967 n = n1;
969 } else {
970 n1 = n;
973 ret = bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n);
974 if (ret < 0) {
975 error_report("error while reading");
976 goto out;
978 /* NOTE: at the same time we convert, we do not write zero
979 sectors to have a chance to compress the image. Ideally, we
980 should add a specific call to have the info to go faster */
981 buf1 = buf;
982 while (n > 0) {
983 /* If the output image is being created as a copy on write image,
984 copy all sectors even the ones containing only NUL bytes,
985 because they may differ from the sectors in the base image.
987 If the output is to a host device, we also write out
988 sectors that are entirely 0, since whatever data was
989 already there is garbage, not 0s. */
990 if (!has_zero_init || out_baseimg ||
991 is_allocated_sectors(buf1, n, &n1)) {
992 ret = bdrv_write(out_bs, sector_num, buf1, n1);
993 if (ret < 0) {
994 error_report("error while writing");
995 goto out;
998 sector_num += n1;
999 n -= n1;
1000 buf1 += n1 * 512;
1002 qemu_progress_print(local_progress, 100);
1005 out:
1006 qemu_progress_end();
1007 free_option_parameters(create_options);
1008 free_option_parameters(param);
1009 qemu_free(buf);
1010 if (out_bs) {
1011 bdrv_delete(out_bs);
1013 if (bs) {
1014 for (bs_i = 0; bs_i < bs_n; bs_i++) {
1015 if (bs[bs_i]) {
1016 bdrv_delete(bs[bs_i]);
1019 qemu_free(bs);
1021 if (ret) {
1022 return 1;
1024 return 0;
1027 #ifdef _WIN32
1028 static int64_t get_allocated_file_size(const char *filename)
1030 typedef DWORD (WINAPI * get_compressed_t)(const char *filename, DWORD *high);
1031 get_compressed_t get_compressed;
1032 struct _stati64 st;
1034 /* WinNT support GetCompressedFileSize to determine allocate size */
1035 get_compressed = (get_compressed_t) GetProcAddress(GetModuleHandle("kernel32"), "GetCompressedFileSizeA");
1036 if (get_compressed) {
1037 DWORD high, low;
1038 low = get_compressed(filename, &high);
1039 if (low != 0xFFFFFFFFlu || GetLastError() == NO_ERROR)
1040 return (((int64_t) high) << 32) + low;
1043 if (_stati64(filename, &st) < 0)
1044 return -1;
1045 return st.st_size;
1047 #else
1048 static int64_t get_allocated_file_size(const char *filename)
1050 struct stat st;
1051 if (stat(filename, &st) < 0)
1052 return -1;
1053 return (int64_t)st.st_blocks * 512;
1055 #endif
1057 static void dump_snapshots(BlockDriverState *bs)
1059 QEMUSnapshotInfo *sn_tab, *sn;
1060 int nb_sns, i;
1061 char buf[256];
1063 nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1064 if (nb_sns <= 0)
1065 return;
1066 printf("Snapshot list:\n");
1067 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
1068 for(i = 0; i < nb_sns; i++) {
1069 sn = &sn_tab[i];
1070 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
1072 qemu_free(sn_tab);
1075 static int img_info(int argc, char **argv)
1077 int c;
1078 const char *filename, *fmt;
1079 BlockDriverState *bs;
1080 char fmt_name[128], size_buf[128], dsize_buf[128];
1081 uint64_t total_sectors;
1082 int64_t allocated_size;
1083 char backing_filename[1024];
1084 char backing_filename2[1024];
1085 BlockDriverInfo bdi;
1087 fmt = NULL;
1088 for(;;) {
1089 c = getopt(argc, argv, "f:h");
1090 if (c == -1) {
1091 break;
1093 switch(c) {
1094 case '?':
1095 case 'h':
1096 help();
1097 break;
1098 case 'f':
1099 fmt = optarg;
1100 break;
1103 if (optind >= argc) {
1104 help();
1106 filename = argv[optind++];
1108 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING);
1109 if (!bs) {
1110 return 1;
1112 bdrv_get_format(bs, fmt_name, sizeof(fmt_name));
1113 bdrv_get_geometry(bs, &total_sectors);
1114 get_human_readable_size(size_buf, sizeof(size_buf), total_sectors * 512);
1115 allocated_size = get_allocated_file_size(filename);
1116 if (allocated_size < 0) {
1117 snprintf(dsize_buf, sizeof(dsize_buf), "unavailable");
1118 } else {
1119 get_human_readable_size(dsize_buf, sizeof(dsize_buf),
1120 allocated_size);
1122 printf("image: %s\n"
1123 "file format: %s\n"
1124 "virtual size: %s (%" PRId64 " bytes)\n"
1125 "disk size: %s\n",
1126 filename, fmt_name, size_buf,
1127 (total_sectors * 512),
1128 dsize_buf);
1129 if (bdrv_is_encrypted(bs)) {
1130 printf("encrypted: yes\n");
1132 if (bdrv_get_info(bs, &bdi) >= 0) {
1133 if (bdi.cluster_size != 0) {
1134 printf("cluster_size: %d\n", bdi.cluster_size);
1137 bdrv_get_backing_filename(bs, backing_filename, sizeof(backing_filename));
1138 if (backing_filename[0] != '\0') {
1139 path_combine(backing_filename2, sizeof(backing_filename2),
1140 filename, backing_filename);
1141 printf("backing file: %s (actual path: %s)\n",
1142 backing_filename,
1143 backing_filename2);
1145 dump_snapshots(bs);
1146 bdrv_delete(bs);
1147 return 0;
1150 #define SNAPSHOT_LIST 1
1151 #define SNAPSHOT_CREATE 2
1152 #define SNAPSHOT_APPLY 3
1153 #define SNAPSHOT_DELETE 4
1155 static int img_snapshot(int argc, char **argv)
1157 BlockDriverState *bs;
1158 QEMUSnapshotInfo sn;
1159 char *filename, *snapshot_name = NULL;
1160 int c, ret = 0, bdrv_oflags;
1161 int action = 0;
1162 qemu_timeval tv;
1164 bdrv_oflags = BDRV_O_FLAGS | BDRV_O_RDWR;
1165 /* Parse commandline parameters */
1166 for(;;) {
1167 c = getopt(argc, argv, "la:c:d:h");
1168 if (c == -1) {
1169 break;
1171 switch(c) {
1172 case '?':
1173 case 'h':
1174 help();
1175 return 0;
1176 case 'l':
1177 if (action) {
1178 help();
1179 return 0;
1181 action = SNAPSHOT_LIST;
1182 bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
1183 break;
1184 case 'a':
1185 if (action) {
1186 help();
1187 return 0;
1189 action = SNAPSHOT_APPLY;
1190 snapshot_name = optarg;
1191 break;
1192 case 'c':
1193 if (action) {
1194 help();
1195 return 0;
1197 action = SNAPSHOT_CREATE;
1198 snapshot_name = optarg;
1199 break;
1200 case 'd':
1201 if (action) {
1202 help();
1203 return 0;
1205 action = SNAPSHOT_DELETE;
1206 snapshot_name = optarg;
1207 break;
1211 if (optind >= argc) {
1212 help();
1214 filename = argv[optind++];
1216 /* Open the image */
1217 bs = bdrv_new_open(filename, NULL, bdrv_oflags);
1218 if (!bs) {
1219 return 1;
1222 /* Perform the requested action */
1223 switch(action) {
1224 case SNAPSHOT_LIST:
1225 dump_snapshots(bs);
1226 break;
1228 case SNAPSHOT_CREATE:
1229 memset(&sn, 0, sizeof(sn));
1230 pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
1232 qemu_gettimeofday(&tv);
1233 sn.date_sec = tv.tv_sec;
1234 sn.date_nsec = tv.tv_usec * 1000;
1236 ret = bdrv_snapshot_create(bs, &sn);
1237 if (ret) {
1238 error_report("Could not create snapshot '%s': %d (%s)",
1239 snapshot_name, ret, strerror(-ret));
1241 break;
1243 case SNAPSHOT_APPLY:
1244 ret = bdrv_snapshot_goto(bs, snapshot_name);
1245 if (ret) {
1246 error_report("Could not apply snapshot '%s': %d (%s)",
1247 snapshot_name, ret, strerror(-ret));
1249 break;
1251 case SNAPSHOT_DELETE:
1252 ret = bdrv_snapshot_delete(bs, snapshot_name);
1253 if (ret) {
1254 error_report("Could not delete snapshot '%s': %d (%s)",
1255 snapshot_name, ret, strerror(-ret));
1257 break;
1260 /* Cleanup */
1261 bdrv_delete(bs);
1262 if (ret) {
1263 return 1;
1265 return 0;
1268 static int img_rebase(int argc, char **argv)
1270 BlockDriverState *bs, *bs_old_backing = NULL, *bs_new_backing = NULL;
1271 BlockDriver *old_backing_drv, *new_backing_drv;
1272 char *filename;
1273 const char *fmt, *cache, *out_basefmt, *out_baseimg;
1274 int c, flags, ret;
1275 int unsafe = 0;
1276 int progress = 0;
1278 /* Parse commandline parameters */
1279 fmt = NULL;
1280 cache = BDRV_DEFAULT_CACHE;
1281 out_baseimg = NULL;
1282 out_basefmt = NULL;
1283 for(;;) {
1284 c = getopt(argc, argv, "uhf:F:b:pt:");
1285 if (c == -1) {
1286 break;
1288 switch(c) {
1289 case '?':
1290 case 'h':
1291 help();
1292 return 0;
1293 case 'f':
1294 fmt = optarg;
1295 break;
1296 case 'F':
1297 out_basefmt = optarg;
1298 break;
1299 case 'b':
1300 out_baseimg = optarg;
1301 break;
1302 case 'u':
1303 unsafe = 1;
1304 break;
1305 case 'p':
1306 progress = 1;
1307 break;
1308 case 't':
1309 cache = optarg;
1310 break;
1314 if ((optind >= argc) || (!unsafe && !out_baseimg)) {
1315 help();
1317 filename = argv[optind++];
1319 qemu_progress_init(progress, 2.0);
1320 qemu_progress_print(0, 100);
1322 flags = BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
1323 ret = set_cache_flag(cache, &flags);
1324 if (ret < 0) {
1325 error_report("Invalid cache option: %s", cache);
1326 return -1;
1330 * Open the images.
1332 * Ignore the old backing file for unsafe rebase in case we want to correct
1333 * the reference to a renamed or moved backing file.
1335 bs = bdrv_new_open(filename, fmt, flags);
1336 if (!bs) {
1337 return 1;
1340 /* Find the right drivers for the backing files */
1341 old_backing_drv = NULL;
1342 new_backing_drv = NULL;
1344 if (!unsafe && bs->backing_format[0] != '\0') {
1345 old_backing_drv = bdrv_find_format(bs->backing_format);
1346 if (old_backing_drv == NULL) {
1347 error_report("Invalid format name: '%s'", bs->backing_format);
1348 ret = -1;
1349 goto out;
1353 if (out_basefmt != NULL) {
1354 new_backing_drv = bdrv_find_format(out_basefmt);
1355 if (new_backing_drv == NULL) {
1356 error_report("Invalid format name: '%s'", out_basefmt);
1357 ret = -1;
1358 goto out;
1362 /* For safe rebasing we need to compare old and new backing file */
1363 if (unsafe) {
1364 /* Make the compiler happy */
1365 bs_old_backing = NULL;
1366 bs_new_backing = NULL;
1367 } else {
1368 char backing_name[1024];
1370 bs_old_backing = bdrv_new("old_backing");
1371 bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
1372 ret = bdrv_open(bs_old_backing, backing_name, BDRV_O_FLAGS,
1373 old_backing_drv);
1374 if (ret) {
1375 error_report("Could not open old backing file '%s'", backing_name);
1376 goto out;
1379 bs_new_backing = bdrv_new("new_backing");
1380 ret = bdrv_open(bs_new_backing, out_baseimg, BDRV_O_FLAGS,
1381 new_backing_drv);
1382 if (ret) {
1383 error_report("Could not open new backing file '%s'", out_baseimg);
1384 goto out;
1389 * Check each unallocated cluster in the COW file. If it is unallocated,
1390 * accesses go to the backing file. We must therefore compare this cluster
1391 * in the old and new backing file, and if they differ we need to copy it
1392 * from the old backing file into the COW file.
1394 * If qemu-img crashes during this step, no harm is done. The content of
1395 * the image is the same as the original one at any time.
1397 if (!unsafe) {
1398 uint64_t num_sectors;
1399 uint64_t sector;
1400 int n;
1401 uint8_t * buf_old;
1402 uint8_t * buf_new;
1403 float local_progress;
1405 buf_old = qemu_malloc(IO_BUF_SIZE);
1406 buf_new = qemu_malloc(IO_BUF_SIZE);
1408 bdrv_get_geometry(bs, &num_sectors);
1410 local_progress = (float)100 /
1411 (num_sectors / MIN(num_sectors, IO_BUF_SIZE / 512));
1412 for (sector = 0; sector < num_sectors; sector += n) {
1414 /* How many sectors can we handle with the next read? */
1415 if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
1416 n = (IO_BUF_SIZE / 512);
1417 } else {
1418 n = num_sectors - sector;
1421 /* If the cluster is allocated, we don't need to take action */
1422 ret = bdrv_is_allocated(bs, sector, n, &n);
1423 if (ret) {
1424 continue;
1427 /* Read old and new backing file */
1428 ret = bdrv_read(bs_old_backing, sector, buf_old, n);
1429 if (ret < 0) {
1430 error_report("error while reading from old backing file");
1431 goto out;
1433 ret = bdrv_read(bs_new_backing, sector, buf_new, n);
1434 if (ret < 0) {
1435 error_report("error while reading from new backing file");
1436 goto out;
1439 /* If they differ, we need to write to the COW file */
1440 uint64_t written = 0;
1442 while (written < n) {
1443 int pnum;
1445 if (compare_sectors(buf_old + written * 512,
1446 buf_new + written * 512, n - written, &pnum))
1448 ret = bdrv_write(bs, sector + written,
1449 buf_old + written * 512, pnum);
1450 if (ret < 0) {
1451 error_report("Error while writing to COW image: %s",
1452 strerror(-ret));
1453 goto out;
1457 written += pnum;
1459 qemu_progress_print(local_progress, 100);
1462 qemu_free(buf_old);
1463 qemu_free(buf_new);
1467 * Change the backing file. All clusters that are different from the old
1468 * backing file are overwritten in the COW file now, so the visible content
1469 * doesn't change when we switch the backing file.
1471 ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt);
1472 if (ret == -ENOSPC) {
1473 error_report("Could not change the backing file to '%s': No "
1474 "space left in the file header", out_baseimg);
1475 } else if (ret < 0) {
1476 error_report("Could not change the backing file to '%s': %s",
1477 out_baseimg, strerror(-ret));
1480 qemu_progress_print(100, 0);
1482 * TODO At this point it is possible to check if any clusters that are
1483 * allocated in the COW file are the same in the backing file. If so, they
1484 * could be dropped from the COW file. Don't do this before switching the
1485 * backing file, in case of a crash this would lead to corruption.
1487 out:
1488 qemu_progress_end();
1489 /* Cleanup */
1490 if (!unsafe) {
1491 if (bs_old_backing != NULL) {
1492 bdrv_delete(bs_old_backing);
1494 if (bs_new_backing != NULL) {
1495 bdrv_delete(bs_new_backing);
1499 bdrv_delete(bs);
1500 if (ret) {
1501 return 1;
1503 return 0;
1506 static int img_resize(int argc, char **argv)
1508 int c, ret, relative;
1509 const char *filename, *fmt, *size;
1510 int64_t n, total_size;
1511 BlockDriverState *bs = NULL;
1512 QEMUOptionParameter *param;
1513 QEMUOptionParameter resize_options[] = {
1515 .name = BLOCK_OPT_SIZE,
1516 .type = OPT_SIZE,
1517 .help = "Virtual disk size"
1519 { NULL }
1522 /* Remove size from argv manually so that negative numbers are not treated
1523 * as options by getopt. */
1524 if (argc < 3) {
1525 help();
1526 return 1;
1529 size = argv[--argc];
1531 /* Parse getopt arguments */
1532 fmt = NULL;
1533 for(;;) {
1534 c = getopt(argc, argv, "f:h");
1535 if (c == -1) {
1536 break;
1538 switch(c) {
1539 case '?':
1540 case 'h':
1541 help();
1542 break;
1543 case 'f':
1544 fmt = optarg;
1545 break;
1548 if (optind >= argc) {
1549 help();
1551 filename = argv[optind++];
1553 /* Choose grow, shrink, or absolute resize mode */
1554 switch (size[0]) {
1555 case '+':
1556 relative = 1;
1557 size++;
1558 break;
1559 case '-':
1560 relative = -1;
1561 size++;
1562 break;
1563 default:
1564 relative = 0;
1565 break;
1568 /* Parse size */
1569 param = parse_option_parameters("", resize_options, NULL);
1570 if (set_option_parameter(param, BLOCK_OPT_SIZE, size)) {
1571 /* Error message already printed when size parsing fails */
1572 ret = -1;
1573 goto out;
1575 n = get_option_parameter(param, BLOCK_OPT_SIZE)->value.n;
1576 free_option_parameters(param);
1578 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR);
1579 if (!bs) {
1580 ret = -1;
1581 goto out;
1584 if (relative) {
1585 total_size = bdrv_getlength(bs) + n * relative;
1586 } else {
1587 total_size = n;
1589 if (total_size <= 0) {
1590 error_report("New image size must be positive");
1591 ret = -1;
1592 goto out;
1595 ret = bdrv_truncate(bs, total_size);
1596 switch (ret) {
1597 case 0:
1598 printf("Image resized.\n");
1599 break;
1600 case -ENOTSUP:
1601 error_report("This image format does not support resize");
1602 break;
1603 case -EACCES:
1604 error_report("Image is read-only");
1605 break;
1606 default:
1607 error_report("Error resizing image (%d)", -ret);
1608 break;
1610 out:
1611 if (bs) {
1612 bdrv_delete(bs);
1614 if (ret) {
1615 return 1;
1617 return 0;
1620 static const img_cmd_t img_cmds[] = {
1621 #define DEF(option, callback, arg_string) \
1622 { option, callback },
1623 #include "qemu-img-cmds.h"
1624 #undef DEF
1625 #undef GEN_DOCS
1626 { NULL, NULL, },
1629 int main(int argc, char **argv)
1631 const img_cmd_t *cmd;
1632 const char *cmdname;
1634 error_set_progname(argv[0]);
1636 bdrv_init();
1637 if (argc < 2)
1638 help();
1639 cmdname = argv[1];
1640 argc--; argv++;
1642 /* find the command */
1643 for(cmd = img_cmds; cmd->name != NULL; cmd++) {
1644 if (!strcmp(cmdname, cmd->name)) {
1645 return cmd->handler(argc, argv);
1649 /* not found */
1650 help();
1651 return 0;