blob: 947e71beab484c517c864611b6a96217a0f603fb [file] [log] [blame]
bellardea2384d2004-08-01 21:59:26 +00001/*
bellardfb43f4d2006-08-07 21:34:46 +00002 * QEMU disk image utility
ths5fafdf22007-09-16 21:08:06 +00003 *
bellard68d0f702008-01-06 17:21:48 +00004 * Copyright (c) 2003-2008 Fabrice Bellard
ths5fafdf22007-09-16 21:08:06 +00005 *
bellardea2384d2004-08-01 21:59:26 +00006 * 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:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
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.
23 */
pbrookfaf07962007-11-11 02:51:17 +000024#include "qemu-common.h"
Kevin Wolf9ea2ea72009-05-18 16:42:11 +020025#include "qemu-option.h"
aliguorif7b4a942009-01-07 17:40:15 +000026#include "osdep.h"
thsec36ba12007-09-16 21:59:02 +000027#include "block_int.h"
aliguori9230eaf2009-03-28 17:55:19 +000028#include <stdio.h>
bellardea2384d2004-08-01 21:59:26 +000029
bellarde8445332006-06-14 15:32:10 +000030#ifdef _WIN32
31#include <windows.h>
32#endif
33
aurel32137519c2008-11-30 19:12:49 +000034/* Default to cache=writeback as data integrity is not important for qemu-tcg. */
35#define BRDV_O_FLAGS BDRV_O_CACHE_WB
36
malca5e50b22009-02-01 22:19:27 +000037static void QEMU_NORETURN error(const char *fmt, ...)
bellardea2384d2004-08-01 21:59:26 +000038{
39 va_list ap;
40 va_start(ap, fmt);
bellard57d1a2b2004-08-03 21:15:11 +000041 fprintf(stderr, "qemu-img: ");
bellardea2384d2004-08-01 21:59:26 +000042 vfprintf(stderr, fmt, ap);
43 fprintf(stderr, "\n");
44 exit(1);
45 va_end(ap);
46}
47
48static void format_print(void *opaque, const char *name)
49{
50 printf(" %s", name);
51}
52
blueswir1d2c639d2009-01-24 18:19:25 +000053/* Please keep in synch with qemu-img.texi */
pbrook3f379ab2007-11-11 03:33:13 +000054static void help(void)
bellardea2384d2004-08-01 21:59:26 +000055{
bellard68d0f702008-01-06 17:21:48 +000056 printf("qemu-img version " QEMU_VERSION ", Copyright (c) 2004-2008 Fabrice Bellard\n"
bellard57d1a2b2004-08-03 21:15:11 +000057 "usage: qemu-img command [command options]\n"
bellardea2384d2004-08-01 21:59:26 +000058 "QEMU disk image utility\n"
59 "\n"
60 "Command syntax:\n"
aliguori15859692009-04-21 23:11:53 +000061 " check [-f fmt] filename\n"
aliguori9230eaf2009-03-28 17:55:19 +000062 " create [-e] [-6] [-F fmt] [-b base_image] [-f fmt] filename [size]\n"
bellardea2384d2004-08-01 21:59:26 +000063 " commit [-f fmt] filename\n"
thsf58c7b32008-06-05 21:53:49 +000064 " convert [-c] [-e] [-6] [-f fmt] [-O output_fmt] [-B output_base_image] filename [filename2 [...]] output_filename\n"
bellardea2384d2004-08-01 21:59:26 +000065 " info [-f fmt] filename\n"
blueswir1d2c639d2009-01-24 18:19:25 +000066 " snapshot [-l | -a snapshot | -c snapshot | -d snapshot] filename\n"
bellardea2384d2004-08-01 21:59:26 +000067 "\n"
68 "Command parameters:\n"
69 " 'filename' is a disk image filename\n"
70 " 'base_image' is the read-only disk image which is used as base for a copy on\n"
71 " write image; the copy on write image only stores the modified data\n"
thsf58c7b32008-06-05 21:53:49 +000072 " 'output_base_image' forces the output image to be created as a copy on write\n"
73 " image of the specified base image; 'output_base_image' should have the same\n"
74 " content as the input's base image, however the path, image format, etc may\n"
75 " differ\n"
bellardea2384d2004-08-01 21:59:26 +000076 " 'fmt' is the disk image format. It is guessed automatically in most cases\n"
blueswir1d2c639d2009-01-24 18:19:25 +000077 " 'size' is the disk image size in kilobytes. Optional suffixes\n"
aurel322fbc4092009-03-08 19:49:51 +000078 " 'M' (megabyte, 1024 * 1024) and 'G' (gigabyte, 1024 * 1024 * 1024) are\n"
79 " supported any 'k' or 'K' is ignored\n"
bellardea2384d2004-08-01 21:59:26 +000080 " 'output_filename' is the destination disk image filename\n"
81 " 'output_fmt' is the destination format\n"
82 " '-c' indicates that target image must be compressed (qcow format only)\n"
83 " '-e' indicates that the target image must be encrypted (qcow format only)\n"
thsec36ba12007-09-16 21:59:02 +000084 " '-6' indicates that the target image must use compatibility level 6 (vmdk format only)\n"
blueswir1d2c639d2009-01-24 18:19:25 +000085 " '-h' with or without a command shows this help and lists the supported formats\n"
aliguorif7b4a942009-01-07 17:40:15 +000086 "\n"
blueswir1d2c639d2009-01-24 18:19:25 +000087 "Parameters to snapshot subcommand:\n"
88 " 'snapshot' is the name of the snapshot to create, apply or delete\n"
89 " '-a' applies a snapshot (revert disk to saved state)\n"
90 " '-c' creates a snapshot\n"
91 " '-d' deletes a snapshot\n"
92 " '-l' lists all snapshots in the given image\n"
bellardea2384d2004-08-01 21:59:26 +000093 );
blueswir1d2c639d2009-01-24 18:19:25 +000094 printf("\nSupported formats:");
bellardea2384d2004-08-01 21:59:26 +000095 bdrv_iterate_format(format_print, NULL);
96 printf("\n");
97 exit(1);
98}
99
bellardea2384d2004-08-01 21:59:26 +0000100#if defined(WIN32)
101/* XXX: put correct support for win32 */
102static int read_password(char *buf, int buf_size)
103{
104 int c, i;
105 printf("Password: ");
106 fflush(stdout);
107 i = 0;
108 for(;;) {
109 c = getchar();
110 if (c == '\n')
111 break;
112 if (i < (buf_size - 1))
113 buf[i++] = c;
114 }
115 buf[i] = '\0';
116 return 0;
117}
118
119#else
120
121#include <termios.h>
122
123static struct termios oldtty;
124
125static void term_exit(void)
126{
127 tcsetattr (0, TCSANOW, &oldtty);
128}
129
130static void term_init(void)
131{
132 struct termios tty;
133
134 tcgetattr (0, &tty);
135 oldtty = tty;
136
137 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
138 |INLCR|IGNCR|ICRNL|IXON);
139 tty.c_oflag |= OPOST;
140 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
141 tty.c_cflag &= ~(CSIZE|PARENB);
142 tty.c_cflag |= CS8;
143 tty.c_cc[VMIN] = 1;
144 tty.c_cc[VTIME] = 0;
ths3b46e622007-09-17 08:09:54 +0000145
bellardea2384d2004-08-01 21:59:26 +0000146 tcsetattr (0, TCSANOW, &tty);
147
148 atexit(term_exit);
149}
150
pbrook3f379ab2007-11-11 03:33:13 +0000151static int read_password(char *buf, int buf_size)
bellardea2384d2004-08-01 21:59:26 +0000152{
153 uint8_t ch;
154 int i, ret;
155
156 printf("password: ");
157 fflush(stdout);
158 term_init();
159 i = 0;
160 for(;;) {
161 ret = read(0, &ch, 1);
162 if (ret == -1) {
163 if (errno == EAGAIN || errno == EINTR) {
164 continue;
165 } else {
166 ret = -1;
167 break;
168 }
169 } else if (ret == 0) {
170 ret = -1;
171 break;
172 } else {
173 if (ch == '\r') {
174 ret = 0;
175 break;
176 }
177 if (i < (buf_size - 1))
178 buf[i++] = ch;
179 }
180 }
181 term_exit();
182 buf[i] = '\0';
183 printf("\n");
184 return ret;
185}
186#endif
187
bellard75c23802004-08-27 21:28:58 +0000188static BlockDriverState *bdrv_new_open(const char *filename,
189 const char *fmt)
190{
191 BlockDriverState *bs;
192 BlockDriver *drv;
193 char password[256];
194
195 bs = bdrv_new("");
196 if (!bs)
197 error("Not enough memory");
198 if (fmt) {
199 drv = bdrv_find_format(fmt);
200 if (!drv)
201 error("Unknown file format '%s'", fmt);
202 } else {
203 drv = NULL;
204 }
aurel32137519c2008-11-30 19:12:49 +0000205 if (bdrv_open2(bs, filename, BRDV_O_FLAGS, drv) < 0) {
bellard75c23802004-08-27 21:28:58 +0000206 error("Could not open '%s'", filename);
207 }
208 if (bdrv_is_encrypted(bs)) {
209 printf("Disk image '%s' is encrypted.\n", filename);
210 if (read_password(password, sizeof(password)) < 0)
211 error("No password given");
212 if (bdrv_set_key(bs, password) < 0)
213 error("invalid password");
214 }
215 return bs;
216}
217
Kevin Wolfefa84d42009-05-18 16:42:12 +0200218static void add_old_style_options(const char *fmt, QEMUOptionParameter *list,
219 int flags, const char *base_filename, const char *base_fmt)
220{
221 if (flags & BLOCK_FLAG_ENCRYPT) {
222 if (set_option_parameter(list, BLOCK_OPT_ENCRYPT, "on")) {
223 error("Encryption not supported for file format '%s'", fmt);
224 }
225 }
226 if (flags & BLOCK_FLAG_COMPAT6) {
227 if (set_option_parameter(list, BLOCK_OPT_COMPAT6, "on")) {
228 error("VMDK version 6 not supported for file format '%s'", fmt);
229 }
230 }
231
232 if (base_filename) {
233 if (set_option_parameter(list, BLOCK_OPT_BACKING_FILE, base_filename)) {
234 error("Backing file not supported for file format '%s'", fmt);
235 }
236 }
237 if (base_fmt) {
238 if (set_option_parameter(list, BLOCK_OPT_BACKING_FMT, base_fmt)) {
239 error("Backing file format not supported for file format '%s'", fmt);
240 }
241 }
242}
243
bellardea2384d2004-08-01 21:59:26 +0000244static int img_create(int argc, char **argv)
245{
thsec36ba12007-09-16 21:59:02 +0000246 int c, ret, flags;
bellardea2384d2004-08-01 21:59:26 +0000247 const char *fmt = "raw";
aliguori9230eaf2009-03-28 17:55:19 +0000248 const char *base_fmt = NULL;
bellardea2384d2004-08-01 21:59:26 +0000249 const char *filename;
250 const char *base_filename = NULL;
bellardea2384d2004-08-01 21:59:26 +0000251 BlockDriver *drv;
Kevin Wolf9ea2ea72009-05-18 16:42:11 +0200252 QEMUOptionParameter *param = NULL;
253 char *options = NULL;
ths3b46e622007-09-17 08:09:54 +0000254
thsec36ba12007-09-16 21:59:02 +0000255 flags = 0;
bellardea2384d2004-08-01 21:59:26 +0000256 for(;;) {
Kevin Wolf9ea2ea72009-05-18 16:42:11 +0200257 c = getopt(argc, argv, "F:b:f:he6o:");
bellardea2384d2004-08-01 21:59:26 +0000258 if (c == -1)
259 break;
260 switch(c) {
261 case 'h':
262 help();
263 break;
aliguori9230eaf2009-03-28 17:55:19 +0000264 case 'F':
265 base_fmt = optarg;
266 break;
bellardea2384d2004-08-01 21:59:26 +0000267 case 'b':
268 base_filename = optarg;
269 break;
270 case 'f':
271 fmt = optarg;
272 break;
273 case 'e':
thsec36ba12007-09-16 21:59:02 +0000274 flags |= BLOCK_FLAG_ENCRYPT;
bellardea2384d2004-08-01 21:59:26 +0000275 break;
thsd8871c52007-10-24 16:11:42 +0000276 case '6':
thsec36ba12007-09-16 21:59:02 +0000277 flags |= BLOCK_FLAG_COMPAT6;
thsd8871c52007-10-24 16:11:42 +0000278 break;
Kevin Wolf9ea2ea72009-05-18 16:42:11 +0200279 case 'o':
280 options = optarg;
281 break;
bellardea2384d2004-08-01 21:59:26 +0000282 }
283 }
aliguori9230eaf2009-03-28 17:55:19 +0000284
Kevin Wolf9ea2ea72009-05-18 16:42:11 +0200285 /* Find driver and parse its options */
bellardea2384d2004-08-01 21:59:26 +0000286 drv = bdrv_find_format(fmt);
287 if (!drv)
288 error("Unknown file format '%s'", fmt);
Kevin Wolf9ea2ea72009-05-18 16:42:11 +0200289
Kevin Wolfdb08adf2009-06-04 15:39:38 +0200290 if (options && !strcmp(options, "?")) {
291 print_option_help(drv->create_options);
292 return 0;
293 }
294
Kevin Wolf9ea2ea72009-05-18 16:42:11 +0200295 if (options) {
296 param = parse_option_parameters(options, drv->create_options, param);
297 if (param == NULL) {
298 error("Invalid options for file format '%s'.", fmt);
299 }
300 } else {
301 param = parse_option_parameters("", drv->create_options, param);
bellard75c23802004-08-27 21:28:58 +0000302 }
Kevin Wolf9ea2ea72009-05-18 16:42:11 +0200303
Kevin Wolfdb08adf2009-06-04 15:39:38 +0200304 /* Get the filename */
305 if (optind >= argc)
306 help();
307 filename = argv[optind++];
308
Kevin Wolf9ea2ea72009-05-18 16:42:11 +0200309 /* Add size to parameters */
310 if (optind < argc) {
311 set_option_parameter(param, BLOCK_OPT_SIZE, argv[optind++]);
312 }
313
314 /* Add old-style options to parameters */
Kevin Wolfefa84d42009-05-18 16:42:12 +0200315 add_old_style_options(fmt, param, flags, base_filename, base_fmt);
Kevin Wolf9ea2ea72009-05-18 16:42:11 +0200316
317 // The size for the image must always be specified, with one exception:
318 // If we are using a backing file, we can obtain the size from there
319 if (get_option_parameter(param, BLOCK_OPT_SIZE)->value.n == 0) {
320
321 QEMUOptionParameter *backing_file =
322 get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
323 QEMUOptionParameter *backing_fmt =
324 get_option_parameter(param, BLOCK_OPT_BACKING_FMT);
325
326 if (backing_file && backing_file->value.s) {
327 BlockDriverState *bs;
328 uint64_t size;
329 const char *fmt = NULL;
330 char buf[32];
331
332 if (backing_fmt && backing_fmt->value.s) {
333 if (bdrv_find_format(backing_fmt->value.s)) {
334 fmt = backing_fmt->value.s;
335 } else {
336 error("Unknown backing file format '%s'",
337 backing_fmt->value.s);
338 }
339 }
340
341 bs = bdrv_new_open(backing_file->value.s, fmt);
342 bdrv_get_geometry(bs, &size);
343 size *= 512;
344 bdrv_delete(bs);
345
346 snprintf(buf, sizeof(buf), "%" PRId64, size);
347 set_option_parameter(param, BLOCK_OPT_SIZE, buf);
348 } else {
349 error("Image creation needs a size parameter");
350 }
351 }
352
353 printf("Formatting '%s', fmt=%s ", filename, fmt);
354 print_option_parameters(param);
355 puts("");
356
357 ret = bdrv_create(drv, filename, param);
358 free_option_parameters(param);
359
bellardea2384d2004-08-01 21:59:26 +0000360 if (ret < 0) {
361 if (ret == -ENOTSUP) {
bellard3c565212004-09-29 21:29:14 +0000362 error("Formatting or formatting option not supported for file format '%s'", fmt);
aurel326e9ea0c2009-04-15 14:42:46 +0000363 } else if (ret == -EFBIG) {
364 error("The image size is too large for file format '%s'", fmt);
bellardea2384d2004-08-01 21:59:26 +0000365 } else {
366 error("Error while formatting");
367 }
368 }
369 return 0;
370}
371
aliguori15859692009-04-21 23:11:53 +0000372static int img_check(int argc, char **argv)
373{
374 int c, ret;
375 const char *filename, *fmt;
376 BlockDriver *drv;
377 BlockDriverState *bs;
378
379 fmt = NULL;
380 for(;;) {
381 c = getopt(argc, argv, "f:h");
382 if (c == -1)
383 break;
384 switch(c) {
385 case 'h':
386 help();
387 break;
388 case 'f':
389 fmt = optarg;
390 break;
391 }
392 }
393 if (optind >= argc)
394 help();
395 filename = argv[optind++];
396
397 bs = bdrv_new("");
398 if (!bs)
399 error("Not enough memory");
400 if (fmt) {
401 drv = bdrv_find_format(fmt);
402 if (!drv)
403 error("Unknown file format '%s'", fmt);
404 } else {
405 drv = NULL;
406 }
407 if (bdrv_open2(bs, filename, BRDV_O_FLAGS, drv) < 0) {
408 error("Could not open '%s'", filename);
409 }
410 ret = bdrv_check(bs);
411 switch(ret) {
412 case 0:
413 printf("No errors were found on the image.\n");
414 break;
415 case -ENOTSUP:
416 error("This image format does not support checks");
417 break;
418 default:
419 if (ret < 0) {
420 error("An error occurred during the check");
421 } else {
422 printf("%d errors were found on the image.\n", ret);
423 }
424 break;
425 }
426
427 bdrv_delete(bs);
428 return 0;
429}
430
bellardea2384d2004-08-01 21:59:26 +0000431static int img_commit(int argc, char **argv)
432{
433 int c, ret;
434 const char *filename, *fmt;
435 BlockDriver *drv;
436 BlockDriverState *bs;
437
438 fmt = NULL;
439 for(;;) {
440 c = getopt(argc, argv, "f:h");
441 if (c == -1)
442 break;
443 switch(c) {
444 case 'h':
445 help();
446 break;
447 case 'f':
448 fmt = optarg;
449 break;
450 }
451 }
ths5fafdf22007-09-16 21:08:06 +0000452 if (optind >= argc)
bellardea2384d2004-08-01 21:59:26 +0000453 help();
454 filename = argv[optind++];
455
456 bs = bdrv_new("");
457 if (!bs)
458 error("Not enough memory");
459 if (fmt) {
460 drv = bdrv_find_format(fmt);
461 if (!drv)
462 error("Unknown file format '%s'", fmt);
463 } else {
464 drv = NULL;
465 }
aurel32137519c2008-11-30 19:12:49 +0000466 if (bdrv_open2(bs, filename, BRDV_O_FLAGS, drv) < 0) {
bellardea2384d2004-08-01 21:59:26 +0000467 error("Could not open '%s'", filename);
468 }
469 ret = bdrv_commit(bs);
470 switch(ret) {
471 case 0:
472 printf("Image committed.\n");
473 break;
474 case -ENOENT:
475 error("No disk inserted");
476 break;
477 case -EACCES:
478 error("Image is read-only");
479 break;
480 case -ENOTSUP:
481 error("Image is already committed");
482 break;
483 default:
484 error("Error while committing image");
485 break;
486 }
487
488 bdrv_delete(bs);
489 return 0;
490}
491
492static int is_not_zero(const uint8_t *sector, int len)
493{
494 int i;
495 len >>= 2;
496 for(i = 0;i < len; i++) {
497 if (((uint32_t *)sector)[i] != 0)
498 return 1;
499 }
500 return 0;
501}
502
thsf58c7b32008-06-05 21:53:49 +0000503/*
504 * Returns true iff the first sector pointed to by 'buf' contains at least
505 * a non-NUL byte.
506 *
507 * 'pnum' is set to the number of sectors (including and immediately following
508 * the first one) that are known to be in the same allocated/unallocated state.
509 */
bellardea2384d2004-08-01 21:59:26 +0000510static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum)
511{
512 int v, i;
513
514 if (n <= 0) {
515 *pnum = 0;
516 return 0;
517 }
518 v = is_not_zero(buf, 512);
519 for(i = 1; i < n; i++) {
520 buf += 512;
521 if (v != is_not_zero(buf, 512))
522 break;
523 }
524 *pnum = i;
525 return v;
526}
527
bellardea2384d2004-08-01 21:59:26 +0000528#define IO_BUF_SIZE 65536
529
530static int img_convert(int argc, char **argv)
531{
balrog926c2d22007-10-31 01:11:44 +0000532 int c, ret, n, n1, bs_n, bs_i, flags, cluster_size, cluster_sectors;
thsf58c7b32008-06-05 21:53:49 +0000533 const char *fmt, *out_fmt, *out_baseimg, *out_filename;
bellardea2384d2004-08-01 21:59:26 +0000534 BlockDriver *drv;
balrog926c2d22007-10-31 01:11:44 +0000535 BlockDriverState **bs, *out_bs;
ths96b8f132007-12-17 01:35:20 +0000536 int64_t total_sectors, nb_sectors, sector_num, bs_offset;
537 uint64_t bs_sectors;
bellardea2384d2004-08-01 21:59:26 +0000538 uint8_t buf[IO_BUF_SIZE];
539 const uint8_t *buf1;
bellardfaea38e2006-08-05 21:31:00 +0000540 BlockDriverInfo bdi;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200541 QEMUOptionParameter *param = NULL;
542 char *options = NULL;
bellardea2384d2004-08-01 21:59:26 +0000543
544 fmt = NULL;
545 out_fmt = "raw";
thsf58c7b32008-06-05 21:53:49 +0000546 out_baseimg = NULL;
thsec36ba12007-09-16 21:59:02 +0000547 flags = 0;
bellardea2384d2004-08-01 21:59:26 +0000548 for(;;) {
Kevin Wolfefa84d42009-05-18 16:42:12 +0200549 c = getopt(argc, argv, "f:O:B:hce6o:");
bellardea2384d2004-08-01 21:59:26 +0000550 if (c == -1)
551 break;
552 switch(c) {
553 case 'h':
554 help();
555 break;
556 case 'f':
557 fmt = optarg;
558 break;
559 case 'O':
560 out_fmt = optarg;
561 break;
thsf58c7b32008-06-05 21:53:49 +0000562 case 'B':
563 out_baseimg = optarg;
564 break;
bellardea2384d2004-08-01 21:59:26 +0000565 case 'c':
thsec36ba12007-09-16 21:59:02 +0000566 flags |= BLOCK_FLAG_COMPRESS;
bellardea2384d2004-08-01 21:59:26 +0000567 break;
568 case 'e':
thsec36ba12007-09-16 21:59:02 +0000569 flags |= BLOCK_FLAG_ENCRYPT;
570 break;
571 case '6':
572 flags |= BLOCK_FLAG_COMPAT6;
bellardea2384d2004-08-01 21:59:26 +0000573 break;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200574 case 'o':
575 options = optarg;
576 break;
bellardea2384d2004-08-01 21:59:26 +0000577 }
578 }
ths3b46e622007-09-17 08:09:54 +0000579
balrog926c2d22007-10-31 01:11:44 +0000580 bs_n = argc - optind - 1;
581 if (bs_n < 1) help();
582
583 out_filename = argv[argc - 1];
thsf58c7b32008-06-05 21:53:49 +0000584
585 if (bs_n > 1 && out_baseimg)
586 error("-B makes no sense when concatenating multiple input images");
balrog926c2d22007-10-31 01:11:44 +0000587
588 bs = calloc(bs_n, sizeof(BlockDriverState *));
589 if (!bs)
590 error("Out of memory");
591
592 total_sectors = 0;
593 for (bs_i = 0; bs_i < bs_n; bs_i++) {
594 bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt);
595 if (!bs[bs_i])
596 error("Could not open '%s'", argv[optind + bs_i]);
597 bdrv_get_geometry(bs[bs_i], &bs_sectors);
598 total_sectors += bs_sectors;
599 }
bellardea2384d2004-08-01 21:59:26 +0000600
Kevin Wolfefa84d42009-05-18 16:42:12 +0200601 /* Find driver and parse its options */
bellardea2384d2004-08-01 21:59:26 +0000602 drv = bdrv_find_format(out_fmt);
603 if (!drv)
thsd34dda52007-02-10 22:59:40 +0000604 error("Unknown file format '%s'", out_fmt);
balrog926c2d22007-10-31 01:11:44 +0000605
Kevin Wolfdb08adf2009-06-04 15:39:38 +0200606 if (options && !strcmp(options, "?")) {
607 print_option_help(drv->create_options);
608 return 0;
609 }
610
Kevin Wolfefa84d42009-05-18 16:42:12 +0200611 if (options) {
612 param = parse_option_parameters(options, drv->create_options, param);
613 if (param == NULL) {
614 error("Invalid options for file format '%s'.", out_fmt);
615 }
616 } else {
617 param = parse_option_parameters("", drv->create_options, param);
618 }
619
620 set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
621 add_old_style_options(out_fmt, param, flags, out_baseimg, NULL);
622
623 /* Check if compression is supported */
624 if (flags & BLOCK_FLAG_COMPRESS) {
625 QEMUOptionParameter *encryption =
626 get_option_parameter(param, BLOCK_OPT_ENCRYPT);
627
628 if (!drv->bdrv_write_compressed) {
629 error("Compression not supported for this file format");
630 }
631
632 if (encryption && encryption->value.n) {
633 error("Compression and encryption not supported at the same time");
634 }
635 }
636
637 /* Create the new image */
638 ret = bdrv_create(drv, out_filename, param);
639 free_option_parameters(param);
640
bellardea2384d2004-08-01 21:59:26 +0000641 if (ret < 0) {
642 if (ret == -ENOTSUP) {
aliguori93c65b42009-04-05 17:40:43 +0000643 error("Formatting not supported for file format '%s'", out_fmt);
aurel326e9ea0c2009-04-15 14:42:46 +0000644 } else if (ret == -EFBIG) {
645 error("The image size is too large for file format '%s'", out_fmt);
bellardea2384d2004-08-01 21:59:26 +0000646 } else {
647 error("Error while formatting '%s'", out_filename);
648 }
649 }
ths3b46e622007-09-17 08:09:54 +0000650
bellardea2384d2004-08-01 21:59:26 +0000651 out_bs = bdrv_new_open(out_filename, out_fmt);
652
balrog926c2d22007-10-31 01:11:44 +0000653 bs_i = 0;
654 bs_offset = 0;
655 bdrv_get_geometry(bs[0], &bs_sectors);
656
657 if (flags & BLOCK_FLAG_COMPRESS) {
bellardfaea38e2006-08-05 21:31:00 +0000658 if (bdrv_get_info(out_bs, &bdi) < 0)
659 error("could not get block driver info");
660 cluster_size = bdi.cluster_size;
bellardea2384d2004-08-01 21:59:26 +0000661 if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE)
662 error("invalid cluster size");
663 cluster_sectors = cluster_size >> 9;
664 sector_num = 0;
665 for(;;) {
balrog926c2d22007-10-31 01:11:44 +0000666 int64_t bs_num;
667 int remainder;
668 uint8_t *buf2;
669
bellardea2384d2004-08-01 21:59:26 +0000670 nb_sectors = total_sectors - sector_num;
671 if (nb_sectors <= 0)
672 break;
673 if (nb_sectors >= cluster_sectors)
674 n = cluster_sectors;
675 else
676 n = nb_sectors;
balrog926c2d22007-10-31 01:11:44 +0000677
678 bs_num = sector_num - bs_offset;
679 assert (bs_num >= 0);
680 remainder = n;
681 buf2 = buf;
682 while (remainder > 0) {
683 int nlow;
684 while (bs_num == bs_sectors) {
685 bs_i++;
686 assert (bs_i < bs_n);
687 bs_offset += bs_sectors;
688 bdrv_get_geometry(bs[bs_i], &bs_sectors);
689 bs_num = 0;
690 /* printf("changing part: sector_num=%lld, "
691 "bs_i=%d, bs_offset=%lld, bs_sectors=%lld\n",
692 sector_num, bs_i, bs_offset, bs_sectors); */
693 }
694 assert (bs_num < bs_sectors);
695
696 nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
697
698 if (bdrv_read(bs[bs_i], bs_num, buf2, nlow) < 0)
699 error("error while reading");
700
701 buf2 += nlow * 512;
702 bs_num += nlow;
703
704 remainder -= nlow;
705 }
706 assert (remainder == 0);
707
bellardea2384d2004-08-01 21:59:26 +0000708 if (n < cluster_sectors)
709 memset(buf + n * 512, 0, cluster_size - n * 512);
710 if (is_not_zero(buf, cluster_size)) {
ths5fafdf22007-09-16 21:08:06 +0000711 if (bdrv_write_compressed(out_bs, sector_num, buf,
bellardfaea38e2006-08-05 21:31:00 +0000712 cluster_sectors) != 0)
bellardec3757d2006-06-14 15:50:07 +0000713 error("error while compressing sector %" PRId64,
714 sector_num);
bellardea2384d2004-08-01 21:59:26 +0000715 }
716 sector_num += n;
717 }
bellardfaea38e2006-08-05 21:31:00 +0000718 /* signal EOF to align */
719 bdrv_write_compressed(out_bs, 0, NULL, 0);
bellardea2384d2004-08-01 21:59:26 +0000720 } else {
thsf58c7b32008-06-05 21:53:49 +0000721 sector_num = 0; // total number of sectors converted so far
bellardea2384d2004-08-01 21:59:26 +0000722 for(;;) {
723 nb_sectors = total_sectors - sector_num;
724 if (nb_sectors <= 0)
725 break;
726 if (nb_sectors >= (IO_BUF_SIZE / 512))
727 n = (IO_BUF_SIZE / 512);
728 else
729 n = nb_sectors;
balrog926c2d22007-10-31 01:11:44 +0000730
731 while (sector_num - bs_offset >= bs_sectors) {
732 bs_i ++;
733 assert (bs_i < bs_n);
734 bs_offset += bs_sectors;
735 bdrv_get_geometry(bs[bs_i], &bs_sectors);
736 /* printf("changing part: sector_num=%lld, bs_i=%d, "
737 "bs_offset=%lld, bs_sectors=%lld\n",
738 sector_num, bs_i, bs_offset, bs_sectors); */
739 }
740
741 if (n > bs_offset + bs_sectors - sector_num)
742 n = bs_offset + bs_sectors - sector_num;
743
Anthony Liguori5efa9d52009-05-09 17:03:42 -0500744 if (strcmp(drv->format_name, "host_device")) {
aliguori93c65b42009-04-05 17:40:43 +0000745 if (!bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
746 n, &n1)) {
747 sector_num += n1;
748 continue;
749 }
750 /* The next 'n1' sectors are allocated in the input image. Copy
751 only those as they may be followed by unallocated sectors. */
752 n = n1;
753 } else {
754 n1 = n;
thsf58c7b32008-06-05 21:53:49 +0000755 }
756
balrog926c2d22007-10-31 01:11:44 +0000757 if (bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n) < 0)
bellardea2384d2004-08-01 21:59:26 +0000758 error("error while reading");
759 /* NOTE: at the same time we convert, we do not write zero
760 sectors to have a chance to compress the image. Ideally, we
761 should add a specific call to have the info to go faster */
762 buf1 = buf;
763 while (n > 0) {
thsf58c7b32008-06-05 21:53:49 +0000764 /* If the output image is being created as a copy on write image,
765 copy all sectors even the ones containing only NUL bytes,
aliguori93c65b42009-04-05 17:40:43 +0000766 because they may differ from the sectors in the base image.
767
768 If the output is to a host device, we also write out
769 sectors that are entirely 0, since whatever data was
770 already there is garbage, not 0s. */
Anthony Liguori5efa9d52009-05-09 17:03:42 -0500771 if (strcmp(drv->format_name, "host_device") == 0 || out_baseimg ||
aliguori93c65b42009-04-05 17:40:43 +0000772 is_allocated_sectors(buf1, n, &n1)) {
ths5fafdf22007-09-16 21:08:06 +0000773 if (bdrv_write(out_bs, sector_num, buf1, n1) < 0)
bellardea2384d2004-08-01 21:59:26 +0000774 error("error while writing");
775 }
776 sector_num += n1;
777 n -= n1;
778 buf1 += n1 * 512;
779 }
780 }
781 }
782 bdrv_delete(out_bs);
balrog926c2d22007-10-31 01:11:44 +0000783 for (bs_i = 0; bs_i < bs_n; bs_i++)
784 bdrv_delete(bs[bs_i]);
785 free(bs);
bellardea2384d2004-08-01 21:59:26 +0000786 return 0;
787}
788
bellard57d1a2b2004-08-03 21:15:11 +0000789#ifdef _WIN32
790static int64_t get_allocated_file_size(const char *filename)
791{
bellarde8445332006-06-14 15:32:10 +0000792 typedef DWORD (WINAPI * get_compressed_t)(const char *filename, DWORD *high);
793 get_compressed_t get_compressed;
bellard57d1a2b2004-08-03 21:15:11 +0000794 struct _stati64 st;
bellarde8445332006-06-14 15:32:10 +0000795
796 /* WinNT support GetCompressedFileSize to determine allocate size */
797 get_compressed = (get_compressed_t) GetProcAddress(GetModuleHandle("kernel32"), "GetCompressedFileSizeA");
798 if (get_compressed) {
799 DWORD high, low;
800 low = get_compressed(filename, &high);
801 if (low != 0xFFFFFFFFlu || GetLastError() == NO_ERROR)
802 return (((int64_t) high) << 32) + low;
803 }
804
ths5fafdf22007-09-16 21:08:06 +0000805 if (_stati64(filename, &st) < 0)
bellard57d1a2b2004-08-03 21:15:11 +0000806 return -1;
807 return st.st_size;
808}
809#else
810static int64_t get_allocated_file_size(const char *filename)
811{
812 struct stat st;
ths5fafdf22007-09-16 21:08:06 +0000813 if (stat(filename, &st) < 0)
bellard57d1a2b2004-08-03 21:15:11 +0000814 return -1;
815 return (int64_t)st.st_blocks * 512;
816}
817#endif
818
bellardfaea38e2006-08-05 21:31:00 +0000819static void dump_snapshots(BlockDriverState *bs)
820{
821 QEMUSnapshotInfo *sn_tab, *sn;
822 int nb_sns, i;
823 char buf[256];
824
825 nb_sns = bdrv_snapshot_list(bs, &sn_tab);
826 if (nb_sns <= 0)
827 return;
828 printf("Snapshot list:\n");
829 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
830 for(i = 0; i < nb_sns; i++) {
831 sn = &sn_tab[i];
832 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
833 }
834 qemu_free(sn_tab);
835}
836
bellardea2384d2004-08-01 21:59:26 +0000837static int img_info(int argc, char **argv)
838{
839 int c;
840 const char *filename, *fmt;
841 BlockDriver *drv;
842 BlockDriverState *bs;
843 char fmt_name[128], size_buf[128], dsize_buf[128];
ths96b8f132007-12-17 01:35:20 +0000844 uint64_t total_sectors;
845 int64_t allocated_size;
bellard93b6b2a2006-08-01 15:51:11 +0000846 char backing_filename[1024];
847 char backing_filename2[1024];
bellardfaea38e2006-08-05 21:31:00 +0000848 BlockDriverInfo bdi;
bellardea2384d2004-08-01 21:59:26 +0000849
850 fmt = NULL;
851 for(;;) {
852 c = getopt(argc, argv, "f:h");
853 if (c == -1)
854 break;
855 switch(c) {
856 case 'h':
857 help();
858 break;
859 case 'f':
860 fmt = optarg;
861 break;
862 }
863 }
ths5fafdf22007-09-16 21:08:06 +0000864 if (optind >= argc)
bellardea2384d2004-08-01 21:59:26 +0000865 help();
866 filename = argv[optind++];
867
868 bs = bdrv_new("");
869 if (!bs)
870 error("Not enough memory");
871 if (fmt) {
872 drv = bdrv_find_format(fmt);
873 if (!drv)
874 error("Unknown file format '%s'", fmt);
875 } else {
876 drv = NULL;
877 }
aurel32137519c2008-11-30 19:12:49 +0000878 if (bdrv_open2(bs, filename, BRDV_O_FLAGS, drv) < 0) {
bellardea2384d2004-08-01 21:59:26 +0000879 error("Could not open '%s'", filename);
880 }
881 bdrv_get_format(bs, fmt_name, sizeof(fmt_name));
882 bdrv_get_geometry(bs, &total_sectors);
883 get_human_readable_size(size_buf, sizeof(size_buf), total_sectors * 512);
bellard57d1a2b2004-08-03 21:15:11 +0000884 allocated_size = get_allocated_file_size(filename);
885 if (allocated_size < 0)
blueswir1a10ea302008-08-24 10:30:33 +0000886 snprintf(dsize_buf, sizeof(dsize_buf), "unavailable");
bellardde167e42005-04-28 21:15:08 +0000887 else
ths5fafdf22007-09-16 21:08:06 +0000888 get_human_readable_size(dsize_buf, sizeof(dsize_buf),
bellardde167e42005-04-28 21:15:08 +0000889 allocated_size);
bellardea2384d2004-08-01 21:59:26 +0000890 printf("image: %s\n"
891 "file format: %s\n"
bellardec3757d2006-06-14 15:50:07 +0000892 "virtual size: %s (%" PRId64 " bytes)\n"
bellardea2384d2004-08-01 21:59:26 +0000893 "disk size: %s\n",
ths5fafdf22007-09-16 21:08:06 +0000894 filename, fmt_name, size_buf,
bellardec3757d2006-06-14 15:50:07 +0000895 (total_sectors * 512),
bellardea2384d2004-08-01 21:59:26 +0000896 dsize_buf);
897 if (bdrv_is_encrypted(bs))
898 printf("encrypted: yes\n");
bellardfaea38e2006-08-05 21:31:00 +0000899 if (bdrv_get_info(bs, &bdi) >= 0) {
ths5fafdf22007-09-16 21:08:06 +0000900 if (bdi.cluster_size != 0)
bellardfaea38e2006-08-05 21:31:00 +0000901 printf("cluster_size: %d\n", bdi.cluster_size);
902 }
bellard93b6b2a2006-08-01 15:51:11 +0000903 bdrv_get_backing_filename(bs, backing_filename, sizeof(backing_filename));
bellardfaea38e2006-08-05 21:31:00 +0000904 if (backing_filename[0] != '\0') {
bellard93b6b2a2006-08-01 15:51:11 +0000905 path_combine(backing_filename2, sizeof(backing_filename2),
906 filename, backing_filename);
ths5fafdf22007-09-16 21:08:06 +0000907 printf("backing file: %s (actual path: %s)\n",
bellard93b6b2a2006-08-01 15:51:11 +0000908 backing_filename,
909 backing_filename2);
bellardfaea38e2006-08-05 21:31:00 +0000910 }
911 dump_snapshots(bs);
bellardea2384d2004-08-01 21:59:26 +0000912 bdrv_delete(bs);
913 return 0;
914}
915
aliguorif7b4a942009-01-07 17:40:15 +0000916#define SNAPSHOT_LIST 1
917#define SNAPSHOT_CREATE 2
918#define SNAPSHOT_APPLY 3
919#define SNAPSHOT_DELETE 4
920
921static void img_snapshot(int argc, char **argv)
922{
923 BlockDriverState *bs;
924 QEMUSnapshotInfo sn;
925 char *filename, *snapshot_name = NULL;
aliguori40a45392009-01-15 21:42:12 +0000926 int c, ret;
aliguorif7b4a942009-01-07 17:40:15 +0000927 int action = 0;
928 qemu_timeval tv;
929
930 /* Parse commandline parameters */
931 for(;;) {
932 c = getopt(argc, argv, "la:c:d:h");
933 if (c == -1)
934 break;
935 switch(c) {
936 case 'h':
937 help();
938 return;
939 case 'l':
940 if (action) {
941 help();
942 return;
943 }
944 action = SNAPSHOT_LIST;
945 break;
946 case 'a':
947 if (action) {
948 help();
949 return;
950 }
951 action = SNAPSHOT_APPLY;
952 snapshot_name = optarg;
953 break;
954 case 'c':
955 if (action) {
956 help();
957 return;
958 }
959 action = SNAPSHOT_CREATE;
960 snapshot_name = optarg;
961 break;
962 case 'd':
963 if (action) {
964 help();
965 return;
966 }
967 action = SNAPSHOT_DELETE;
968 snapshot_name = optarg;
969 break;
970 }
971 }
972
973 if (optind >= argc)
974 help();
975 filename = argv[optind++];
976
977 /* Open the image */
978 bs = bdrv_new("");
979 if (!bs)
980 error("Not enough memory");
981
982 if (bdrv_open2(bs, filename, 0, NULL) < 0) {
983 error("Could not open '%s'", filename);
984 }
985
986 /* Perform the requested action */
987 switch(action) {
988 case SNAPSHOT_LIST:
989 dump_snapshots(bs);
990 break;
991
992 case SNAPSHOT_CREATE:
993 memset(&sn, 0, sizeof(sn));
994 pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
995
996 qemu_gettimeofday(&tv);
997 sn.date_sec = tv.tv_sec;
998 sn.date_nsec = tv.tv_usec * 1000;
999
1000 ret = bdrv_snapshot_create(bs, &sn);
1001 if (ret)
1002 error("Could not create snapshot '%s': %d (%s)",
1003 snapshot_name, ret, strerror(-ret));
1004 break;
1005
1006 case SNAPSHOT_APPLY:
1007 ret = bdrv_snapshot_goto(bs, snapshot_name);
1008 if (ret)
1009 error("Could not apply snapshot '%s': %d (%s)",
1010 snapshot_name, ret, strerror(-ret));
1011 break;
1012
1013 case SNAPSHOT_DELETE:
1014 ret = bdrv_snapshot_delete(bs, snapshot_name);
1015 if (ret)
1016 error("Could not delete snapshot '%s': %d (%s)",
1017 snapshot_name, ret, strerror(-ret));
1018 break;
1019 }
1020
1021 /* Cleanup */
1022 bdrv_delete(bs);
1023}
1024
bellardea2384d2004-08-01 21:59:26 +00001025int main(int argc, char **argv)
1026{
1027 const char *cmd;
1028
1029 bdrv_init();
1030 if (argc < 2)
1031 help();
1032 cmd = argv[1];
aurel328f9b1572009-02-09 18:14:31 +00001033 argc--; argv++;
bellardea2384d2004-08-01 21:59:26 +00001034 if (!strcmp(cmd, "create")) {
1035 img_create(argc, argv);
aliguori15859692009-04-21 23:11:53 +00001036 } else if (!strcmp(cmd, "check")) {
1037 img_check(argc, argv);
bellardea2384d2004-08-01 21:59:26 +00001038 } else if (!strcmp(cmd, "commit")) {
1039 img_commit(argc, argv);
1040 } else if (!strcmp(cmd, "convert")) {
1041 img_convert(argc, argv);
1042 } else if (!strcmp(cmd, "info")) {
1043 img_info(argc, argv);
aliguorif7b4a942009-01-07 17:40:15 +00001044 } else if (!strcmp(cmd, "snapshot")) {
1045 img_snapshot(argc, argv);
bellardea2384d2004-08-01 21:59:26 +00001046 } else {
1047 help();
1048 }
1049 return 0;
1050}