=======================
QEMU disk image utility
=======================

Synopsis
--------

**qemu-img** [*standard options*] *command* [*command options*]

Description
-----------

qemu-img allows you to create, convert and modify images offline. It can handle
all image formats supported by QEMU.

**Warning:** Never use qemu-img to modify images in use by a running virtual
machine or any other process; this may destroy the image. Also, be aware that
querying an image that is being modified by another process may encounter
inconsistent state.

Options
-------

.. program:: qemu-img

Standard options:

.. option:: -h, --help

  Display this help and exit

.. option:: -V, --version

  Display version information and exit

.. option:: -T, --trace [[enable=]PATTERN][,events=FILE][,file=FILE]

  .. include:: ../qemu-option-trace.rst.inc

The following commands are supported:

.. hxtool-doc:: qemu-img-cmds.hx

Command parameters:

*FILENAME* is a disk image filename.

*FMT* is the disk image format. It is guessed automatically in most
cases. See below for a description of the supported disk formats.

*SIZE* is the disk image size in bytes. Optional suffixes ``k`` or
``K`` (kilobyte, 1024) ``M`` (megabyte, 1024k) and ``G`` (gigabyte,
1024M) and T (terabyte, 1024G) are supported.  ``b`` is ignored.

*OUTPUT_FILENAME* is the destination disk image filename.

*OUTPUT_FMT* is the destination format.

*OPTIONS* is a comma separated list of format specific options in a
name=value format. Use ``-o help`` for an overview of the options supported
by the used format or see the format descriptions below for details.

*SNAPSHOT_PARAM* is param used for internal snapshot, format is
'snapshot.id=[ID],snapshot.name=[NAME]' or '[ID_OR_NAME]'.

..
  Note the use of a new 'program'; otherwise Sphinx complains about
  the -h option appearing both in the above option list and this one.

.. program:: qemu-img-common-opts

.. option:: --object OBJECTDEF

  is a QEMU user creatable object definition. See the :manpage:`qemu(1)`
  manual page for a description of the object properties. The most common
  object type is a ``secret``, which is used to supply passwords and/or
  encryption keys.

.. option:: --image-opts

  Indicates that the source *FILENAME* parameter is to be interpreted as a
  full option string, not a plain filename. This parameter is mutually
  exclusive with the *-f* parameter.

.. option:: --target-image-opts

  Indicates that the OUTPUT_FILENAME parameter(s) are to be interpreted as
  a full option string, not a plain filename. This parameter is mutually
  exclusive with the *-O* parameters. It is currently required to also use
  the *-n* parameter to skip image creation. This restriction may be relaxed
  in a future release.

.. option:: --force-share (-U)

  If specified, ``qemu-img`` will open the image in shared mode, allowing
  other QEMU processes to open it in write mode. For example, this can be used to
  get the image information (with 'info' subcommand) when the image is used by a
  running guest.  Note that this could produce inconsistent results because of
  concurrent metadata changes, etc. This option is only allowed when opening
  images in read-only mode.

.. option:: --backing-chain

  Will enumerate information about backing files in a disk image chain. Refer
  below for further description.

.. option:: -c

  Indicates that target image must be compressed (qcow format only).

.. option:: -h

  With or without a command, shows help and lists the supported formats.

.. option:: -p

  Display progress bar (compare, convert and rebase commands only).
  If the *-p* option is not used for a command that supports it, the
  progress is reported when the process receives a ``SIGUSR1`` or
  ``SIGINFO`` signal.

.. option:: -q

  Quiet mode - do not print any output (except errors). There's no progress bar
  in case both *-q* and *-p* options are used.

.. option:: -S SIZE

  Indicates the consecutive number of bytes that must contain only zeros
  for ``qemu-img`` to create a sparse image during conversion. This value is
  rounded down to the nearest 512 bytes. You may use the common size suffixes
  like ``k`` for kilobytes.

.. option:: -t CACHE

  Specifies the cache mode that should be used with the (destination) file. See
  the documentation of the emulator's ``-drive cache=...`` option for allowed
  values.

.. option:: -T SRC_CACHE

  Specifies the cache mode that should be used with the source file(s). See
  the documentation of the emulator's ``-drive cache=...`` option for allowed
  values.

Parameters to compare subcommand:

.. program:: qemu-img-compare

