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
24 #include "qemu-common.h"
26 #include "block_int.h"
34 /* Default to cache=writeback as data integrity is not important for qemu-tcg. */
35 #define BRDV_O_FLAGS BDRV_O_CACHE_WB
37 static void QEMU_NORETURN
error(const char *fmt
, ...)
41 fprintf(stderr
, "qemu-img: ");
42 vfprintf(stderr
, fmt
, ap
);
43 fprintf(stderr
, "\n");
48 static void format_print(void *opaque
, const char *name
)
53 /* Please keep in synch with qemu-img.texi */
54 static void help(void)
56 printf("qemu-img version " QEMU_VERSION
", Copyright (c) 2004-2008 Fabrice Bellard\n"
57 "usage: qemu-img command [command options]\n"
58 "QEMU disk image utility\n"
61 " create [-e] [-6] [-F fmt] [-b base_image] [-f fmt] filename [size]\n"
62 " commit [-f fmt] filename\n"
63 " convert [-c] [-e] [-6] [-f fmt] [-O output_fmt] [-B output_base_image] filename [filename2 [...]] output_filename\n"
64 " info [-f fmt] filename\n"
65 " snapshot [-l | -a snapshot | -c snapshot | -d snapshot] filename\n"
67 "Command parameters:\n"
68 " 'filename' is a disk image filename\n"
69 " 'base_image' is the read-only disk image which is used as base for a copy on\n"
70 " write image; the copy on write image only stores the modified data\n"
71 " 'output_base_image' forces the output image to be created as a copy on write\n"
72 " image of the specified base image; 'output_base_image' should have the same\n"
73 " content as the input's base image, however the path, image format, etc may\n"
75 " 'fmt' is the disk image format. It is guessed automatically in most cases\n"
76 " 'size' is the disk image size in kilobytes. Optional suffixes\n"
77 " 'M' (megabyte, 1024 * 1024) and 'G' (gigabyte, 1024 * 1024 * 1024) are\n"
78 " supported any 'k' or 'K' is ignored\n"
79 " 'output_filename' is the destination disk image filename\n"
80 " 'output_fmt' is the destination format\n"
81 " '-c' indicates that target image must be compressed (qcow format only)\n"
82 " '-e' indicates that the target image must be encrypted (qcow format only)\n"
83 " '-6' indicates that the target image must use compatibility level 6 (vmdk format only)\n"
84 " '-h' with or without a command shows this help and lists the supported formats\n"
86 "Parameters to snapshot subcommand:\n"
87 " 'snapshot' is the name of the snapshot to create, apply or delete\n"
88 " '-a' applies a snapshot (revert disk to saved state)\n"
89 " '-c' creates a snapshot\n"
90 " '-d' deletes a snapshot\n"
91 " '-l' lists all snapshots in the given image\n"
93 printf("\nSupported formats:");
94 bdrv_iterate_format(format_print
, NULL
);
100 /* XXX: put correct support for win32 */
101 static int read_password(char *buf
, int buf_size
)
104 printf("Password: ");
111 if (i
< (buf_size
- 1))
122 static struct termios oldtty
;
124 static void term_exit(void)
126 tcsetattr (0, TCSANOW
, &oldtty
);
129 static void term_init(void)
136 tty
.c_iflag
&= ~(IGNBRK
|BRKINT
|PARMRK
|ISTRIP
137 |INLCR
|IGNCR
|ICRNL
|IXON
);
138 tty
.c_oflag
|= OPOST
;
139 tty
.c_lflag
&= ~(ECHO
|ECHONL
|ICANON
|IEXTEN
);
140 tty
.c_cflag
&= ~(CSIZE
|PARENB
);
145 tcsetattr (0, TCSANOW
, &tty
);
150 static int read_password(char *buf
, int buf_size
)
155 printf("password: ");
160 ret
= read(0, &ch
, 1);
162 if (errno
== EAGAIN
|| errno
== EINTR
) {
168 } else if (ret
== 0) {
176 if (i
< (buf_size
- 1))
187 static BlockDriverState
*bdrv_new_open(const char *filename
,
190 BlockDriverState
*bs
;
196 error("Not enough memory");
198 drv
= bdrv_find_format(fmt
);
200 error("Unknown file format '%s'", fmt
);
204 if (bdrv_open2(bs
, filename
, BRDV_O_FLAGS
, drv
) < 0) {
205 error("Could not open '%s'", filename
);
207 if (bdrv_is_encrypted(bs
)) {
208 printf("Disk image '%s' is encrypted.\n", filename
);
209 if (read_password(password
, sizeof(password
)) < 0)
210 error("No password given");
211 if (bdrv_set_key(bs
, password
) < 0)
212 error("invalid password");
217 static int img_create(int argc
, char **argv
)
220 const char *fmt
= "raw";
221 const char *base_fmt
= NULL
;
222 const char *filename
;
223 const char *base_filename
= NULL
;
231 c
= getopt(argc
, argv
, "F:b:f:he6");
242 base_filename
= optarg
;
248 flags
|= BLOCK_FLAG_ENCRYPT
;
251 flags
|= BLOCK_FLAG_COMPAT6
;
257 filename
= argv
[optind
++];
260 BlockDriverState
*bs
;
261 BlockDriver
*base_drv
= NULL
;
264 base_drv
= bdrv_find_format(base_fmt
);
265 if (base_drv
== NULL
)
266 error("Unknown basefile format '%s'", base_fmt
);
269 bs
= bdrv_new_open(base_filename
, base_fmt
);
270 bdrv_get_geometry(bs
, &size
);
277 sizef
= strtod(p
, (char **)&p
);
279 size
= (uint64_t)(sizef
* 1024 * 1024);
280 } else if (*p
== 'G') {
281 size
= (uint64_t)(sizef
* 1024 * 1024 * 1024);
282 } else if (*p
== 'k' || *p
== 'K' || *p
== '\0') {
283 size
= (uint64_t)(sizef
* 1024);
288 drv
= bdrv_find_format(fmt
);
290 error("Unknown file format '%s'", fmt
);
291 printf("Formatting '%s', fmt=%s",
293 if (flags
& BLOCK_FLAG_ENCRYPT
)
294 printf(", encrypted");
295 if (flags
& BLOCK_FLAG_COMPAT6
)
296 printf(", compatibility level=6");
298 printf(", backing_file=%s",
301 printf(", backing_fmt=%s",
304 printf(", size=%" PRIu64
" kB\n", size
/ 1024);
305 ret
= bdrv_create2(drv
, filename
, size
/ 512, base_filename
, base_fmt
, flags
);
307 if (ret
== -ENOTSUP
) {
308 error("Formatting or formatting option not supported for file format '%s'", fmt
);
310 error("Error while formatting");
316 static int img_commit(int argc
, char **argv
)
319 const char *filename
, *fmt
;
321 BlockDriverState
*bs
;
325 c
= getopt(argc
, argv
, "f:h");
339 filename
= argv
[optind
++];
343 error("Not enough memory");
345 drv
= bdrv_find_format(fmt
);
347 error("Unknown file format '%s'", fmt
);
351 if (bdrv_open2(bs
, filename
, BRDV_O_FLAGS
, drv
) < 0) {
352 error("Could not open '%s'", filename
);
354 ret
= bdrv_commit(bs
);
357 printf("Image committed.\n");
360 error("No disk inserted");
363 error("Image is read-only");
366 error("Image is already committed");
369 error("Error while committing image");
377 static int is_not_zero(const uint8_t *sector
, int len
)
381 for(i
= 0;i
< len
; i
++) {
382 if (((uint32_t *)sector
)[i
] != 0)
389 * Returns true iff the first sector pointed to by 'buf' contains at least
392 * 'pnum' is set to the number of sectors (including and immediately following
393 * the first one) that are known to be in the same allocated/unallocated state.
395 static int is_allocated_sectors(const uint8_t *buf
, int n
, int *pnum
)
403 v
= is_not_zero(buf
, 512);
404 for(i
= 1; i
< n
; i
++) {
406 if (v
!= is_not_zero(buf
, 512))
413 #define IO_BUF_SIZE 65536
415 static int img_convert(int argc
, char **argv
)
417 int c
, ret
, n
, n1
, bs_n
, bs_i
, flags
, cluster_size
, cluster_sectors
;
418 const char *fmt
, *out_fmt
, *out_baseimg
, *out_filename
;
420 BlockDriverState
**bs
, *out_bs
;
421 int64_t total_sectors
, nb_sectors
, sector_num
, bs_offset
;
423 uint8_t buf
[IO_BUF_SIZE
];
432 c
= getopt(argc
, argv
, "f:O:B:hce6");
446 out_baseimg
= optarg
;
449 flags
|= BLOCK_FLAG_COMPRESS
;
452 flags
|= BLOCK_FLAG_ENCRYPT
;
455 flags
|= BLOCK_FLAG_COMPAT6
;
460 bs_n
= argc
- optind
- 1;
461 if (bs_n
< 1) help();
463 out_filename
= argv
[argc
- 1];
465 if (bs_n
> 1 && out_baseimg
)
466 error("-B makes no sense when concatenating multiple input images");
468 bs
= calloc(bs_n
, sizeof(BlockDriverState
*));
470 error("Out of memory");
473 for (bs_i
= 0; bs_i
< bs_n
; bs_i
++) {
474 bs
[bs_i
] = bdrv_new_open(argv
[optind
+ bs_i
], fmt
);
476 error("Could not open '%s'", argv
[optind
+ bs_i
]);
477 bdrv_get_geometry(bs
[bs_i
], &bs_sectors
);
478 total_sectors
+= bs_sectors
;
481 drv
= bdrv_find_format(out_fmt
);
483 error("Unknown file format '%s'", out_fmt
);
484 if (flags
& BLOCK_FLAG_COMPRESS
&& drv
!= &bdrv_qcow
&& drv
!= &bdrv_qcow2
)
485 error("Compression not supported for this file format");
486 if (flags
& BLOCK_FLAG_ENCRYPT
&& drv
!= &bdrv_qcow
&& drv
!= &bdrv_qcow2
)
487 error("Encryption not supported for this file format");
488 if (flags
& BLOCK_FLAG_COMPAT6
&& drv
!= &bdrv_vmdk
)
489 error("Alternative compatibility level not supported for this file format");
490 if (flags
& BLOCK_FLAG_ENCRYPT
&& flags
& BLOCK_FLAG_COMPRESS
)
491 error("Compression and encryption not supported at the same time");
493 ret
= bdrv_create(drv
, out_filename
, total_sectors
, out_baseimg
, flags
);
495 if (ret
== -ENOTSUP
) {
496 error("Formatting not supported for file format '%s'", fmt
);
498 error("Error while formatting '%s'", out_filename
);
502 out_bs
= bdrv_new_open(out_filename
, out_fmt
);
506 bdrv_get_geometry(bs
[0], &bs_sectors
);
508 if (flags
& BLOCK_FLAG_COMPRESS
) {
509 if (bdrv_get_info(out_bs
, &bdi
) < 0)
510 error("could not get block driver info");
511 cluster_size
= bdi
.cluster_size
;
512 if (cluster_size
<= 0 || cluster_size
> IO_BUF_SIZE
)
513 error("invalid cluster size");
514 cluster_sectors
= cluster_size
>> 9;
521 nb_sectors
= total_sectors
- sector_num
;
524 if (nb_sectors
>= cluster_sectors
)
529 bs_num
= sector_num
- bs_offset
;
530 assert (bs_num
>= 0);
533 while (remainder
> 0) {
535 while (bs_num
== bs_sectors
) {
537 assert (bs_i
< bs_n
);
538 bs_offset
+= bs_sectors
;
539 bdrv_get_geometry(bs
[bs_i
], &bs_sectors
);
541 /* printf("changing part: sector_num=%lld, "
542 "bs_i=%d, bs_offset=%lld, bs_sectors=%lld\n",
543 sector_num, bs_i, bs_offset, bs_sectors); */
545 assert (bs_num
< bs_sectors
);
547 nlow
= (remainder
> bs_sectors
- bs_num
) ? bs_sectors
- bs_num
: remainder
;
549 if (bdrv_read(bs
[bs_i
], bs_num
, buf2
, nlow
) < 0)
550 error("error while reading");
557 assert (remainder
== 0);
559 if (n
< cluster_sectors
)
560 memset(buf
+ n
* 512, 0, cluster_size
- n
* 512);
561 if (is_not_zero(buf
, cluster_size
)) {
562 if (bdrv_write_compressed(out_bs
, sector_num
, buf
,
563 cluster_sectors
) != 0)
564 error("error while compressing sector %" PRId64
,
569 /* signal EOF to align */
570 bdrv_write_compressed(out_bs
, 0, NULL
, 0);
572 sector_num
= 0; // total number of sectors converted so far
574 nb_sectors
= total_sectors
- sector_num
;
577 if (nb_sectors
>= (IO_BUF_SIZE
/ 512))
578 n
= (IO_BUF_SIZE
/ 512);
582 while (sector_num
- bs_offset
>= bs_sectors
) {
584 assert (bs_i
< bs_n
);
585 bs_offset
+= bs_sectors
;
586 bdrv_get_geometry(bs
[bs_i
], &bs_sectors
);
587 /* printf("changing part: sector_num=%lld, bs_i=%d, "
588 "bs_offset=%lld, bs_sectors=%lld\n",
589 sector_num, bs_i, bs_offset, bs_sectors); */
592 if (n
> bs_offset
+ bs_sectors
- sector_num
)
593 n
= bs_offset
+ bs_sectors
- sector_num
;
595 /* If the output image is being created as a copy on write image,
596 assume that sectors which are unallocated in the input image
597 are present in both the output's and input's base images (no
598 need to copy them). */
600 if (!bdrv_is_allocated(bs
[bs_i
], sector_num
- bs_offset
, n
, &n1
)) {
604 /* The next 'n1' sectors are allocated in the input image. Copy
605 only those as they may be followed by unallocated sectors. */
609 if (bdrv_read(bs
[bs_i
], sector_num
- bs_offset
, buf
, n
) < 0)
610 error("error while reading");
611 /* NOTE: at the same time we convert, we do not write zero
612 sectors to have a chance to compress the image. Ideally, we
613 should add a specific call to have the info to go faster */
616 /* If the output image is being created as a copy on write image,
617 copy all sectors even the ones containing only NUL bytes,
618 because they may differ from the sectors in the base image. */
619 if (out_baseimg
|| is_allocated_sectors(buf1
, n
, &n1
)) {
620 if (bdrv_write(out_bs
, sector_num
, buf1
, n1
) < 0)
621 error("error while writing");
630 for (bs_i
= 0; bs_i
< bs_n
; bs_i
++)
631 bdrv_delete(bs
[bs_i
]);
637 static int64_t get_allocated_file_size(const char *filename
)
639 typedef DWORD (WINAPI
* get_compressed_t
)(const char *filename
, DWORD
*high
);
640 get_compressed_t get_compressed
;
643 /* WinNT support GetCompressedFileSize to determine allocate size */
644 get_compressed
= (get_compressed_t
) GetProcAddress(GetModuleHandle("kernel32"), "GetCompressedFileSizeA");
645 if (get_compressed
) {
647 low
= get_compressed(filename
, &high
);
648 if (low
!= 0xFFFFFFFFlu
|| GetLastError() == NO_ERROR
)
649 return (((int64_t) high
) << 32) + low
;
652 if (_stati64(filename
, &st
) < 0)
657 static int64_t get_allocated_file_size(const char *filename
)
660 if (stat(filename
, &st
) < 0)
662 return (int64_t)st
.st_blocks
* 512;
666 static void dump_snapshots(BlockDriverState
*bs
)
668 QEMUSnapshotInfo
*sn_tab
, *sn
;
672 nb_sns
= bdrv_snapshot_list(bs
, &sn_tab
);
675 printf("Snapshot list:\n");
676 printf("%s\n", bdrv_snapshot_dump(buf
, sizeof(buf
), NULL
));
677 for(i
= 0; i
< nb_sns
; i
++) {
679 printf("%s\n", bdrv_snapshot_dump(buf
, sizeof(buf
), sn
));
684 static int img_info(int argc
, char **argv
)
687 const char *filename
, *fmt
;
689 BlockDriverState
*bs
;
690 char fmt_name
[128], size_buf
[128], dsize_buf
[128];
691 uint64_t total_sectors
;
692 int64_t allocated_size
;
693 char backing_filename
[1024];
694 char backing_filename2
[1024];
699 c
= getopt(argc
, argv
, "f:h");
713 filename
= argv
[optind
++];
717 error("Not enough memory");
719 drv
= bdrv_find_format(fmt
);
721 error("Unknown file format '%s'", fmt
);
725 if (bdrv_open2(bs
, filename
, BRDV_O_FLAGS
, drv
) < 0) {
726 error("Could not open '%s'", filename
);
728 bdrv_get_format(bs
, fmt_name
, sizeof(fmt_name
));
729 bdrv_get_geometry(bs
, &total_sectors
);
730 get_human_readable_size(size_buf
, sizeof(size_buf
), total_sectors
* 512);
731 allocated_size
= get_allocated_file_size(filename
);
732 if (allocated_size
< 0)
733 snprintf(dsize_buf
, sizeof(dsize_buf
), "unavailable");
735 get_human_readable_size(dsize_buf
, sizeof(dsize_buf
),
739 "virtual size: %s (%" PRId64
" bytes)\n"
741 filename
, fmt_name
, size_buf
,
742 (total_sectors
* 512),
744 if (bdrv_is_encrypted(bs
))
745 printf("encrypted: yes\n");
746 if (bdrv_get_info(bs
, &bdi
) >= 0) {
747 if (bdi
.cluster_size
!= 0)
748 printf("cluster_size: %d\n", bdi
.cluster_size
);
750 bdrv_get_backing_filename(bs
, backing_filename
, sizeof(backing_filename
));
751 if (backing_filename
[0] != '\0') {
752 path_combine(backing_filename2
, sizeof(backing_filename2
),
753 filename
, backing_filename
);
754 printf("backing file: %s (actual path: %s)\n",
763 #define SNAPSHOT_LIST 1
764 #define SNAPSHOT_CREATE 2
765 #define SNAPSHOT_APPLY 3
766 #define SNAPSHOT_DELETE 4
768 static void img_snapshot(int argc
, char **argv
)
770 BlockDriverState
*bs
;
772 char *filename
, *snapshot_name
= NULL
;
777 /* Parse commandline parameters */
779 c
= getopt(argc
, argv
, "la:c:d:h");
791 action
= SNAPSHOT_LIST
;
798 action
= SNAPSHOT_APPLY
;
799 snapshot_name
= optarg
;
806 action
= SNAPSHOT_CREATE
;
807 snapshot_name
= optarg
;
814 action
= SNAPSHOT_DELETE
;
815 snapshot_name
= optarg
;
822 filename
= argv
[optind
++];
827 error("Not enough memory");
829 if (bdrv_open2(bs
, filename
, 0, NULL
) < 0) {
830 error("Could not open '%s'", filename
);
833 /* Perform the requested action */
839 case SNAPSHOT_CREATE
:
840 memset(&sn
, 0, sizeof(sn
));
841 pstrcpy(sn
.name
, sizeof(sn
.name
), snapshot_name
);
843 qemu_gettimeofday(&tv
);
844 sn
.date_sec
= tv
.tv_sec
;
845 sn
.date_nsec
= tv
.tv_usec
* 1000;
847 ret
= bdrv_snapshot_create(bs
, &sn
);
849 error("Could not create snapshot '%s': %d (%s)",
850 snapshot_name
, ret
, strerror(-ret
));
854 ret
= bdrv_snapshot_goto(bs
, snapshot_name
);
856 error("Could not apply snapshot '%s': %d (%s)",
857 snapshot_name
, ret
, strerror(-ret
));
860 case SNAPSHOT_DELETE
:
861 ret
= bdrv_snapshot_delete(bs
, snapshot_name
);
863 error("Could not delete snapshot '%s': %d (%s)",
864 snapshot_name
, ret
, strerror(-ret
));
872 int main(int argc
, char **argv
)
881 if (!strcmp(cmd
, "create")) {
882 img_create(argc
, argv
);
883 } else if (!strcmp(cmd
, "commit")) {
884 img_commit(argc
, argv
);
885 } else if (!strcmp(cmd
, "convert")) {
886 img_convert(argc
, argv
);
887 } else if (!strcmp(cmd
, "info")) {
888 img_info(argc
, argv
);
889 } else if (!strcmp(cmd
, "snapshot")) {
890 img_snapshot(argc
, argv
);