1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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>
31
32#ifdef _WIN32
33#include <windows.h>
34#endif
35
36typedef struct img_cmd_t {
37 const char *name;
38 int (*handler)(int argc, char **argv);
39} img_cmd_t;
40
41
42#define BDRV_O_FLAGS BDRV_O_CACHE_WB
43#define BDRV_DEFAULT_CACHE "writeback"
44
45static void format_print(void *opaque, const char *name)
46{
47 printf(" %s", name);
48}
49
50
51static void help(void)
52{
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', 'directsync'\n"
70 " and 'unsafe'\n"
71 " 'size' is the disk image size in bytes. Optional suffixes\n"
72 " 'k' or 'K' (kilobyte, 1024), 'M' (megabyte, 1024k), 'G' (gigabyte, 1024M)\n"
73 " and T (terabyte, 1024G) are supported. 'b' is ignored.\n"
74 " 'output_filename' is the destination disk image filename\n"
75 " 'output_fmt' is the destination format\n"
76 " 'options' is a comma separated list of format specific options in a\n"
77 " name=value format. Use -o ? for an overview of the options supported by the\n"
78 " used format\n"
79 " '-c' indicates that target image must be compressed (qcow format only)\n"
80 " '-u' enables unsafe rebasing. It is assumed that old and new backing file\n"
81 " match exactly. The image doesn't need a working backing file before\n"
82 " rebasing in this case (useful for renaming the backing file)\n"
83 " '-h' with or without a command shows this help and lists the supported formats\n"
84 " '-p' show progress of command (only certain commands)\n"
85 " '-S' indicates the consecutive number of bytes that must contain only zeros\n"
86 " for qemu-img to create a sparse image during conversion\n"
87 "\n"
88 "Parameters to snapshot subcommand:\n"
89 " 'snapshot' is the name of the snapshot to create, apply or delete\n"
90 " '-a' applies a snapshot (revert disk to saved state)\n"
91 " '-c' creates a snapshot\n"
92 " '-d' deletes a snapshot\n"
93 " '-l' lists all snapshots in the given image\n";
94
95 printf("%s\nSupported formats:", help_msg);
96 bdrv_iterate_format(format_print, NULL);
97 printf("\n");
98 exit(1);
99}
100
101#if defined(WIN32)
102
103static int read_password(char *buf, int buf_size)
104{
105 int c, i;
106 printf("Password: ");
107 fflush(stdout);
108 i = 0;
109 for(;;) {
110 c = getchar();
111 if (c == '\n')
112 break;
113 if (i < (buf_size - 1))
114 buf[i++] = c;
115 }
116 buf[i] = '\0';
117 return 0;
118}
119
120#else
121
122#include <termios.h>
123
124static struct termios oldtty;
125
126static void term_exit(void)
127{
128 tcsetattr (0, TCSANOW, &oldtty);
129}
130
131static void term_init(void)
132{
133 struct termios tty;
134
135 tcgetattr (0, &tty);
136 oldtty = tty;
137
138 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
139 |INLCR|IGNCR|ICRNL|IXON);
140 tty.c_oflag |= OPOST;
141 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
142 tty.c_cflag &= ~(CSIZE|PARENB);
143 tty.c_cflag |= CS8;
144 tty.c_cc[VMIN] = 1;
145 tty.c_cc[VTIME] = 0;
146
147 tcsetattr (0, TCSANOW, &tty);
148
149 atexit(term_exit);
150}
151
152static int read_password(char *buf, int buf_size)
153{
154 uint8_t ch;
155 int i, ret;
156
157 printf("password: ");
158 fflush(stdout);
159 term_init();
160 i = 0;
161 for(;;) {
162 ret = read(0, &ch, 1);
163 if (ret == -1) {
164 if (errno == EAGAIN || errno == EINTR) {
165 continue;
166 } else {
167 ret = -1;
168 break;
169 }
170 } else if (ret == 0) {
171 ret = -1;
172 break;
173 } else {
174 if (ch == '\r') {
175 ret = 0;
176 break;
177 }
178 if (i < (buf_size - 1))
179 buf[i++] = ch;
180 }
181 }
182 term_exit();
183 buf[i] = '\0';
184 printf("\n");
185 return ret;
186}
187#endif
188
189static int print_block_option_help(const char *filename, const char *fmt)
190{
191 BlockDriver *drv, *proto_drv;
192 QEMUOptionParameter *create_options = NULL;
193
194
195 drv = bdrv_find_format(fmt);
196 if (!drv) {
197 error_report("Unknown file format '%s'", fmt);
198 return 1;
199 }
200
201 proto_drv = bdrv_find_protocol(filename);
202 if (!proto_drv) {
203 error_report("Unknown protocol '%s'", filename);
204 return 1;
205 }
206
207 create_options = append_option_parameters(create_options,
208 drv->create_options);
209 create_options = append_option_parameters(create_options,
210 proto_drv->create_options);
211 print_option_help(create_options);
212 free_option_parameters(create_options);
213 return 0;
214}
215
216static BlockDriverState *bdrv_new_open(const char *filename,
217 const char *fmt,
218 int flags)
219{
220 BlockDriverState *bs;
221 BlockDriver *drv;
222 char password[256];
223 int ret;
224
225 bs = bdrv_new("image");
226
227 if (fmt) {
228 drv = bdrv_find_format(fmt);
229 if (!drv) {
230 error_report("Unknown file format '%s'", fmt);
231 goto fail;
232 }
233 } else {
234 drv = NULL;
235 }
236
237 ret = bdrv_open(bs, filename, flags, drv);
238 if (ret < 0) {
239 error_report("Could not open '%s': %s", filename, strerror(-ret));
240 goto fail;
241 }
242
243 if (bdrv_is_encrypted(bs)) {
244 printf("Disk image '%s' is encrypted.\n", filename);
245 if (read_password(password, sizeof(password)) < 0) {
246 error_report("No password given");
247 goto fail;
248 }
249 if (bdrv_set_key(bs, password) < 0) {
250 error_report("invalid password");
251 goto fail;
252 }
253 }
254 return bs;
255fail:
256 if (bs) {
257 bdrv_delete(bs);
258 }
259 return NULL;
260}
261
262static int add_old_style_options(const char *fmt, QEMUOptionParameter *list,
263 const char *base_filename,
264 const char *base_fmt)
265{
266 if (base_filename) {
267 if (set_option_parameter(list, BLOCK_OPT_BACKING_FILE, base_filename)) {
268 error_report("Backing file not supported for file format '%s'",
269 fmt);
270 return -1;
271 }
272 }
273 if (base_fmt) {
274 if (set_option_parameter(list, BLOCK_OPT_BACKING_FMT, base_fmt)) {
275 error_report("Backing file format not supported for file "
276 "format '%s'", fmt);
277 return -1;
278 }
279 }
280 return 0;
281}
282
283static int img_create(int argc, char **argv)
284{
285 int c, ret = 0;
286 uint64_t img_size = -1;
287 const char *fmt = "raw";
288 const char *base_fmt = NULL;
289 const char *filename;
290 const char *base_filename = NULL;
291 char *options = NULL;
292
293 for(;;) {
294 c = getopt(argc, argv, "F:b:f:he6o:");
295 if (c == -1) {
296 break;
297 }
298 switch(c) {
299 case '?':
300 case 'h':
301 help();
302 break;
303 case 'F':
304 base_fmt = optarg;
305 break;
306 case 'b':
307 base_filename = optarg;
308 break;
309 case 'f':
310 fmt = optarg;
311 break;
312 case 'e':
313 error_report("option -e is deprecated, please use \'-o "
314 "encryption\' instead!");
315 return 1;
316 case '6':
317 error_report("option -6 is deprecated, please use \'-o "
318 "compat6\' instead!");
319 return 1;
320 case 'o':
321 options = optarg;
322 break;
323 }
324 }
325
326
327 if (optind >= argc) {
328 help();
329 }
330 filename = argv[optind++];
331
332
333 if (optind < argc) {
334 int64_t sval;
335 char *end;
336 sval = strtosz_suffix(argv[optind++], &end, STRTOSZ_DEFSUFFIX_B);
337 if (sval < 0 || *end) {
338 error_report("Invalid image size specified! You may use k, M, G or "
339 "T suffixes for ");
340 error_report("kilobytes, megabytes, gigabytes and terabytes.");
341 ret = -1;
342 goto out;
343 }
344 img_size = (uint64_t)sval;
345 }
346
347 if (options && !strcmp(options, "?")) {
348 ret = print_block_option_help(filename, fmt);
349 goto out;
350 }
351
352 ret = bdrv_img_create(filename, fmt, base_filename, base_fmt,
353 options, img_size, BDRV_O_FLAGS);
354out:
355 if (ret) {
356 return 1;
357 }
358 return 0;
359}
360
361
362
363
364
365
366
367
368
369static int img_check(int argc, char **argv)
370{
371 int c, ret;
372 const char *filename, *fmt;
373 BlockDriverState *bs;
374 BdrvCheckResult result;
375
376 fmt = NULL;
377 for(;;) {
378 c = getopt(argc, argv, "f:h");
379 if (c == -1) {
380 break;
381 }
382 switch(c) {
383 case '?':
384 case 'h':
385 help();
386 break;
387 case 'f':
388 fmt = optarg;
389 break;
390 }
391 }
392 if (optind >= argc) {
393 help();
394 }
395 filename = argv[optind++];
396
397 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS);
398 if (!bs) {
399 return 1;
400 }
401 ret = bdrv_check(bs, &result);
402
403 if (ret == -ENOTSUP) {
404 error_report("This image format does not support checks");
405 bdrv_delete(bs);
406 return 1;
407 }
408
409 if (!(result.corruptions || result.leaks || result.check_errors)) {
410 printf("No errors were found on the image.\n");
411 } else {
412 if (result.corruptions) {
413 printf("\n%d errors were found on the image.\n"
414 "Data may be corrupted, or further writes to the image "
415 "may corrupt it.\n",
416 result.corruptions);
417 }
418
419 if (result.leaks) {
420 printf("\n%d leaked clusters were found on the image.\n"
421 "This means waste of disk space, but no harm to data.\n",
422 result.leaks);
423 }
424
425 if (result.check_errors) {
426 printf("\n%d internal errors have occurred during the check.\n",
427 result.check_errors);
428 }
429 }
430
431 bdrv_delete(bs);
432
433 if (ret < 0 || result.check_errors) {
434 printf("\nAn error has occurred during the check: %s\n"
435 "The check is not complete and may have missed error.\n",
436 strerror(-ret));
437 return 1;
438 }
439
440 if (result.corruptions) {
441 return 2;
442 } else if (result.leaks) {
443 return 3;
444 } else {
445 return 0;
446 }
447}
448
449static int img_commit(int argc, char **argv)
450{
451 int c, ret, flags;
452 const char *filename, *fmt, *cache;
453 BlockDriverState *bs;
454
455 fmt = NULL;
456 cache = BDRV_DEFAULT_CACHE;
457 for(;;) {
458 c = getopt(argc, argv, "f:ht:");
459 if (c == -1) {
460 break;
461 }
462 switch(c) {
463 case '?':
464 case 'h':
465 help();
466 break;
467 case 'f':
468 fmt = optarg;
469 break;
470 case 't':
471 cache = optarg;
472 break;
473 }
474 }
475 if (optind >= argc) {
476 help();
477 }
478 filename = argv[optind++];
479
480 flags = BDRV_O_RDWR;
481 ret = bdrv_parse_cache_flags(cache, &flags);
482 if (ret < 0) {
483 error_report("Invalid cache option: %s", cache);
484 return -1;
485 }
486
487 bs = bdrv_new_open(filename, fmt, flags);
488 if (!bs) {
489 return 1;
490 }
491 ret = bdrv_commit(bs);
492 switch(ret) {
493 case 0:
494 printf("Image committed.\n");
495 break;
496 case -ENOENT:
497 error_report("No disk inserted");
498 break;
499 case -EACCES:
500 error_report("Image is read-only");
501 break;
502 case -ENOTSUP:
503 error_report("Image is already committed");
504 break;
505 default:
506 error_report("Error while committing image");
507 break;
508 }
509
510 bdrv_delete(bs);
511 if (ret) {
512 return 1;
513 }
514 return 0;
515}
516
517
518
519
520
521
522
523static int is_not_zero(const uint8_t *sector, int len)
524{
525
526
527
528
529
530
531 int i;
532 long d0, d1, d2, d3;
533 const long * const data = (const long *) sector;
534
535 len /= sizeof(long);
536
537 for(i = 0; i < len; i += 4) {
538 d0 = data[i + 0];
539 d1 = data[i + 1];
540 d2 = data[i + 2];
541 d3 = data[i + 3];
542
543 if (d0 || d1 || d2 || d3) {
544 return 1;
545 }
546 }
547
548 return 0;
549}
550
551
552
553
554
555
556
557
558static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum)
559{
560 int v, i;
561
562 if (n <= 0) {
563 *pnum = 0;
564 return 0;
565 }
566 v = is_not_zero(buf, 512);
567 for(i = 1; i < n; i++) {
568 buf += 512;
569 if (v != is_not_zero(buf, 512))
570 break;
571 }
572 *pnum = i;
573 return v;
574}
575
576
577
578
579
580
581static int is_allocated_sectors_min(const uint8_t *buf, int n, int *pnum,
582 int min)
583{
584 int ret;
585 int num_checked, num_used;
586
587 if (n < min) {
588 min = n;
589 }
590
591 ret = is_allocated_sectors(buf, n, pnum);
592 if (!ret) {
593 return ret;
594 }
595
596 num_used = *pnum;
597 buf += BDRV_SECTOR_SIZE * *pnum;
598 n -= *pnum;
599 num_checked = num_used;
600
601 while (n > 0) {
602 ret = is_allocated_sectors(buf, n, pnum);
603
604 buf += BDRV_SECTOR_SIZE * *pnum;
605 n -= *pnum;
606 num_checked += *pnum;
607 if (ret) {
608 num_used = num_checked;
609 } else if (*pnum >= min) {
610 break;
611 }
612 }
613
614 *pnum = num_used;
615 return 1;
616}
617
618
619
620
621
622
623
624
625static int compare_sectors(const uint8_t *buf1, const uint8_t *buf2, int n,
626 int *pnum)
627{
628 int res, i;
629
630 if (n <= 0) {
631 *pnum = 0;
632 return 0;
633 }
634
635 res = !!memcmp(buf1, buf2, 512);
636 for(i = 1; i < n; i++) {
637 buf1 += 512;
638 buf2 += 512;
639
640 if (!!memcmp(buf1, buf2, 512) != res) {
641 break;
642 }
643 }
644
645 *pnum = i;
646 return res;
647}
648
649#define IO_BUF_SIZE (2 * 1024 * 1024)
650
651static int img_convert(int argc, char **argv)
652{
653 int c, ret = 0, n, n1, bs_n, bs_i, compress, cluster_size, cluster_sectors;
654 int progress = 0, flags;
655 const char *fmt, *out_fmt, *cache, *out_baseimg, *out_filename;
656 BlockDriver *drv, *proto_drv;
657 BlockDriverState **bs = NULL, *out_bs = NULL;
658 int64_t total_sectors, nb_sectors, sector_num, bs_offset;
659 uint64_t bs_sectors;
660 uint8_t * buf = NULL;
661 const uint8_t *buf1;
662 BlockDriverInfo bdi;
663 QEMUOptionParameter *param = NULL, *create_options = NULL;
664 QEMUOptionParameter *out_baseimg_param;
665 char *options = NULL;
666 const char *snapshot_name = NULL;
667 float local_progress;
668 int min_sparse = 8;
669
670 fmt = NULL;
671 out_fmt = "raw";
672 cache = "unsafe";
673 out_baseimg = NULL;
674 compress = 0;
675 for(;;) {
676 c = getopt(argc, argv, "f:O:B:s:hce6o:pS:t:");
677 if (c == -1) {
678 break;
679 }
680 switch(c) {
681 case '?':
682 case 'h':
683 help();
684 break;
685 case 'f':
686 fmt = optarg;
687 break;
688 case 'O':
689 out_fmt = optarg;
690 break;
691 case 'B':
692 out_baseimg = optarg;
693 break;
694 case 'c':
695 compress = 1;
696 break;
697 case 'e':
698 error_report("option -e is deprecated, please use \'-o "
699 "encryption\' instead!");
700 return 1;
701 case '6':
702 error_report("option -6 is deprecated, please use \'-o "
703 "compat6\' instead!");
704 return 1;
705 case 'o':
706 options = optarg;
707 break;
708 case 's':
709 snapshot_name = optarg;
710 break;
711 case 'S':
712 {
713 int64_t sval;
714 char *end;
715 sval = strtosz_suffix(optarg, &end, STRTOSZ_DEFSUFFIX_B);
716 if (sval < 0 || *end) {
717 error_report("Invalid minimum zero buffer size for sparse output specified");
718 return 1;
719 }
720
721 min_sparse = sval / BDRV_SECTOR_SIZE;
722 break;
723 }
724 case 'p':
725 progress = 1;
726 break;
727 case 't':
728 cache = optarg;
729 break;
730 }
731 }
732
733 bs_n = argc - optind - 1;
734 if (bs_n < 1) {
735 help();
736 }
737
738 out_filename = argv[argc - 1];
739
740 if (options && !strcmp(options, "?")) {
741 ret = print_block_option_help(out_filename, out_fmt);
742 goto out;
743 }
744
745 if (bs_n > 1 && out_baseimg) {
746 error_report("-B makes no sense when concatenating multiple input "
747 "images");
748 ret = -1;
749 goto out;
750 }
751
752 qemu_progress_init(progress, 2.0);
753 qemu_progress_print(0, 100);
754
755 bs = g_malloc0(bs_n * sizeof(BlockDriverState *));
756
757 total_sectors = 0;
758 for (bs_i = 0; bs_i < bs_n; bs_i++) {
759 bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, BDRV_O_FLAGS);
760 if (!bs[bs_i]) {
761 error_report("Could not open '%s'", argv[optind + bs_i]);
762 ret = -1;
763 goto out;
764 }
765 bdrv_get_geometry(bs[bs_i], &bs_sectors);
766 total_sectors += bs_sectors;
767 }
768
769 if (snapshot_name != NULL) {
770 if (bs_n > 1) {
771 error_report("No support for concatenating multiple snapshot");
772 ret = -1;
773 goto out;
774 }
775 if (bdrv_snapshot_load_tmp(bs[0], snapshot_name) < 0) {
776 error_report("Failed to load snapshot");
777 ret = -1;
778 goto out;
779 }
780 }
781
782
783 drv = bdrv_find_format(out_fmt);
784 if (!drv) {
785 error_report("Unknown file format '%s'", out_fmt);
786 ret = -1;
787 goto out;
788 }
789
790 proto_drv = bdrv_find_protocol(out_filename);
791 if (!proto_drv) {
792 error_report("Unknown protocol '%s'", out_filename);
793 ret = -1;
794 goto out;
795 }
796
797 create_options = append_option_parameters(create_options,
798 drv->create_options);
799 create_options = append_option_parameters(create_options,
800 proto_drv->create_options);
801
802 if (options) {
803 param = parse_option_parameters(options, create_options, param);
804 if (param == NULL) {
805 error_report("Invalid options for file format '%s'.", out_fmt);
806 ret = -1;
807 goto out;
808 }
809 } else {
810 param = parse_option_parameters("", create_options, param);
811 }
812
813 set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
814 ret = add_old_style_options(out_fmt, param, out_baseimg, NULL);
815 if (ret < 0) {
816 goto out;
817 }
818
819
820 out_baseimg_param = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
821 if (out_baseimg_param) {
822 out_baseimg = out_baseimg_param->value.s;
823 }
824
825
826 if (compress) {
827 QEMUOptionParameter *encryption =
828 get_option_parameter(param, BLOCK_OPT_ENCRYPT);
829 QEMUOptionParameter *preallocation =
830 get_option_parameter(param, BLOCK_OPT_PREALLOC);
831
832 if (!drv->bdrv_write_compressed) {
833 error_report("Compression not supported for this file format");
834 ret = -1;
835 goto out;
836 }
837
838 if (encryption && encryption->value.n) {
839 error_report("Compression and encryption not supported at "
840 "the same time");
841 ret = -1;
842 goto out;
843 }
844
845 if (preallocation && preallocation->value.s
846 && strcmp(preallocation->value.s, "off"))
847 {
848 error_report("Compression and preallocation not supported at "
849 "the same time");
850 ret = -1;
851 goto out;
852 }
853 }
854
855
856 ret = bdrv_create(drv, out_filename, param);
857 if (ret < 0) {
858 if (ret == -ENOTSUP) {
859 error_report("Formatting not supported for file format '%s'",
860 out_fmt);
861 } else if (ret == -EFBIG) {
862 error_report("The image size is too large for file format '%s'",
863 out_fmt);
864 } else {
865 error_report("%s: error while converting %s: %s",
866 out_filename, out_fmt, strerror(-ret));
867 }
868 goto out;
869 }
870
871 flags = BDRV_O_RDWR;
872 ret = bdrv_parse_cache_flags(cache, &flags);
873 if (ret < 0) {
874 error_report("Invalid cache option: %s", cache);
875 return -1;
876 }
877
878 out_bs = bdrv_new_open(out_filename, out_fmt, flags);
879 if (!out_bs) {
880 ret = -1;
881 goto out;
882 }
883
884 bs_i = 0;
885 bs_offset = 0;
886 bdrv_get_geometry(bs[0], &bs_sectors);
887 buf = qemu_blockalign(out_bs, IO_BUF_SIZE);
888
889 if (compress) {
890 ret = bdrv_get_info(out_bs, &bdi);
891 if (ret < 0) {
892 error_report("could not get block driver info");
893 goto out;
894 }
895 cluster_size = bdi.cluster_size;
896 if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) {
897 error_report("invalid cluster size");
898 ret = -1;
899 goto out;
900 }
901 cluster_sectors = cluster_size >> 9;
902 sector_num = 0;
903
904 nb_sectors = total_sectors;
905 local_progress = (float)100 /
906 (nb_sectors / MIN(nb_sectors, cluster_sectors));
907
908 for(;;) {
909 int64_t bs_num;
910 int remainder;
911 uint8_t *buf2;
912
913 nb_sectors = total_sectors - sector_num;
914 if (nb_sectors <= 0)
915 break;
916 if (nb_sectors >= cluster_sectors)
917 n = cluster_sectors;
918 else
919 n = nb_sectors;
920
921 bs_num = sector_num - bs_offset;
922 assert (bs_num >= 0);
923 remainder = n;
924 buf2 = buf;
925 while (remainder > 0) {
926 int nlow;
927 while (bs_num == bs_sectors) {
928 bs_i++;
929 assert (bs_i < bs_n);
930 bs_offset += bs_sectors;
931 bdrv_get_geometry(bs[bs_i], &bs_sectors);
932 bs_num = 0;
933
934
935
936 }
937 assert (bs_num < bs_sectors);
938
939 nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
940
941 ret = bdrv_read(bs[bs_i], bs_num, buf2, nlow);
942 if (ret < 0) {
943 error_report("error while reading sector %" PRId64 ": %s",
944 bs_num, strerror(-ret));
945 goto out;
946 }
947
948 buf2 += nlow * 512;
949 bs_num += nlow;
950
951 remainder -= nlow;
952 }
953 assert (remainder == 0);
954
955 if (n < cluster_sectors) {
956 memset(buf + n * 512, 0, cluster_size - n * 512);
957 }
958 if (is_not_zero(buf, cluster_size)) {
959 ret = bdrv_write_compressed(out_bs, sector_num, buf,
960 cluster_sectors);
961 if (ret != 0) {
962 error_report("error while compressing sector %" PRId64
963 ": %s", sector_num, strerror(-ret));
964 goto out;
965 }
966 }
967 sector_num += n;
968 qemu_progress_print(local_progress, 100);
969 }
970
971 bdrv_write_compressed(out_bs, 0, NULL, 0);
972 } else {
973 int has_zero_init = bdrv_has_zero_init(out_bs);
974
975 sector_num = 0;
976 nb_sectors = total_sectors - sector_num;
977 local_progress = (float)100 /
978 (nb_sectors / MIN(nb_sectors, IO_BUF_SIZE / 512));
979
980 for(;;) {
981 nb_sectors = total_sectors - sector_num;
982 if (nb_sectors <= 0) {
983 break;
984 }
985 if (nb_sectors >= (IO_BUF_SIZE / 512)) {
986 n = (IO_BUF_SIZE / 512);
987 } else {
988 n = nb_sectors;
989 }
990
991 while (sector_num - bs_offset >= bs_sectors) {
992 bs_i ++;
993 assert (bs_i < bs_n);
994 bs_offset += bs_sectors;
995 bdrv_get_geometry(bs[bs_i], &bs_sectors);
996
997
998
999 }
1000
1001 if (n > bs_offset + bs_sectors - sector_num) {
1002 n = bs_offset + bs_sectors - sector_num;
1003 }
1004
1005 if (has_zero_init) {
1006
1007
1008
1009
1010 if (out_baseimg) {
1011 if (!bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
1012 n, &n1)) {
1013 sector_num += n1;
1014 continue;
1015 }
1016
1017
1018 n = n1;
1019 }
1020 } else {
1021 n1 = n;
1022 }
1023
1024 ret = bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n);
1025 if (ret < 0) {
1026 error_report("error while reading sector %" PRId64 ": %s",
1027 sector_num - bs_offset, strerror(-ret));
1028 goto out;
1029 }
1030
1031
1032
1033 buf1 = buf;
1034 while (n > 0) {
1035
1036
1037
1038
1039
1040
1041
1042 if (!has_zero_init || out_baseimg ||
1043 is_allocated_sectors_min(buf1, n, &n1, min_sparse)) {
1044 ret = bdrv_write(out_bs, sector_num, buf1, n1);
1045 if (ret < 0) {
1046 error_report("error while writing sector %" PRId64
1047 ": %s", sector_num, strerror(-ret));
1048 goto out;
1049 }
1050 }
1051 sector_num += n1;
1052 n -= n1;
1053 buf1 += n1 * 512;
1054 }
1055 qemu_progress_print(local_progress, 100);
1056 }
1057 }
1058out:
1059 qemu_progress_end();
1060 free_option_parameters(create_options);
1061 free_option_parameters(param);
1062 qemu_vfree(buf);
1063 if (out_bs) {
1064 bdrv_delete(out_bs);
1065 }
1066 if (bs) {
1067 for (bs_i = 0; bs_i < bs_n; bs_i++) {
1068 if (bs[bs_i]) {
1069 bdrv_delete(bs[bs_i]);
1070 }
1071 }
1072 g_free(bs);
1073 }
1074 if (ret) {
1075 return 1;
1076 }
1077 return 0;
1078}
1079
1080
1081static void dump_snapshots(BlockDriverState *bs)
1082{
1083 QEMUSnapshotInfo *sn_tab, *sn;
1084 int nb_sns, i;
1085 char buf[256];
1086
1087 nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1088 if (nb_sns <= 0)
1089 return;
1090 printf("Snapshot list:\n");
1091 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
1092 for(i = 0; i < nb_sns; i++) {
1093 sn = &sn_tab[i];
1094 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
1095 }
1096 g_free(sn_tab);
1097}
1098
1099static int img_info(int argc, char **argv)
1100{
1101 int c;
1102 const char *filename, *fmt;
1103 BlockDriverState *bs;
1104 char fmt_name[128], size_buf[128], dsize_buf[128];
1105 uint64_t total_sectors;
1106 int64_t allocated_size;
1107 char backing_filename[1024];
1108 char backing_filename2[1024];
1109 BlockDriverInfo bdi;
1110
1111 fmt = NULL;
1112 for(;;) {
1113 c = getopt(argc, argv, "f:h");
1114 if (c == -1) {
1115 break;
1116 }
1117 switch(c) {
1118 case '?':
1119 case 'h':
1120 help();
1121 break;
1122 case 'f':
1123 fmt = optarg;
1124 break;
1125 }
1126 }
1127 if (optind >= argc) {
1128 help();
1129 }
1130 filename = argv[optind++];
1131
1132 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING);
1133 if (!bs) {
1134 return 1;
1135 }
1136 bdrv_get_format(bs, fmt_name, sizeof(fmt_name));
1137 bdrv_get_geometry(bs, &total_sectors);
1138 get_human_readable_size(size_buf, sizeof(size_buf), total_sectors * 512);
1139 allocated_size = bdrv_get_allocated_file_size(bs);
1140 if (allocated_size < 0) {
1141 snprintf(dsize_buf, sizeof(dsize_buf), "unavailable");
1142 } else {
1143 get_human_readable_size(dsize_buf, sizeof(dsize_buf),
1144 allocated_size);
1145 }
1146 printf("image: %s\n"
1147 "file format: %s\n"
1148 "virtual size: %s (%" PRId64 " bytes)\n"
1149 "disk size: %s\n",
1150 filename, fmt_name, size_buf,
1151 (total_sectors * 512),
1152 dsize_buf);
1153 if (bdrv_is_encrypted(bs)) {
1154 printf("encrypted: yes\n");
1155 }
1156 if (bdrv_get_info(bs, &bdi) >= 0) {
1157 if (bdi.cluster_size != 0) {
1158 printf("cluster_size: %d\n", bdi.cluster_size);
1159 }
1160 }
1161 bdrv_get_backing_filename(bs, backing_filename, sizeof(backing_filename));
1162 if (backing_filename[0] != '\0') {
1163 path_combine(backing_filename2, sizeof(backing_filename2),
1164 filename, backing_filename);
1165 printf("backing file: %s (actual path: %s)\n",
1166 backing_filename,
1167 backing_filename2);
1168 }
1169 dump_snapshots(bs);
1170 bdrv_delete(bs);
1171 return 0;
1172}
1173
1174#define SNAPSHOT_LIST 1
1175#define SNAPSHOT_CREATE 2
1176#define SNAPSHOT_APPLY 3
1177#define SNAPSHOT_DELETE 4
1178
1179static int img_snapshot(int argc, char **argv)
1180{
1181 BlockDriverState *bs;
1182 QEMUSnapshotInfo sn;
1183 char *filename, *snapshot_name = NULL;
1184 int c, ret = 0, bdrv_oflags;
1185 int action = 0;
1186 qemu_timeval tv;
1187
1188 bdrv_oflags = BDRV_O_FLAGS | BDRV_O_RDWR;
1189
1190 for(;;) {
1191 c = getopt(argc, argv, "la:c:d:h");
1192 if (c == -1) {
1193 break;
1194 }
1195 switch(c) {
1196 case '?':
1197 case 'h':
1198 help();
1199 return 0;
1200 case 'l':
1201 if (action) {
1202 help();
1203 return 0;
1204 }
1205 action = SNAPSHOT_LIST;
1206 bdrv_oflags &= ~BDRV_O_RDWR;
1207 break;
1208 case 'a':
1209 if (action) {
1210 help();
1211 return 0;
1212 }
1213 action = SNAPSHOT_APPLY;
1214 snapshot_name = optarg;
1215 break;
1216 case 'c':
1217 if (action) {
1218 help();
1219 return 0;
1220 }
1221 action = SNAPSHOT_CREATE;
1222 snapshot_name = optarg;
1223 break;
1224 case 'd':
1225 if (action) {
1226 help();
1227 return 0;
1228 }
1229 action = SNAPSHOT_DELETE;
1230 snapshot_name = optarg;
1231 break;
1232 }
1233 }
1234
1235 if (optind >= argc) {
1236 help();
1237 }
1238 filename = argv[optind++];
1239
1240
1241 bs = bdrv_new_open(filename, NULL, bdrv_oflags);
1242 if (!bs) {
1243 return 1;
1244 }
1245
1246
1247 switch(action) {
1248 case SNAPSHOT_LIST:
1249 dump_snapshots(bs);
1250 break;
1251
1252 case SNAPSHOT_CREATE:
1253 memset(&sn, 0, sizeof(sn));
1254 pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
1255
1256 qemu_gettimeofday(&tv);
1257 sn.date_sec = tv.tv_sec;
1258 sn.date_nsec = tv.tv_usec * 1000;
1259
1260 ret = bdrv_snapshot_create(bs, &sn);
1261 if (ret) {
1262 error_report("Could not create snapshot '%s': %d (%s)",
1263 snapshot_name, ret, strerror(-ret));
1264 }
1265 break;
1266
1267 case SNAPSHOT_APPLY:
1268 ret = bdrv_snapshot_goto(bs, snapshot_name);
1269 if (ret) {
1270 error_report("Could not apply snapshot '%s': %d (%s)",
1271 snapshot_name, ret, strerror(-ret));
1272 }
1273 break;
1274
1275 case SNAPSHOT_DELETE:
1276 ret = bdrv_snapshot_delete(bs, snapshot_name);
1277 if (ret) {
1278 error_report("Could not delete snapshot '%s': %d (%s)",
1279 snapshot_name, ret, strerror(-ret));
1280 }
1281 break;
1282 }
1283
1284
1285 bdrv_delete(bs);
1286 if (ret) {
1287 return 1;
1288 }
1289 return 0;
1290}
1291
1292static int img_rebase(int argc, char **argv)
1293{
1294 BlockDriverState *bs, *bs_old_backing = NULL, *bs_new_backing = NULL;
1295 BlockDriver *old_backing_drv, *new_backing_drv;
1296 char *filename;
1297 const char *fmt, *cache, *out_basefmt, *out_baseimg;
1298 int c, flags, ret;
1299 int unsafe = 0;
1300 int progress = 0;
1301
1302
1303 fmt = NULL;
1304 cache = BDRV_DEFAULT_CACHE;
1305 out_baseimg = NULL;
1306 out_basefmt = NULL;
1307 for(;;) {
1308 c = getopt(argc, argv, "uhf:F:b:pt:");
1309 if (c == -1) {
1310 break;
1311 }
1312 switch(c) {
1313 case '?':
1314 case 'h':
1315 help();
1316 return 0;
1317 case 'f':
1318 fmt = optarg;
1319 break;
1320 case 'F':
1321 out_basefmt = optarg;
1322 break;
1323 case 'b':
1324 out_baseimg = optarg;
1325 break;
1326 case 'u':
1327 unsafe = 1;
1328 break;
1329 case 'p':
1330 progress = 1;
1331 break;
1332 case 't':
1333 cache = optarg;
1334 break;
1335 }
1336 }
1337
1338 if ((optind >= argc) || (!unsafe && !out_baseimg)) {
1339 help();
1340 }
1341 filename = argv[optind++];
1342
1343 qemu_progress_init(progress, 2.0);
1344 qemu_progress_print(0, 100);
1345
1346 flags = BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
1347 ret = bdrv_parse_cache_flags(cache, &flags);
1348 if (ret < 0) {
1349 error_report("Invalid cache option: %s", cache);
1350 return -1;
1351 }
1352
1353
1354
1355
1356
1357
1358
1359 bs = bdrv_new_open(filename, fmt, flags);
1360 if (!bs) {
1361 return 1;
1362 }
1363
1364
1365 old_backing_drv = NULL;
1366 new_backing_drv = NULL;
1367
1368 if (!unsafe && bs->backing_format[0] != '\0') {
1369 old_backing_drv = bdrv_find_format(bs->backing_format);
1370 if (old_backing_drv == NULL) {
1371 error_report("Invalid format name: '%s'", bs->backing_format);
1372 ret = -1;
1373 goto out;
1374 }
1375 }
1376
1377 if (out_basefmt != NULL) {
1378 new_backing_drv = bdrv_find_format(out_basefmt);
1379 if (new_backing_drv == NULL) {
1380 error_report("Invalid format name: '%s'", out_basefmt);
1381 ret = -1;
1382 goto out;
1383 }
1384 }
1385
1386
1387 if (unsafe) {
1388
1389 bs_old_backing = NULL;
1390 bs_new_backing = NULL;
1391 } else {
1392 char backing_name[1024];
1393
1394 bs_old_backing = bdrv_new("old_backing");
1395 bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
1396 ret = bdrv_open(bs_old_backing, backing_name, BDRV_O_FLAGS,
1397 old_backing_drv);
1398 if (ret) {
1399 error_report("Could not open old backing file '%s'", backing_name);
1400 goto out;
1401 }
1402
1403 bs_new_backing = bdrv_new("new_backing");
1404 ret = bdrv_open(bs_new_backing, out_baseimg, BDRV_O_FLAGS,
1405 new_backing_drv);
1406 if (ret) {
1407 error_report("Could not open new backing file '%s'", out_baseimg);
1408 goto out;
1409 }
1410 }
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421 if (!unsafe) {
1422 uint64_t num_sectors;
1423 uint64_t sector;
1424 int n;
1425 uint8_t * buf_old;
1426 uint8_t * buf_new;
1427 float local_progress;
1428
1429 buf_old = qemu_blockalign(bs, IO_BUF_SIZE);
1430 buf_new = qemu_blockalign(bs, IO_BUF_SIZE);
1431
1432 bdrv_get_geometry(bs, &num_sectors);
1433
1434 local_progress = (float)100 /
1435 (num_sectors / MIN(num_sectors, IO_BUF_SIZE / 512));
1436 for (sector = 0; sector < num_sectors; sector += n) {
1437
1438
1439 if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
1440 n = (IO_BUF_SIZE / 512);
1441 } else {
1442 n = num_sectors - sector;
1443 }
1444
1445
1446 ret = bdrv_is_allocated(bs, sector, n, &n);
1447 if (ret) {
1448 continue;
1449 }
1450
1451
1452 ret = bdrv_read(bs_old_backing, sector, buf_old, n);
1453 if (ret < 0) {
1454 error_report("error while reading from old backing file");
1455 goto out;
1456 }
1457 ret = bdrv_read(bs_new_backing, sector, buf_new, n);
1458 if (ret < 0) {
1459 error_report("error while reading from new backing file");
1460 goto out;
1461 }
1462
1463
1464 uint64_t written = 0;
1465
1466 while (written < n) {
1467 int pnum;
1468
1469 if (compare_sectors(buf_old + written * 512,
1470 buf_new + written * 512, n - written, &pnum))
1471 {
1472 ret = bdrv_write(bs, sector + written,
1473 buf_old + written * 512, pnum);
1474 if (ret < 0) {
1475 error_report("Error while writing to COW image: %s",
1476 strerror(-ret));
1477 goto out;
1478 }
1479 }
1480
1481 written += pnum;
1482 }
1483 qemu_progress_print(local_progress, 100);
1484 }
1485
1486 qemu_vfree(buf_old);
1487 qemu_vfree(buf_new);
1488 }
1489
1490
1491
1492
1493
1494
1495 ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt);
1496 if (ret == -ENOSPC) {
1497 error_report("Could not change the backing file to '%s': No "
1498 "space left in the file header", out_baseimg);
1499 } else if (ret < 0) {
1500 error_report("Could not change the backing file to '%s': %s",
1501 out_baseimg, strerror(-ret));
1502 }
1503
1504 qemu_progress_print(100, 0);
1505
1506
1507
1508
1509
1510
1511out:
1512 qemu_progress_end();
1513
1514 if (!unsafe) {
1515 if (bs_old_backing != NULL) {
1516 bdrv_delete(bs_old_backing);
1517 }
1518 if (bs_new_backing != NULL) {
1519 bdrv_delete(bs_new_backing);
1520 }
1521 }
1522
1523 bdrv_delete(bs);
1524 if (ret) {
1525 return 1;
1526 }
1527 return 0;
1528}
1529
1530static int img_resize(int argc, char **argv)
1531{
1532 int c, ret, relative;
1533 const char *filename, *fmt, *size;
1534 int64_t n, total_size;
1535 BlockDriverState *bs = NULL;
1536 QEMUOptionParameter *param;
1537 QEMUOptionParameter resize_options[] = {
1538 {
1539 .name = BLOCK_OPT_SIZE,
1540 .type = OPT_SIZE,
1541 .help = "Virtual disk size"
1542 },
1543 { NULL }
1544 };
1545
1546
1547
1548 if (argc < 3) {
1549 help();
1550 return 1;
1551 }
1552
1553 size = argv[--argc];
1554
1555
1556 fmt = NULL;
1557 for(;;) {
1558 c = getopt(argc, argv, "f:h");
1559 if (c == -1) {
1560 break;
1561 }
1562 switch(c) {
1563 case '?':
1564 case 'h':
1565 help();
1566 break;
1567 case 'f':
1568 fmt = optarg;
1569 break;
1570 }
1571 }
1572 if (optind >= argc) {
1573 help();
1574 }
1575 filename = argv[optind++];
1576
1577
1578 switch (size[0]) {
1579 case '+':
1580 relative = 1;
1581 size++;
1582 break;
1583 case '-':
1584 relative = -1;
1585 size++;
1586 break;
1587 default:
1588 relative = 0;
1589 break;
1590 }
1591
1592
1593 param = parse_option_parameters("", resize_options, NULL);
1594 if (set_option_parameter(param, BLOCK_OPT_SIZE, size)) {
1595
1596 ret = -1;
1597 goto out;
1598 }
1599 n = get_option_parameter(param, BLOCK_OPT_SIZE)->value.n;
1600 free_option_parameters(param);
1601
1602 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR);
1603 if (!bs) {
1604 ret = -1;
1605 goto out;
1606 }
1607
1608 if (relative) {
1609 total_size = bdrv_getlength(bs) + n * relative;
1610 } else {
1611 total_size = n;
1612 }
1613 if (total_size <= 0) {
1614 error_report("New image size must be positive");
1615 ret = -1;
1616 goto out;
1617 }
1618
1619 ret = bdrv_truncate(bs, total_size);
1620 switch (ret) {
1621 case 0:
1622 printf("Image resized.\n");
1623 break;
1624 case -ENOTSUP:
1625 error_report("This image format does not support resize");
1626 break;
1627 case -EACCES:
1628 error_report("Image is read-only");
1629 break;
1630 default:
1631 error_report("Error resizing image (%d)", -ret);
1632 break;
1633 }
1634out:
1635 if (bs) {
1636 bdrv_delete(bs);
1637 }
1638 if (ret) {
1639 return 1;
1640 }
1641 return 0;
1642}
1643
1644static const img_cmd_t img_cmds[] = {
1645#define DEF(option, callback, arg_string) \
1646 { option, callback },
1647#include "qemu-img-cmds.h"
1648#undef DEF
1649#undef GEN_DOCS
1650 { NULL, NULL, },
1651};
1652
1653int main(int argc, char **argv)
1654{
1655 const img_cmd_t *cmd;
1656 const char *cmdname;
1657
1658 error_set_progname(argv[0]);
1659
1660 bdrv_init();
1661 if (argc < 2)
1662 help();
1663 cmdname = argv[1];
1664 argc--; argv++;
1665
1666
1667 for(cmd = img_cmds; cmd->name != NULL; cmd++) {
1668 if (!strcmp(cmdname, cmd->name)) {
1669 return cmd->handler(argc, argv);
1670 }
1671 }
1672
1673
1674 help();
1675 return 0;
1676}
1677