.. option:: -f

  First image format

.. option:: -F

  Second image format

.. option:: -s

  Strict mode - fail on different image size or sector allocation

Parameters to convert subcommand:

.. program:: qemu-img-convert

.. option:: --bitmaps

  Additionally copy all persistent bitmaps from the top layer of the source

.. option:: -n

  Skip the creation of the target volume

.. option:: -m

  Number of parallel coroutines for the convert process

.. option:: -W

  Allow out-of-order writes to the destination. This option improves performance,
  but is only recommended for preallocated devices like host devices or other
  raw block devices.

.. option:: -C

  Try to use copy offloading to move data from source image to target. This may
  improve performance if the data is remote, such as with NFS or iSCSI backends,
  but will not automatically sparsify zero sectors, and may result in a fully
  allocated target image depending on the host support for getting allocation
  information.

.. option:: -r

   Rate limit for the convert process

.. option:: --salvage

  Try to ignore I/O errors when reading.  Unless in quiet mode (``-q``), errors
  will still be printed.  Areas that cannot be read from the source will be
  treated as containing only zeroes.

.. option:: --target-is-zero

  Assume that reading the destination image will always return
  zeros. This parameter is mutually exclusive with a destination image
  that has a backing file. It is required to also use the ``-n``
  parameter to skip image creation.

Parameters to dd subcommand:

.. program:: qemu-img-dd

.. option:: bs=BLOCK_SIZE

  Defines the block size

.. option:: count=BLOCKS

  Sets the number of input blocks to copy

.. option:: if=INPUT

  Sets the input file

.. option:: of=OUTPUT

  Sets the output file

.. option:: skip=BLOCKS

  Sets the number of input blocks to skip

Parameters to snapshot subcommand:

.. program:: qemu-img-snapshot

.. option:: snapshot

  Is the name of the snapshot to create, apply or delete

.. option:: -a

  Applies a snapshot (revert disk to saved state)

.. option:: -c

  Creates a snapshot

.. option:: -d

  Deletes a snapshot

.. option:: -l

  Lists all snapshots in the given image

Command description:

.. program:: qemu-img-commands

.. option:: amend [--object OBJECTDEF] [--image-opts] [-p] [-q] [-f FMT] [-t CACHE] [--force] -o OPTIONS FILENAME

  Amends the image format specific *OPTIONS* for the image file
  *FILENAME*. Not all file formats support this operation.

  The set of options that can be amended are dependent on the image
  format, but note that amending the backing chain relationship should
  instead be performed with ``qemu-img rebase``.

  --force allows some unsafe operations. Currently for -f luks, it allows to
  erase the last encryption key, and to overwrite an active encryption key.

.. option:: bench [-c COUNT] [-d DEPTH] [-f FMT] [--flush-interval=FLUSH_INTERVAL] [-i AIO] [-n] [--no-drain] [-o OFFSET] [--pattern=PATTERN] [-q] [-s BUFFER_SIZE] [-S STEP_SIZE] [-t CACHE] [-w] [-U] FILENAME

  Run a simple sequential I/O benchmark on the specified image. If ``-w`` is
  specified, a write test is performed, otherwise a read test is performed.

  A total number of *COUNT* I/O requests is performed, each *BUFFER_SIZE*
  bytes in size, and with *DEPTH* requests in parallel. The first request
  starts at the position given by *OFFSET*, each following request increases
  the current position by *STEP_SIZE*. If *STEP_SIZE* is not given,
  *BUFFER_SIZE* is used for its value.

  If *FLUSH_INTERVAL* is specified for a write test, the request queue is
  drained and a flush is issued before new writes are made whenever the number of
  remaining requests is a multiple of *FLUSH_INTERVAL*. If additionally
  ``--no-drain`` is specified, a flush is issued without draining the request
  queue first.

  if ``-i`` is specified, *AIO* option can be used to specify different
  AIO backends: ``threads``, ``native`` or ``io_uring``.

  If ``-n`` is specified, the native AIO backend is used if possible. On
  Linux, this option only works if ``-t none`` or ``-t directsync`` is
  specified as well.

  For write tests, by default a buffer filled with zeros is written. This can be
  overridden with a pattern byte specified by *PATTERN*.

