snapshot subcommand for qemu-img
PATCH 1/1 snapshot subcommand for qemu-img
Add snapshot subcommand to qemu-img which allows to list, create, apply and delete snapshots on qcow2 images.
qemu-img.c +128 -0
@@ -60,6 +60,7 @@ static void help(void)" commit [-f fmt] filename\n" " convert [-c] [-e] [-6] [-f fmt] [-O output_fmt] [-B output_base_image] filename [filename2 [...]] output_filename\n" " info [-f fmt] filename\n" +" snapshot [-l|-a snapshot|-c snapshot|-d snapshot] filename\n" "\n" "Command parameters:\n" " 'filename' is a disk image filename\n"
@@ -77,6 +78,13 @@ static void help(void)" '-c' indicates that target image must be compressed (qcow format only)\n" " '-e' indicates that the target image must be encrypted (qcow format only)\n" " '-6' indicates that the target image must use compatibility level 6 (vmdk format only)\n" +"\n" +" Parameters to snapshot subcommand:\n" +" 'snapshot' is the name of the snapshot to create, apply or delete\n" +" '-a' applies a snapshot (revert disk to saved state)\n" +" '-c' creates a snapshot\n" +" '-d' deletes a snapshot\n" +" '-l' lists all snapshots in the given image\n" );printf ("\nSupported format:" );bdrv_iterate_format (format_print,NULL );
@@ -732,6 +740,124 @@ static int img_info(int argc, char **argreturn 0 ; } +#define SNAPSHOT_LIST 1 +#define SNAPSHOT_CREATE 2 +#define SNAPSHOT_APPLY 3 +#define SNAPSHOT_DELETE 4 + +static void img_snapshot (int argc,char **argv) +{ +BlockDriverState *bs; +QEMUSnapshotInfo sn; +char *filename, *snapshot_name =NULL ; +char c; +int ret; +int action =0 ; +#ifdef _WIN32 +struct _timeb tb; +#else +struct timeval tv; +#endif + +/* Parse commandline parameters */ +for (;;) { + c =getopt (argc, argv,"la:c:d:h" ); +if (c ==-1 ) +break ; +switch (c) { +case 'h' : +help (); +return ; +case 'l' : +if (action) { +help (); +return ; + } + action =SNAPSHOT_LIST ; +break ; +case 'a' : +if (action) { +help (); +return ; + } + action =SNAPSHOT_APPLY ; + snapshot_name = optarg; +break ; +case 'c' : +if (action) { +help (); +return ; + } + action =SNAPSHOT_CREATE ; + snapshot_name = optarg; +break ; +case 'd' : +if (action) { +help (); +return ; + } + action =SNAPSHOT_DELETE ; + snapshot_name = optarg; +break ; + } + } + +if (optind >= argc) +help (); + filename = argv[optind++]; + +/* Open the image */ + bs =bdrv_new ("" ); +if (!bs) +error ("Not enough memory" ); + +if (bdrv_open2 (bs, filename,0 ,NULL ) <0 ) { +error ("Could not open '%s'" , filename); + } + +/* Perform the requested action */ +switch (action) { +case SNAPSHOT_LIST : +dump_snapshots (bs); +break ; + +case SNAPSHOT_CREATE : +memset (&sn,0 ,sizeof (sn)); +pstrcpy (sn.name,sizeof (sn.name), snapshot_name); +#ifdef _WIN32 +_ftime (&tb); + sn.date_sec = tb.time; + sn.date_nsec = tb.millitm *1000000 ; +#else +gettimeofday (&tv,NULL ); + sn.date_sec = tv.tv_sec; + sn.date_nsec = tv.tv_usec *1000 ; +#endif + ret =bdrv_snapshot_create (bs, &sn); +if (ret) +error ("Could not create snapshot '%s': %d (%s)" , + snapshot_name, ret,strerror (-ret)); +break ; + +case SNAPSHOT_APPLY : + ret =bdrv_snapshot_goto (bs, snapshot_name); +if (ret) +error ("Could not apply snapshot '%s': %d (%s)" , + snapshot_name, ret,strerror (-ret)); +break ; + +case SNAPSHOT_DELETE : + ret =bdrv_snapshot_delete (bs, snapshot_name); +if (ret) +error ("Could not delete snapshot '%s': %d (%s)" , + snapshot_name, ret,strerror (-ret)); +break ; + } + +/* Cleanup */ +bdrv_delete (bs); +} +int main (int argc,char **argv) {const char *cmd;
@@ -749,6 +875,8 @@ int main(int argc, char **argv)img_convert (argc, argv); }else if (!strcmp (cmd,"info" )) {img_info (argc, argv); + }else if (!strcmp (cmd,"snapshot" )) { +img_snapshot (argc, argv); }else {help (); }
Quoted 5 lines · Kevin Wolf
Add snapshot subcommand to qemu-img which allows to list, create, apply and delete snapshots on qcow2 images.
Signed-off-by Kevin Wolf <[email protected]>
This introduces a warning that gettimeofday is implicit. You can avoid the #ifdef _WIN32 by just using qemu_gettimeofday from osdep.h and also avoid the warning in the process.
Regards,
Anthony Liguori
PATCH 1/1 snapshot subcommand for qemu-img (v2)
Quoted 10 lines · Anthony Liguori
Quoted 5 lines · Kevin Wolf
Add snapshot subcommand to qemu-img which allows to list, create, apply and delete snapshots on qcow2 images.
Signed-off-by Kevin Wolf <[email protected]>This introduces a warning that gettimeofday is implicit. You can avoid the #ifdef
_WIN32by just usingqemu_gettimeofdayfromosdep.hand also avoid the warning in the process.
Oops, I should have noticed the warning. For the #ifdef, I've taken that code directly from savevm.c. Maybe it would be a good idea to change it to qemu_gettimeofday there, too? Anyway, next attempt:
Add snapshot subcommand to qemu-img which allows to list, create, apply and delete snapshots on qcow2 images.
qemu-img.c +121 -0
@@ -22,6 +22,7 @@* THE SOFTWARE. */ #include "qemu-common.h" +#include "osdep.h" #include "block_int.h" #include <assert.h>
@@ -60,6 +61,7 @@ static void help(void)" commit [-f fmt] filename\n" " convert [-c] [-e] [-6] [-f fmt] [-O output_fmt] [-B output_base_image] filename [filename2 [...]] output_filename\n" " info [-f fmt] filename\n" +" snapshot [-l|-a snapshot|-c snapshot|-d snapshot] filename\n" "\n" "Command parameters:\n" " 'filename' is a disk image filename\n"
@@ -77,6 +79,13 @@ static void help(void)" '-c' indicates that target image must be compressed (qcow format only)\n" " '-e' indicates that the target image must be encrypted (qcow format only)\n" " '-6' indicates that the target image must use compatibility level 6 (vmdk format only)\n" +"\n" +" Parameters to snapshot subcommand:\n" +" 'snapshot' is the name of the snapshot to create, apply or delete\n" +" '-a' applies a snapshot (revert disk to saved state)\n" +" '-c' creates a snapshot\n" +" '-d' deletes a snapshot\n" +" '-l' lists all snapshots in the given image\n" );printf ("\nSupported format:" );bdrv_iterate_format (format_print,NULL );
@@ -732,6 +741,116 @@ static int img_info(int argc, char **argreturn 0 ; } +#define SNAPSHOT_LIST 1 +#define SNAPSHOT_CREATE 2 +#define SNAPSHOT_APPLY 3 +#define SNAPSHOT_DELETE 4 + +static void img_snapshot (int argc,char **argv) +{ +BlockDriverState *bs; +QEMUSnapshotInfo sn; +char *filename, *snapshot_name =NULL ; +char c; +int ret; +int action =0 ; +qemu_timeval tv; + +/* Parse commandline parameters */ +for (;;) { + c =getopt (argc, argv,"la:c:d:h" ); +if (c ==-1 ) +break ; +switch (c) { +case 'h' : +help (); +return ; +case 'l' : +if (action) { +help (); +return ; + } + action =SNAPSHOT_LIST ; +break ; +case 'a' : +if (action) { +help (); +return ; + } + action =SNAPSHOT_APPLY ; + snapshot_name = optarg; +break ; +case 'c' : +if (action) { +help (); +return ; + } + action =SNAPSHOT_CREATE ; + snapshot_name = optarg; +break ; +case 'd' : +if (action) { +help (); +return ; + } + action =SNAPSHOT_DELETE ; + snapshot_name = optarg; +break ; + } + } + +if (optind >= argc) +help (); + filename = argv[optind++]; + +/* Open the image */ + bs =bdrv_new ("" ); +if (!bs) +error ("Not enough memory" ); + +if (bdrv_open2 (bs, filename,0 ,NULL ) <0 ) { +error ("Could not open '%s'" , filename); + } + +/* Perform the requested action */ +switch (action) { +case SNAPSHOT_LIST : +dump_snapshots (bs); +break ; + +case SNAPSHOT_CREATE : +memset (&sn,0 ,sizeof (sn)); +pstrcpy (sn.name,sizeof (sn.name), snapshot_name); + +qemu_gettimeofday (&tv); + sn.date_sec = tv.tv_sec; + sn.date_nsec = tv.tv_usec *1000 ; + + ret =bdrv_snapshot_create (bs, &sn); +if (ret) +error ("Could not create snapshot '%s': %d (%s)" , + snapshot_name, ret,strerror (-ret)); +break ; + +case SNAPSHOT_APPLY : + ret =bdrv_snapshot_goto (bs, snapshot_name); +if (ret) +error ("Could not apply snapshot '%s': %d (%s)" , + snapshot_name, ret,strerror (-ret)); +break ; + +case SNAPSHOT_DELETE : + ret =bdrv_snapshot_delete (bs, snapshot_name); +if (ret) +error ("Could not delete snapshot '%s': %d (%s)" , + snapshot_name, ret,strerror (-ret)); +break ; + } + +/* Cleanup */ +bdrv_delete (bs); +} +int main (int argc,char **argv) {const char *cmd;
@@ -749,6 +868,8 @@ int main(int argc, char **argv)img_convert (argc, argv); }else if (!strcmp (cmd,"info" )) {img_info (argc, argv); + }else if (!strcmp (cmd,"snapshot" )) { +img_snapshot (argc, argv); }else {help (); }
osdep.h +4 -0
@@ -7,6 +7,10 @@#include <sys/signal.h> #endif +#ifndef _WIN32 +#include <sys/time.h> +#endif +#ifndef glue#define xglue (x, y) x ## y#define glue (x, y) xglue(x, y)