.. _disk images:

Disk Images
-----------

QEMU supports many disk image formats, including growable disk images
(their size increase as non empty sectors are written), compressed and
encrypted disk images.

.. _disk_005fimages_005fquickstart:

Quick start for disk image creation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

You can create a disk image with the command::

   qemu-img create myimage.img mysize

where myimage.img is the disk image filename and mysize is its size in
kilobytes. You can add an ``M`` suffix to give the size in megabytes and
a ``G`` suffix for gigabytes.

See the qemu-img invocation documentation for more information.

.. _disk_005fimages_005fsnapshot_005fmode:

Snapshot mode
~~~~~~~~~~~~~

If you use the option ``-snapshot``, all disk images are considered as
read only. When sectors in written, they are written in a temporary file
created in ``/tmp``. You can however force the write back to the raw
disk images by using the ``commit`` monitor command (or C-a s in the
serial console).

.. _vm_005fsnapshots:

VM snapshots
~~~~~~~~~~~~

VM snapshots are snapshots of the complete virtual machine including CPU
state, RAM, device state and the content of all the writable disks. In
order to use VM snapshots, you must have at least one non removable and
writable block device using the ``qcow2`` disk image format. Normally
this device is the first virtual hard drive.

Use the monitor command ``savevm`` to create a new VM snapshot or
replace an existing one. A human readable name can be assigned to each
snapshot in addition to its numerical ID.

Use ``loadvm`` to restore a VM snapshot and ``delvm`` to remove a VM
snapshot. ``info snapshots`` lists the available snapshots with their
associated information::

   (qemu) info snapshots
   Snapshot devices: hda
   Snapshot list (from hda):
   ID        TAG                 VM SIZE                DATE       VM CLOCK
   1         start                   41M 2006-08-06 12:38:02   00:00:14.954
   2                                 40M 2006-08-06 12:43:29   00:00:18.633
   3         msys                    40M 2006-08-06 12:44:04   00:00:23.514

A VM snapshot is made of a VM state info (its size is shown in
``info snapshots``) and a snapshot of every writable disk image. The VM
state info is stored in the first ``qcow2`` non removable and writable
block device. The disk image snapshots are stored in every disk image.
The size of a snapshot in a disk image is difficult to evaluate and is
not shown by ``info snapshots`` because the associated disk sectors are
shared among all the snapshots to save disk space (otherwise each
snapshot would need a full copy of all the disk images).

When using the (unrelated) ``-snapshot`` option
(:ref:`disk_005fimages_005fsnapshot_005fmode`),
you can always make VM snapshots, but they are deleted as soon as you
exit QEMU.

VM snapshots currently have the following known limitations:

-  They cannot cope with removable devices if they are removed or
   inserted after a snapshot is done.

-  A few device drivers still have incomplete snapshot support so their
   state is not saved or restored properly (in particular USB).

.. include:: qemu-block-drivers.rst.inc