.. option:: bitmap (--merge SOURCE | --add | --remove | --clear | --enable | --disable)... [-b SOURCE_FILE [-F SOURCE_FMT]] [-g GRANULARITY] [--object OBJECTDEF] [--image-opts | -f FMT] FILENAME BITMAP

  Perform one or more modifications of the persistent bitmap *BITMAP*
  in the disk image *FILENAME*.  The various modifications are:

  ``--add`` to create *BITMAP*, enabled to record future edits.

  ``--remove`` to remove *BITMAP*.

  ``--clear`` to clear *BITMAP*.

  ``--enable`` to change *BITMAP* to start recording future edits.

  ``--disable`` to change *BITMAP* to stop recording future edits.

  ``--merge`` to merge the contents of the *SOURCE* bitmap into *BITMAP*.

  Additional options include ``-g`` which sets a non-default
  *GRANULARITY* for ``--add``, and ``-b`` and ``-F`` which select an
  alternative source file for all *SOURCE* bitmaps used by
  ``--merge``.

  To see what bitmaps are present in an image, use ``qemu-img info``.

.. option:: check [--object OBJECTDEF] [--image-opts] [-q] [-f FMT] [--output=OFMT] [-r [leaks | all]] [-T SRC_CACHE] [-U] FILENAME

  Perform a consistency check on the disk image *FILENAME*. The command can
  output in the format *OFMT* which is either ``human`` or ``json``.
  The JSON output is an object of QAPI type ``ImageCheck``.

  If ``-r`` is specified, qemu-img tries to repair any inconsistencies found
  during the check. ``-r leaks`` repairs only cluster leaks, whereas
  ``-r all`` fixes all kinds of errors, with a higher risk of choosing the
  wrong fix or hiding corruption that has already occurred.

  Only the formats ``qcow2``, ``qed``, ``parallels``, ``vhdx``, ``vmdk`` and
  ``vdi`` support consistency checks.

  In case the image does not have any inconsistencies, check exits with ``0``.
  Other exit codes indicate the kind of inconsistency found or if another error
  occurred. The following table summarizes all exit codes of the check subcommand:

  0
    Check completed, the image is (now) consistent
  1
    Check not completed because of internal errors
  2
    Check completed, image is corrupted
  3
    Check completed, image has leaked clusters, but is not corrupted
  63
    Checks are not supported by the image format

  If ``-r`` is specified, exit codes representing the image state refer to the
  state after (the attempt at) repairing it. That is, a successful ``-r all``
  will yield the exit code 0, independently of the image state before.

.. option:: commit [--object OBJECTDEF] [--image-opts] [-q] [-f FMT] [-t CACHE] [-b BASE] [-r RATE_LIMIT] [-d] [-p] FILENAME

  Commit the changes recorded in *FILENAME* in its base image or backing file.
  If the backing file is smaller than the snapshot, then the backing file will be
  resized to be the same size as the snapshot.  If the snapshot is smaller than
  the backing file, the backing file will not be truncated.  If you want the
  backing file to match the size of the smaller snapshot, you can safely truncate
  it yourself once the commit operation successfully completes.

  The image *FILENAME* is emptied after the operation has succeeded. If you do
  not need *FILENAME* afterwards and intend to drop it, you may skip emptying
  *FILENAME* by specifying the ``-d`` flag.

  If the backing chain of the given image file *FILENAME* has more than one
  layer, the backing file into which the changes will be committed may be
  specified as *BASE* (which has to be part of *FILENAME*'s backing
  chain). If *BASE* is not specified, the immediate backing file of the top
  image (which is *FILENAME*) will be used. Note that after a commit operation
  all images between *BASE* and the top image will be invalid and may return
  garbage data when read. For this reason, ``-b`` implies ``-d`` (so that
  the top image stays valid).

  The rate limit for the commit process is specified by ``-r``.

