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"
33 /* Default to cache=writeback as data integrity is not important for qemu-tcg. */
34 #define BRDV_O_FLAGS BDRV_O_CACHE_WB
36 static void QEMU_NORETURN
error(const char *fmt
, ...)
40 fprintf(stderr
, "qemu-img: ");
41 vfprintf(stderr
, fmt
, ap
);
42 fprintf(stderr
, "\n");
47 static void format_print(void *opaque
, const char *name
)
52 /* Please keep in synch with qemu-img.texi */
53 static void help(void)
55 printf("qemu-img version " QEMU_VERSION
", Copyright (c) 2004-2008 Fabrice Bellard\n"
56 "usage: qemu-img command [command options]\n"
57 "QEMU disk image utility\n"
60 " create [-e] [-6] [-b base_image] [-f fmt] filename [size]\n"
61 " commit [-f fmt] filename\n"
62 " convert [-c] [-e] [-6] [-f fmt] [-O output_fmt] [-B output_base_image] filename [filename2 [...]] output_filename\n"
63 " info [-f fmt] filename\n"
64 " snapshot [-l | -a snapshot | -c snapshot | -d snapshot] filename\n"
66 "Command parameters:\n"
67 " 'filename' is a disk image filename\n"
68 " 'base_image' is the read-only disk image which is used as base for a copy on\n"
69 " write image; the copy on write image only stores the modified data\n"
70 " 'output_base_image' forces the output image to be created as a copy on write\n"
71 " image of the specified base image; 'output_base_image' should have the same\n"
72 " content as the input's base image, however the path, image format, etc may\n"
74 " 'fmt' is the disk image format. It is guessed automatically in most cases\n"
75 " 'size' is the disk image size in kilobytes. Optional suffixes\n"
76 " 'M' (megabyte, 1024 * 1024) and 'G' (gigabyte, 1024 * 1024 * 1024) are"
77 " supported any @code{k} or @code{K} is ignored\n"
78 " 'output_filename' is the destination disk image filename\n"
79 " 'output_fmt' is the destination format\n"
80 " '-c' indicates that target image must be compressed (qcow format only)\n"
81 " '-e' indicates that the target image must be encrypted (qcow format only)\n"
82 " '-6' indicates that the target image must use compatibility level 6 (vmdk format only)\n"
83 " '-h' with or without a command shows this help and lists the supported formats\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("\nSupported formats:");
93 bdrv_iterate_format(format_print
, NULL
);
99 /* XXX: put correct support for win32 */
100 static int read_password(char *buf
, int buf_size
)
103 printf("Password: ");
110 if (i
< (buf_size
- 1))
121 static struct termios oldtty
;
123 static void term_exit(void)
125 tcsetattr (0, TCSANOW
, &oldtty
);
128 static void term_init(void)
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
);
144 tcsetattr (0, TCSANOW
, &tty
);
149 static int read_password(char *buf
, int buf_size
)
154 printf("password: ");
159 ret
= read(0, &ch
, 1);
161 if (errno
== EAGAIN
|| errno
== EINTR
) {
167 } else if (ret
== 0) {
175 if (i
< (buf_size
- 1))
186 static BlockDriverState
*bdrv_new_open(const char *filename
,
189 BlockDriverState
*bs
;
195 error("Not enough memory");
197 drv
= bdrv_find_format(fmt
);
199 error("Unknown file format '%s'", fmt
);
203 if (bdrv_open2(bs
, filename
, BRDV_O_FLAGS
, drv
) < 0) {
204 error("Could not open '%s'", filename
);
206 if (bdrv_is_encrypted(bs
)) {
207 printf("Disk image '%s' is encrypted.\n", filename
);
208 if (read_password(password
, sizeof(password
)) < 0)
209 error("No password given");
210 if (bdrv_set_key(bs
, password
) < 0)
211 error("invalid password");
216 static int img_create(int argc
, char **argv
)
219 const char *fmt
= "raw";
220 const char *filename
;
221 const char *base_filename
= NULL
;
228 c
= getopt(argc
, argv
, "b:f:he6");
236 base_filename
= optarg
;
242 flags
|= BLOCK_FLAG_ENCRYPT
;
245 flags
|= BLOCK_FLAG_COMPAT6
;
251 filename
= argv
[optind
++];
254 BlockDriverState
*bs
;
255 bs
= bdrv_new_open(base_filename
, NULL
);
256 bdrv_get_geometry(bs
, &size
);
263 size
= strtoul(p
, (char **)&p
, 0);
266 } else if (*p
== 'G') {
267 size
*= 1024 * 1024 * 1024;
268 } else if (*p
== 'k' || *p
== 'K' || *p
== '\0') {
274 drv
= bdrv_find_format(fmt
);
276 error("Unknown file format '%s'", fmt
);
277 printf("Formatting '%s', fmt=%s",
279 if (flags
& BLOCK_FLAG_ENCRYPT
)
280 printf(", encrypted");
281 if (flags
& BLOCK_FLAG_COMPAT6
)
282 printf(", compatibility level=6");
284 printf(", backing_file=%s",
287 printf(", size=%" PRIu64
" kB\n", size
/ 1024);
288 ret
= bdrv_create(drv
, filename
, size
/ 512, base_filename
, flags
);
290 if (ret
== -ENOTSUP
) {
291 error("Formatting or formatting option not supported for file format '%s'", fmt
);
293 error("Error while formatting");
299 static int img_commit(int argc
, char **argv
)
302 const char *filename
, *fmt
;
304 BlockDriverState
*bs
;
308 c
= getopt(argc
, argv
, "f:h");
322 filename
= argv
[optind
++];
326 error("Not enough memory");
328 drv
= bdrv_find_format(fmt
);
330 error("Unknown file format '%s'", fmt
);
334 if (bdrv_open2(bs
, filename
, BRDV_O_FLAGS
, drv
) < 0) {
335 error("Could not open '%s'", filename
);
337 ret
= bdrv_commit(bs
);
340 printf("Image committed.\n");
343 error("No disk inserted");
346 error("Image is read-only");
349 error("Image is already committed");
352 error("Error while committing image");
360 static int is_not_zero(const uint8_t *sector
, int len
)
364 for(i
= 0;i
< len
; i
++) {
365 if (((uint32_t *)sector
)[i
] != 0)
372 * Returns true iff the first sector pointed to by 'buf' contains at least
375 * 'pnum' is set to the number of sectors (including and immediately following
376 * the first one) that are known to be in the same allocated/unallocated state.
378 static int is_allocated_sectors(const uint8_t *buf
, int n
, int *pnum
)
386 v
= is_not_zero(buf
, 512);
387 for(i
= 1; i
< n
; i
++) {
389 if (v
!= is_not_zero(buf
, 512))
396 #define IO_BUF_SIZE 65536
398 static int img_convert(int argc
, char **argv
)
400 int c
, ret
, n
, n1
, bs_n
, bs_i
, flags
, cluster_size
, cluster_sectors
;
401 const char *fmt
, *out_fmt
, *out_baseimg
, *out_filename
;
403 BlockDriverState
**bs
, *out_bs
;
404 int64_t total_sectors
, nb_sectors
, sector_num
, bs_offset
;
406 uint8_t buf
[IO_BUF_SIZE
];
415 c
= getopt(argc
, argv
, "f:O:B:hce6");
429 out_baseimg
= optarg
;
432 flags
|= BLOCK_FLAG_COMPRESS
;
435 flags
|= BLOCK_FLAG_ENCRYPT
;
438 flags
|= BLOCK_FLAG_COMPAT6
;
443 bs_n
= argc
- optind
- 1;
444 if (bs_n
< 1) help();
446 out_filename
= argv
[argc
- 1];
448 if (bs_n
> 1 && out_baseimg
)
449 error("-B makes no sense when concatenating multiple input images");
451 bs
= calloc(bs_n
, sizeof(BlockDriverState
*));
453 error("Out of memory");
456 for (bs_i
= 0; bs_i
< bs_n
; bs_i
++) {
457 bs
[bs_i
] = bdrv_new_open(argv
[optind
+ bs_i
], fmt
);
459 error("Could not open '%s'", argv
[optind
+ bs_i
]);
460 bdrv_get_geometry(bs
[bs_i
], &bs_sectors
);
461 total_sectors
+= bs_sectors
;
464 drv
= bdrv_find_format(out_fmt
);
466 error("Unknown file format '%s'", out_fmt
);
467 if (flags
& BLOCK_FLAG_COMPRESS
&& drv
!= &bdrv_qcow
&& drv
!= &bdrv_qcow2
)
468 error("Compression not supported for this file format");
469 if (flags
& BLOCK_FLAG_ENCRYPT
&& drv
!= &bdrv_qcow
&& drv
!= &bdrv_qcow2
)
470 error("Encryption not supported for this file format");
471 if (flags
& BLOCK_FLAG_COMPAT6
&& drv
!= &bdrv_vmdk
)
472 error("Alternative compatibility level not supported for this file format");
473 if (flags
& BLOCK_FLAG_ENCRYPT
&& flags
& BLOCK_FLAG_COMPRESS
)
474 error("Compression and encryption not supported at the same time");
476 ret
= bdrv_create(drv
, out_filename
, total_sectors
, out_baseimg
, flags
);
478 if (ret
== -ENOTSUP
) {
479 error("Formatting not supported for file format '%s'", fmt
);
481 error("Error while formatting '%s'", out_filename
);
485 out_bs
= bdrv_new_open(out_filename
, out_fmt
);
489 bdrv_get_geometry(bs
[0], &bs_sectors
);
491 if (flags
& BLOCK_FLAG_COMPRESS
) {
492 if (bdrv_get_info(out_bs
, &bdi
) < 0)
493 error("could not get block driver info");
494 cluster_size
= bdi
.cluster_size
;
495 if (cluster_size
<= 0 || cluster_size
> IO_BUF_SIZE
)
496 error("invalid cluster size");
497 cluster_sectors
= cluster_size
>> 9;
504 nb_sectors
= total_sectors
- sector_num
;
507 if (nb_sectors
>= cluster_sectors
)
512 bs_num
= sector_num
- bs_offset
;
513 assert (bs_num
>= 0);
516 while (remainder
> 0) {
518 while (bs_num
== bs_sectors
) {
520 assert (bs_i
< bs_n
);
521 bs_offset
+= bs_sectors
;
522 bdrv_get_geometry(bs
[bs_i
], &bs_sectors
);
524 /* printf("changing part: sector_num=%lld, "
525 "bs_i=%d, bs_offset=%lld, bs_sectors=%lld\n",
526 sector_num, bs_i, bs_offset, bs_sectors); */
528 assert (bs_num
< bs_sectors
);
530 nlow
= (remainder
> bs_sectors
- bs_num
) ? bs_sectors
- bs_num
: remainder
;
532 if (bdrv_read(bs
[bs_i
], bs_num
, buf2
, nlow
) < 0)
533 error("error while reading");
540 assert (remainder
== 0);
542 if (n
< cluster_sectors
)
543 memset(buf
+ n
* 512, 0, cluster_size
- n
* 512);
544 if (is_not_zero(buf
, cluster_size
)) {
545 if (bdrv_write_compressed(out_bs
, sector_num
, buf
,
546 cluster_sectors
) != 0)
547 error("error while compressing sector %" PRId64
,
552 /* signal EOF to align */
553 bdrv_write_compressed(out_bs
, 0, NULL
, 0);
555 sector_num
= 0; // total number of sectors converted so far
557 nb_sectors
= total_sectors
- sector_num
;
560 if (nb_sectors
>= (IO_BUF_SIZE
/ 512))
561 n
= (IO_BUF_SIZE
/ 512);
565 while (sector_num
- bs_offset
>= bs_sectors
) {
567 assert (bs_i
< bs_n
);
568 bs_offset
+= bs_sectors
;
569 bdrv_get_geometry(bs
[bs_i
], &bs_sectors
);
570 /* printf("changing part: sector_num=%lld, bs_i=%d, "
571 "bs_offset=%lld, bs_sectors=%lld\n",
572 sector_num, bs_i, bs_offset, bs_sectors); */
575 if (n
> bs_offset
+ bs_sectors
- sector_num
)
576 n
= bs_offset
+ bs_sectors
- sector_num
;
578 /* If the output image is being created as a copy on write image,
579 assume that sectors which are unallocated in the input image
580 are present in both the output's and input's base images (no
581 need to copy them). */
583 if (!bdrv_is_allocated(bs
[bs_i
], sector_num
- bs_offset
, n
, &n1
)) {
587 /* The next 'n1' sectors are allocated in the input image. Copy
588 only those as they may be followed by unallocated sectors. */
592 if (bdrv_read(bs
[bs_i
], sector_num
- bs_offset
, buf
, n
) < 0)
593 error("error while reading");
594 /* NOTE: at the same time we convert, we do not write zero
595 sectors to have a chance to compress the image. Ideally, we
596 should add a specific call to have the info to go faster */
599 /* If the output image is being created as a copy on write image,
600 copy all sectors even the ones containing only NUL bytes,
601 because they may differ from the sectors in the base image. */
602 if (out_baseimg
|| is_allocated_sectors(buf1
, n
, &n1
)) {
603 if (bdrv_write(out_bs
, sector_num
, buf1
, n1
) < 0)
604 error("error while writing");
613 for (bs_i
= 0; bs_i
< bs_n
; bs_i
++)
614 bdrv_delete(bs
[bs_i
]);
620 static int64_t get_allocated_file_size(const char *filename
)
622 typedef DWORD (WINAPI
* get_compressed_t
)(const char *filename
, DWORD
*high
);
623 get_compressed_t get_compressed
;
626 /* WinNT support GetCompressedFileSize to determine allocate size */
627 get_compressed
= (get_compressed_t
) GetProcAddress(GetModuleHandle("kernel32"), "GetCompressedFileSizeA");
628 if (get_compressed
) {
630 low
= get_compressed(filename
, &high
);
631 if (low
!= 0xFFFFFFFFlu
|| GetLastError() == NO_ERROR
)
632 return (((int64_t) high
) << 32) + low
;
635 if (_stati64(filename
, &st
) < 0)
640 static int64_t get_allocated_file_size(const char *filename
)
643 if (stat(filename
, &st
) < 0)
645 return (int64_t)st
.st_blocks
* 512;
649 static void dump_snapshots(BlockDriverState
*bs
)
651 QEMUSnapshotInfo
*sn_tab
, *sn
;
655 nb_sns
= bdrv_snapshot_list(bs
, &sn_tab
);
658 printf("Snapshot list:\n");
659 printf("%s\n", bdrv_snapshot_dump(buf
, sizeof(buf
), NULL
));
660 for(i
= 0; i
< nb_sns
; i
++) {
662 printf("%s\n", bdrv_snapshot_dump(buf
, sizeof(buf
), sn
));
667 static int img_info(int argc
, char **argv
)
670 const char *filename
, *fmt
;
672 BlockDriverState
*bs
;
673 char fmt_name
[128], size_buf
[128], dsize_buf
[128];
674 uint64_t total_sectors
;
675 int64_t allocated_size
;
676 char backing_filename
[1024];
677 char backing_filename2
[1024];
682 c
= getopt(argc
, argv
, "f:h");
696 filename
= argv
[optind
++];
700 error("Not enough memory");
702 drv
= bdrv_find_format(fmt
);
704 error("Unknown file format '%s'", fmt
);
708 if (bdrv_open2(bs
, filename
, BRDV_O_FLAGS
, drv
) < 0) {
709 error("Could not open '%s'", filename
);
711 bdrv_get_format(bs
, fmt_name
, sizeof(fmt_name
));
712 bdrv_get_geometry(bs
, &total_sectors
);
713 get_human_readable_size(size_buf
, sizeof(size_buf
), total_sectors
* 512);
714 allocated_size
= get_allocated_file_size(filename
);
715 if (allocated_size
< 0)
716 snprintf(dsize_buf
, sizeof(dsize_buf
), "unavailable");
718 get_human_readable_size(dsize_buf
, sizeof(dsize_buf
),
722 "virtual size: %s (%" PRId64
" bytes)\n"
724 filename
, fmt_name
, size_buf
,
725 (total_sectors
* 512),
727 if (bdrv_is_encrypted(bs
))
728 printf("encrypted: yes\n");
729 if (bdrv_get_info(bs
, &bdi
) >= 0) {
730 if (bdi
.cluster_size
!= 0)
731 printf("cluster_size: %d\n", bdi
.cluster_size
);
732 if (bdi
.highest_alloc
)
733 printf("highest_alloc: %" PRId64
"\n", bdi
.highest_alloc
);
734 if (bdi
.num_free_bytes
)
735 printf("num_free_bytes: %" PRId64
"\n", bdi
.num_free_bytes
);
737 bdrv_get_backing_filename(bs
, backing_filename
, sizeof(backing_filename
));
738 if (backing_filename
[0] != '\0') {
739 path_combine(backing_filename2
, sizeof(backing_filename2
),
740 filename
, backing_filename
);
741 printf("backing file: %s (actual path: %s)\n",
750 #define SNAPSHOT_LIST 1
751 #define SNAPSHOT_CREATE 2
752 #define SNAPSHOT_APPLY 3
753 #define SNAPSHOT_DELETE 4
755 static void img_snapshot(int argc
, char **argv
)
757 BlockDriverState
*bs
;
759 char *filename
, *snapshot_name
= NULL
;
764 /* Parse commandline parameters */
766 c
= getopt(argc
, argv
, "la:c:d:h");
778 action
= SNAPSHOT_LIST
;
785 action
= SNAPSHOT_APPLY
;
786 snapshot_name
= optarg
;
793 action
= SNAPSHOT_CREATE
;
794 snapshot_name
= optarg
;
801 action
= SNAPSHOT_DELETE
;
802 snapshot_name
= optarg
;
809 filename
= argv
[optind
++];
814 error("Not enough memory");
816 if (bdrv_open2(bs
, filename
, 0, NULL
) < 0) {
817 error("Could not open '%s'", filename
);
820 /* Perform the requested action */
826 case SNAPSHOT_CREATE
:
827 memset(&sn
, 0, sizeof(sn
));
828 pstrcpy(sn
.name
, sizeof(sn
.name
), snapshot_name
);
830 qemu_gettimeofday(&tv
);
831 sn
.date_sec
= tv
.tv_sec
;
832 sn
.date_nsec
= tv
.tv_usec
* 1000;
834 ret
= bdrv_snapshot_create(bs
, &sn
);
836 error("Could not create snapshot '%s': %d (%s)",
837 snapshot_name
, ret
, strerror(-ret
));
841 ret
= bdrv_snapshot_goto(bs
, snapshot_name
);
843 error("Could not apply snapshot '%s': %d (%s)",
844 snapshot_name
, ret
, strerror(-ret
));
847 case SNAPSHOT_DELETE
:
848 ret
= bdrv_snapshot_delete(bs
, snapshot_name
);
850 error("Could not delete snapshot '%s': %d (%s)",
851 snapshot_name
, ret
, strerror(-ret
));
859 int main(int argc
, char **argv
)
868 if (!strcmp(cmd
, "create")) {
869 img_create(argc
, argv
);
870 } else if (!strcmp(cmd
, "commit")) {
871 img_commit(argc
, argv
);
872 } else if (!strcmp(cmd
, "convert")) {
873 img_convert(argc
, argv
);
874 } else if (!strcmp(cmd
, "info")) {
875 img_info(argc
, argv
);
876 } else if (!strcmp(cmd
, "snapshot")) {
877 img_snapshot(argc
, argv
);