qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Dushyant Bansal <cs5070214@cse.iitd.ac.in>
To: Kevin Wolf <kwolf@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] Add qcow2 documentation
Date: Wed, 09 Mar 2011 23:38:54 +0530	[thread overview]
Message-ID: <4D77C236.3020309@cse.iitd.ac.in> (raw)
In-Reply-To: <1299584839-5688-1-git-send-email-kwolf@redhat.com>

On Tuesday 08 March 2011 05:17 PM, Kevin Wolf wrote:
> This adds a description of the qcow2 file format to the docs/ directory.
> Besides documenting what's there, which is never wrong, the document should
> provide a good basis for the discussion of format extensions (called "qcow3"
> in previous discussions)
>
> Signed-off-by: Kevin Wolf<kwolf@redhat.com>
> ---
>   docs/specs/qcow2.txt |  228 ++++++++++++++++++++++++++++++++++++++++++++++++++
>   1 files changed, 228 insertions(+), 0 deletions(-)
>   create mode 100644 docs/specs/qcow2.txt
>
> diff --git a/docs/specs/qcow2.txt b/docs/specs/qcow2.txt
> new file mode 100644
> index 0000000..0e7bcda
> --- /dev/null
> +++ b/docs/specs/qcow2.txt
> @@ -0,0 +1,228 @@
> +== Clusters ==
> +
> +A qcow2 image file is organized in units of constant size, which are called
> +(host) clusters. A cluster is the unit in which all allocations are done,
> +both for actual guest data and for image metadata.
> +
> +Likewise, the virtual disk as seen by the guest is divided into (guest)
> +clusters of the same size.
> +
> +
> +== Header ==
> +
> +The first cluster of a qcow2 image contains the file header:
> +
> +    Byte  0 -  3:   magic
> +                    QCOW magic string ("QFI\xfb")
> +
> +          4 -  7:   version
> +                    Version number (only valid value is 2)
> +
> +          8 - 15:   backing_file_offset
> +                    Offset into the image file at which the backing file name
> +                    is stored (NB: The string is not null terminated). 0 if the
> +                    image doesn't have a backing file.
> +
> +         16 - 19:   backing_file_size
> +                    Length of the backing file name in bytes. Must not be
> +                    longer than 1023 bytes. Undefined if the image doesn't have
> +                    a backing file.
> +
> +         20 - 23:   cluster_bits
> +                    Number of bits that are used for addressing an offset
> +                    within a cluster (1<<  cluster_bits is the cluster size)
> +
> +         24 - 31:   size
> +                    Virtual disk size in bytes
> +
> +         32 - 35:   crypt_method
> +                    0 for no encryption
> +                    1 for AES encryption
> +
> +         36 - 39:   l1_size
> +                    Number of entries in the active L1 table
> +
> +         40 - 47:   l1_table_offset
> +                    Offset into the image file at which the active L1 table
> +                    starts. Must be aligned to a cluster boundary.
> +
> +         48 - 55:   refcount_table_offset
> +                    Offset into the image file at which the refcount table
> +                    starts. Must be aligned to a cluster boundary.
> +
> +         56 - 59:   refcount_table_clusters
> +                    Number of clusters that the refcount table occupies
> +
> +         60 - 63:   nb_snapshots
> +                    Number of snapshots contained in the image
> +
> +         64 - 71:   snapshots_offset
> +                    Offset into the image file at which the snapshot table
> +                    starts. Must be aligned to a cluster boundary.
> +
> +All numbers in qcow2 are stored in Big Endian byte order.
> +
> +
> +== Host cluster management ==
> +
> +qcow2 manages the allocation of host clusters by maintaining a reference count
> +for each host cluster. A refcount of 0 means that the cluster is free, 1 means
> +that it is used, and>= 2 means that it is used and any write access must
> +perform a COW (copy on write) operation.
> +
> +The refcounts are managed in a two-level table. The first level is called
> +refcount table and has a variable size (which is stored in the header). The
> +refcount table can cover multiple clusters, however it needs to be contiguous
> +in the image file.
> +
> +It contains pointers to the second level structures which are called refcount
> +blocks and are exactly one cluster in size.
> +
> +Given a offset into the image file, the refcount of its cluster can be obtained
> +as follows:
> +
> +    refcount_block_entries = (cluster_size / sizeof(uint16_t))
> +
> +    refcount_block_index = (offset / cluster_size) % refcount_table_entries
> +    refcount_table_index = (offset / cluster_size) / refcount_table_entries
> +
> +    refcount_block = load_cluster(refcount_table[refcount_table_index]);
> +    return refcount_block[refcount_block_index];
> +
> +Refcount table entry:
> +
> +    Bit  0 -  8:    Reserved (set to 0)
> +
> +         9 - 63:    Bits 9-63 of the offset into the image file at which the
> +                    refcount block starts. Must be aligned to a cluster
> +                    boundary.
> +
> +                    If this is 0, the corresponding refcount block has not yet
> +                    been allocated. All refcounts managed by this refcount block
> +                    are 0.
> +
> +Refcount block entry:
> +
> +    Bit  0 - 15:    Reference count of the cluster
> +
> +
> +== Cluster mapping ==
> +
> +Just as for refcounts, qcow2 uses a two-level structure for the mapping of
> +guest clusters to host clusters. They are called L1 and L2 table.
> +
> +The L1 table has a variable size (stored in the header) and may use multiple
> +clusters, however it must be contiguous in the image file. L2 tables are
> +exactly one cluster in size.
> +
> +Given a offset into the virtual disk, the offset into the image file can be
> +obtained as follows:
> +
> +    l2_entries = (cluster_size / sizeof(uint64_t))
> +
> +    l2_index = (offset / cluster_size) % l2_entries
> +    l1_index = (offset / cluster_size) / l2_entries
> +
> +    l2_table = load_cluster(l1_table[l1_index]);
> +    cluster_offset = refcount_block[l2_index];
>    
It should be cluster_offset = l2_table[l2_index];
Right?

--
Dushyant

  parent reply	other threads:[~2011-03-09 18:10 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-03-08 11:47 [Qemu-devel] [PATCH] Add qcow2 documentation Kevin Wolf
2011-03-08 13:13 ` Stefan Hajnoczi
2011-03-08 13:31   ` Kevin Wolf
2011-03-08 13:48     ` Stefan Hajnoczi
2011-03-09 18:08 ` Dushyant Bansal [this message]
2011-03-09 21:46   ` Stefan Hajnoczi
2011-03-10  8:12   ` Kevin Wolf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4D77C236.3020309@cse.iitd.ac.in \
    --to=cs5070214@cse.iitd.ac.in \
    --cc=kwolf@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).