.. option:: compare [--object OBJECTDEF] [--image-opts] [-f FMT] [-F FMT] [-T SRC_CACHE] [-p] [-q] [-s] [-U] FILENAME1 FILENAME2

  Check if two images have the same content. You can compare images with
  different format or settings.

  The format is probed unless you specify it by ``-f`` (used for
  *FILENAME1*) and/or ``-F`` (used for *FILENAME2*) option.

  By default, images with different size are considered identical if the larger
  image contains only unallocated and/or zeroed sectors in the area after the end
  of the other image. In addition, if any sector is not allocated in one image
  and contains only zero bytes in the second one, it is evaluated as equal. You
  can use Strict mode by specifying the ``-s`` option. When compare runs in
  Strict mode, it fails in case image size differs or a sector is allocated in
  one image and is not allocated in the second one.

  By default, compare prints out a result message. This message displays
  information that both images are same or the position of the first different
  byte. In addition, result message can report different image size in case
  Strict mode is used.

  Compare exits with ``0`` in case the images are equal and with ``1``
  in case the images differ. Other exit codes mean an error occurred during
  execution and standard error output should contain an error message.
  The following table sumarizes all exit codes of the compare subcommand:

  0
    Images are identical (or requested help was printed)
  1
    Images differ
  2
    Error on opening an image
  3
    Error on checking a sector allocation
  4
    Error on reading data

.. option:: convert [--object OBJECTDEF] [--image-opts] [--target-image-opts] [--target-is-zero] [--bitmaps [--skip-broken-bitmaps]] [-U] [-C] [-c] [-p] [-q] [-n] [-f FMT] [-t CACHE] [-T SRC_CACHE] [-O OUTPUT_FMT] [-B BACKING_FILE [-F BACKING_FMT]] [-o OPTIONS] [-l SNAPSHOT_PARAM] [-S SPARSE_SIZE] [-r RATE_LIMIT] [-m NUM_COROUTINES] [-W] FILENAME [FILENAME2 [...]] OUTPUT_FILENAME

  Convert the disk image *FILENAME* or a snapshot *SNAPSHOT_PARAM*
  to disk image *OUTPUT_FILENAME* using format *OUTPUT_FMT*. It can
  be optionally compressed (``-c`` option) or use any format specific
  options like encryption (``-o`` option).

  Only the formats ``qcow`` and ``qcow2`` support compression. The
  compression is read-only. It means that if a compressed sector is
  rewritten, then it is rewritten as uncompressed data.

  Image conversion is also useful to get smaller image when using a
  growable format such as ``qcow``: the empty sectors are detected and
  suppressed from the destination image.

  *SPARSE_SIZE* indicates the consecutive number of bytes (defaults to 4k)
  that must contain only zeros for ``qemu-img`` to create a sparse image during
  conversion. If *SPARSE_SIZE* is 0, the source will not be scanned for
  unallocated or zero sectors, and the destination image will always be
  fully allocated.

  You can use the *BACKING_FILE* option to force the output image to be
  created as a copy on write image of the specified base image; the
  *BACKING_FILE* should have the same content as the input's base image,
  however the path, image format (as given by *BACKING_FMT*), etc may differ.

  If a relative path name is given, the backing file is looked up relative to
  the directory containing *OUTPUT_FILENAME*.

  If the ``-n`` option is specified, the target volume creation will be
  skipped. This is useful for formats such as ``rbd`` if the target
  volume has already been created with site specific options that cannot
  be supplied through ``qemu-img``.

  Out of order writes can be enabled with ``-W`` to improve performance.
  This is only recommended for preallocated devices like host devices or other
  raw block devices. Out of order write does not work in combination with
  creating compressed images.

  *NUM_COROUTINES* specifies how many coroutines work in parallel during
  the convert process (defaults to 8).

  Use of ``--bitmaps`` requests that any persistent bitmaps present in
  the original are also copied to the destination.  If any bitmap is
  inconsistent in the source, the conversion will fail unless
  ``--skip-broken-bitmaps`` is also specified to copy only the
  consistent bitmaps.

.. option:: create [--object OBJECTDEF] [-q] [-f FMT] [-b BACKING_FILE [-F BACKING_FMT]] [-u] [-o OPTIONS] FILENAME [SIZE]

  Create the new disk image *FILENAME* of size *SIZE* and format
  *FMT*. Depending on the file format, you can add one or more *OPTIONS*
  that enable additional features of this format.

  If the option *BACKING_FILE* is specified, then the image will record
  only the differences from *BACKING_FILE*. No size needs to be specified in
  this case. *BACKING_FILE* will never be modified unless you use the
  ``commit`` monitor command (or ``qemu-img commit``).

  If a relative path name is given, the backing file is looked up relative to
  the directory containing *FILENAME*.

  Note that a given backing file will be opened to check that it is valid. Use
  the ``-u`` option to enable unsafe backing file mode, which means that the
  image will be created even if the associated backing file cannot be opened. A
  matching backing file must be created or additional options be used to make the
  backing file specification valid when you want to use an image created this
  way.

  The size can also be specified using the *SIZE* option with ``-o``,
  it doesn't need to be specified separately in this case.


.. option:: dd [--image-opts] [-U] [-f FMT] [-O OUTPUT_FMT] [bs=BLOCK_SIZE] [count=BLOCKS] [skip=BLOCKS] if=INPUT of=OUTPUT

  dd copies from *INPUT* file to *OUTPUT* file converting it from
  *FMT* format to *OUTPUT_FMT* format.

  The data is by default read and written using blocks of 512 bytes but can be
  modified by specifying *BLOCK_SIZE*. If count=\ *BLOCKS* is specified
  dd will stop reading input after reading *BLOCKS* input blocks.

  The size syntax is similar to :manpage:`dd(1)`'s size syntax.

.. option:: info [--object OBJECTDEF] [--image-opts] [-f FMT] [--output=OFMT] [--backing-chain] [-U] FILENAME

  Give information about the disk image *FILENAME*. Use it in
  particular to know the size reserved on disk which can be different
  from the displayed size. If VM snapshots are stored in the disk image,
  they are displayed too.

  If a disk image has a backing file chain, information about each disk image in
  the chain can be recursively enumerated by using the option ``--backing-chain``.

  For instance, if you have an image chain like:

  ::

    base.qcow2 <- snap1.qcow2 <- snap2.qcow2

  To enumerate information about each disk image in the above chain, starting from top to base, do:

  ::

    qemu-img info --backing-chain snap2.qcow2

  The command can output in the format *OFMT* which is either ``human`` or
  ``json``.  The JSON output is an object of QAPI type ``ImageInfo``; with
  ``--backing-chain``, it is an array of ``ImageInfo`` objects.

  ``--output=human`` reports the following information (for every image in the
  chain):

  *image*
    The image file name

  *file format*
    The image format

  *virtual size*
    The size of the guest disk

  *disk size*
    How much space the image file occupies on the host file system (may be
    shown as 0 if this information is unavailable, e.g. because there is no
    file system)

  *cluster_size*
    Cluster size of the image format, if applicable

  *encrypted*
    Whether the image is encrypted (only present if so)

  *cleanly shut down*
    This is shown as ``no`` if the image is dirty and will have to be
    auto-repaired the next time it is opened in qemu.

  *backing file*
    The backing file name, if present

  *backing file format*
    The format of the backing file, if the image enforces it

  *Snapshot list*
    A list of all internal snapshots

  *Format specific information*
    Further information whose structure depends on the image format.  This
    section is a textual representation of the respective
    ``ImageInfoSpecific*`` QAPI object (e.g. ``ImageInfoSpecificQCow2``
    for qcow2 images).

.. option:: map [--object OBJECTDEF] [--image-opts] [-f FMT] [--start-offset=OFFSET] [--max-length=LEN] [--output=OFMT] [-U] FILENAME

  Dump the metadata of image *FILENAME* and its backing file chain.
  In particular, this commands dumps the allocation state of every sector
  of *FILENAME*, together with the topmost file that allocates it in
  the backing file chain.

  Two option formats are possible.  The default format (``human``)
  only dumps known-nonzero areas of the file.  Known-zero parts of the
  file are omitted altogether, and likewise for parts that are not allocated
  throughout the chain.  ``qemu-img`` output will identify a file
  from where the data can be read, and the offset in the file.  Each line
  will include four fields, the first three of which are hexadecimal
  numbers.  For example the first line of:

  ::

    Offset          Length          Mapped to       File
    0               0x20000         0x50000         /tmp/overlay.qcow2
    0x100000        0x10000         0x95380000      /tmp/backing.qcow2

  means that 0x20000 (131072) bytes starting at offset 0 in the image are
  available in /tmp/overlay.qcow2 (opened in ``raw`` format) starting
  at offset 0x50000 (327680).  Data that is compressed, encrypted, or
  otherwise not available in raw format will cause an error if ``human``
  format is in use.  Note that file names can include newlines, thus it is
  not safe to parse this output format in scripts.

  The alternative format ``json`` will return an array of dictionaries
  in JSON format.  It will include similar information in
  the ``start``, ``length``, ``offset`` fields;
  it will also include other more specific information:

  - boolean field ``data``: true if the sectors contain actual data,
    false if the sectors are either unallocated or stored as optimized
    all-zero clusters
  - boolean field ``zero``: true if the data is known to read as zero
  - boolean field ``present``: true if the data belongs to the backing
    chain, false if rebasing the backing chain onto a deeper file
    would pick up data from the deeper file;
  - integer field ``depth``: the depth within the backing chain at
    which the data was resolved; for example, a depth of 2 refers to
    the backing file of the backing file of *FILENAME*.

  In JSON format, the ``offset`` field is optional; it is absent in
  cases where ``human`` format would omit the entry or exit with an error.
  If ``data`` is false and the ``offset`` field is present, the
  corresponding sectors in the file are not yet in use, but they are
  preallocated.

  For more information, consult ``include/block/block.h`` in QEMU's
  source code.

.. option:: measure [--output=OFMT] [-O OUTPUT_FMT] [-o OPTIONS] [--size N | [--object OBJECTDEF] [--image-opts] [-f FMT] [-l SNAPSHOT_PARAM] FILENAME]

  Calculate the file size required for a new image.  This information
  can be used to size logical volumes or SAN LUNs appropriately for
  the image that will be placed in them.  The values reported are
  guaranteed to be large enough to fit the image.  The command can
  output in the format *OFMT* which is either ``human`` or ``json``.
  The JSON output is an object of QAPI type ``BlockMeasureInfo``.

  If the size *N* is given then act as if creating a new empty image file
  using ``qemu-img create``.  If *FILENAME* is given then act as if
  converting an existing image file using ``qemu-img convert``.  The format
  of the new file is given by *OUTPUT_FMT* while the format of an existing
  file is given by *FMT*.

  A snapshot in an existing image can be specified using *SNAPSHOT_PARAM*.

  The following fields are reported:

  ::

    required size: 524288
    fully allocated size: 1074069504
    bitmaps size: 0

  The ``required size`` is the file size of the new image.  It may be smaller
  than the virtual disk size if the image format supports compact representation.

  The ``fully allocated size`` is the file size of the new image once data has
  been written to all sectors.  This is the maximum size that the image file can
  occupy with the exception of internal snapshots, dirty bitmaps, vmstate data,
  and other advanced image format features.

  The ``bitmaps size`` is the additional size required in order to
  copy bitmaps from a source image in addition to the guest-visible
  data; the line is omitted if either source or destination lacks
  bitmap support, or 0 if bitmaps are supported but there is nothing
  to copy.

.. option:: snapshot [--object OBJECTDEF] [--image-opts] [-U] [-q] [-l | -a SNAPSHOT | -c SNAPSHOT | -d SNAPSHOT] FILENAME

  List, apply, create or delete snapshots in image *FILENAME*.

.. option:: rebase [--object OBJECTDEF] [--image-opts] [-U] [-q] [-f FMT] [-t CACHE] [-T SRC_CACHE] [-p] [-u] -b BACKING_FILE [-F BACKING_FMT] FILENAME

  Changes the backing file of an image. Only the formats ``qcow2`` and
  ``qed`` support changing the backing file.

  The backing file is changed to *BACKING_FILE* and (if the image format of
  *FILENAME* supports this) the backing file format is changed to
  *BACKING_FMT*. If *BACKING_FILE* is specified as "" (the empty
  string), then the image is rebased onto no backing file (i.e. it will exist
  independently of any backing file).

  If a relative path name is given, the backing file is looked up relative to
  the directory containing *FILENAME*.

  *CACHE* specifies the cache mode to be used for *FILENAME*, whereas
  *SRC_CACHE* specifies the cache mode for reading backing files.

  There are two different modes in which ``rebase`` can operate:

  Safe mode
    This is the default mode and performs a real rebase operation. The
    new backing file may differ from the old one and ``qemu-img rebase``
    will take care of keeping the guest-visible content of *FILENAME*
    unchanged.

    In order to achieve this, any clusters that differ between
    *BACKING_FILE* and the old backing file of *FILENAME* are merged
    into *FILENAME* before actually changing the backing file.

    Note that the safe mode is an expensive operation, comparable to
    converting an image. It only works if the old backing file still
    exists.

  Unsafe mode
    ``qemu-img`` uses the unsafe mode if ``-u`` is specified. In this
    mode, only the backing file name and format of *FILENAME* is changed
    without any checks on the file contents. The user must take care of
    specifying the correct new backing file, or the guest-visible
    content of the image will be corrupted.

    This mode is useful for renaming or moving the backing file to
    somewhere else.  It can be used without an accessible old backing
    file, i.e. you can use it to fix an image whose backing file has
    already been moved/renamed.

  You can use ``rebase`` to perform a "diff" operation on two
  disk images.  This can be useful when you have copied or cloned
  a guest, and you want to get back to a thin image on top of a
  template or base image.

  Say that ``base.img`` has been cloned as ``modified.img`` by
  copying it, and that the ``modified.img`` guest has run so there
  are now some changes compared to ``base.img``.  To construct a thin
  image called ``diff.qcow2`` that contains just the differences, do:

  ::

    qemu-img create -f qcow2 -b modified.img diff.qcow2
    qemu-img rebase -b base.img diff.qcow2

  At this point, ``modified.img`` can be discarded, since
  ``base.img + diff.qcow2`` contains the same information.

.. option:: resize [--object OBJECTDEF] [--image-opts] [-f FMT] [--preallocation=PREALLOC] [-q] [--shrink] FILENAME [+ | -]SIZE

  Change the disk image as if it had been created with *SIZE*.

  Before using this command to shrink a disk image, you MUST use file system and
  partitioning tools inside the VM to reduce allocated file systems and partition
  sizes accordingly.  Failure to do so will result in data loss!

  When shrinking images, the ``--shrink`` option must be given. This informs
  ``qemu-img`` that the user acknowledges all loss of data beyond the truncated
  image's end.

  After using this command to grow a disk image, you must use file system and
  partitioning tools inside the VM to actually begin using the new space on the
  device.

  When growing an image, the ``--preallocation`` option may be used to specify
  how the additional image area should be allocated on the host.  See the format
  description in the :ref:`notes` section which values are allowed.  Using this
  option may result in slightly more data being allocated than necessary.

.. _notes:

Notes
-----

Supported image file formats:

``raw``

  Raw disk image format (default). This format has the advantage of
  being simple and easily exportable to all other emulators. If your
  file system supports *holes* (for example in ext2 or ext3 on
  Linux or NTFS on Windows), then only the written sectors will reserve
  space. Use ``qemu-img info`` to know the real size used by the
  image or ``ls -ls`` on Unix/Linux.

  Supported options:

  ``preallocation``
    Preallocation mode (allowed values: ``off``, ``falloc``,
    ``full``).  ``falloc`` mode preallocates space for image by
    calling ``posix_fallocate()``.  ``full`` mode preallocates space
    for image by writing data to underlying storage.  This data may or
    may not be zero, depending on the storage location.

``qcow2``

  QEMU image format, the most versatile format. Use it to have smaller
  images (useful if your filesystem does not supports holes, for example
  on Windows), optional AES encryption, zlib based compression and
  support of multiple VM snapshots.

  Supported options:

  ``compat``
    Determines the qcow2 version to use. ``compat=0.10`` uses the
    traditional image format that can be read by any QEMU since 0.10.
    ``compat=1.1`` enables image format extensions that only QEMU 1.1 and
    newer understand (this is the default). Amongst others, this includes zero
    clusters, which allow efficient copy-on-read for sparse images.

  ``backing_file``
    File name of a base image (see ``create`` subcommand)

  ``backing_fmt``
    Image format of the base image

  ``encryption``
    If this option is set to ``on``, the image is encrypted with
    128-bit AES-CBC.

    The use of encryption in qcow and qcow2 images is considered to be
    flawed by modern cryptography standards, suffering from a number
    of design problems:

    - The AES-CBC cipher is used with predictable initialization
      vectors based on the sector number. This makes it vulnerable to
      chosen plaintext attacks which can reveal the existence of
      encrypted data.

    - The user passphrase is directly used as the encryption key. A
      poorly chosen or short passphrase will compromise the security
      of the encryption.

    - In the event of the passphrase being compromised there is no way
      to change the passphrase to protect data in any qcow images. The
      files must be cloned, using a different encryption passphrase in
      the new file. The original file must then be securely erased
      using a program like shred, though even this is ineffective with
      many modern storage technologies.

    - Initialization vectors used to encrypt sectors are based on the
      guest virtual sector number, instead of the host physical
      sector. When a disk image has multiple internal snapshots this
      means that data in multiple physical sectors is encrypted with
      the same initialization vector. With the CBC mode, this opens
      the possibility of watermarking attacks if the attack can
      collect multiple sectors encrypted with the same IV and some
      predictable data. Having multiple qcow2 images with the same
      passphrase also exposes this weakness since the passphrase is
      directly used as the key.

    Use of qcow / qcow2 encryption is thus strongly discouraged. Users are
    recommended to use an alternative encryption technology such as the
    Linux dm-crypt / LUKS system.

  ``cluster_size``
    Changes the qcow2 cluster size (must be between 512 and
    2M). Smaller cluster sizes can improve the image file size whereas
    larger cluster sizes generally provide better performance.

  ``preallocation``
    Preallocation mode (allowed values: ``off``, ``metadata``,
    ``falloc``, ``full``). An image with preallocated metadata is
    initially larger but can improve performance when the image needs
    to grow. ``falloc`` and ``full`` preallocations are like the same
    options of ``raw`` format, but sets up metadata also.

  ``lazy_refcounts``
    If this option is set to ``on``, reference count updates are
    postponed with the goal of avoiding metadata I/O and improving
    performance. This is particularly interesting with
    ``cache=writethrough`` which doesn't batch metadata
    updates. The tradeoff is that after a host crash, the reference
    count tables must be rebuilt, i.e. on the next open an (automatic)
    ``qemu-img check -r all`` is required, which may take some time.

    This option can only be enabled if ``compat=1.1`` is specified.

  ``nocow``
    If this option is set to ``on``, it will turn off COW of the file. It's
    only valid on btrfs, no effect on other file systems.

    Btrfs has low performance when hosting a VM image file, even more
    when the guest on the VM also using btrfs as file system. Turning
    off COW is a way to mitigate this bad performance. Generally there
    are two ways to turn off COW on btrfs:

    - Disable it by mounting with nodatacow, then all newly created files
      will be NOCOW
    - For an empty file, add the NOCOW file attribute. That's what this
      option does.

    Note: this option is only valid to new or empty files. If there is
    an existing file which is COW and has data blocks already, it
    couldn't be changed to NOCOW by setting ``nocow=on``. One can
    issue ``lsattr filename`` to check if the NOCOW flag is set or not
    (Capital 'C' is NOCOW flag).

  ``data_file``
    Filename where all guest data will be stored. If this option is used,
    the qcow2 file will only contain the image's metadata.

    Note: Data loss will occur if the given filename already exists when
    using this option with ``qemu-img create`` since ``qemu-img`` will create
    the data file anew, overwriting the file's original contents. To simply
    update the reference to point to the given pre-existing file, use
    ``qemu-img amend``.

  ``data_file_raw``
    If this option is set to ``on``, QEMU will always keep the external data
    file consistent as a standalone read-only raw image.

    It does this by forwarding all write accesses to the qcow2 file through to
    the raw data file, including their offsets. Therefore, data that is visible
    on the qcow2 node (i.e., to the guest) at some offset is visible at the same
    offset in the raw data file. This results in a read-only raw image. Writes
    that bypass the qcow2 metadata may corrupt the qcow2 metadata because the
    out-of-band writes may result in the metadata falling out of sync with the
    raw image.

    If this option is ``off``, QEMU will use the data file to store data in an
    arbitrary manner. The file’s content will not make sense without the
    accompanying qcow2 metadata. Where data is written will have no relation to
    its offset as seen by the guest, and some writes (specifically zero writes)
    may not be forwarded to the data file at all, but will only be handled by
    modifying qcow2 metadata.

    This option can only be enabled if ``data_file`` is set.

``Other``

  QEMU also supports various other image file formats for
  compatibility with older QEMU versions or other hypervisors,
  including VMDK, VDI, VHD (vpc), VHDX, qcow1 and QED. For a full list
  of supported formats see ``qemu-img --help``.  For a more detailed
  description of these formats, see the QEMU block drivers reference
  documentation.

  The main purpose of the block drivers for these formats is image
  conversion.  For running VMs, it is recommended to convert the disk
  images to either raw or qcow2 in order to achieve good performance.
