= Virtual Machine Archive format (VMA) =

This format contains a header which includes the VM configuration as
binary blobs, and a list of devices (dev_id, name).

The actual VM image data is stored inside extents. An extent contains
up to 64 clusters, and start with a 512 byte header containing
additional information for those clusters.

We use a cluster size of 65536, and use 8 bytes for each
cluster in the header to store the following information:

* 1 byte dev_id (to identity the drive)
* 1 byte not used (reserved)
* 2 bytes zero indicator (mark zero regions (16x4096))
* 4 bytes cluster number

We only store non-zero blocks (such block is 4096 bytes).

Each archive is marked with a uuid. The archive header and all
extent headers includes that uuid and a MD5 checksum (over header
data).

All numbers in VMA archive are stored in Big Endian byte order.

== VMA Header ==

    Byte  0 -  3:   magic
                    VMA magic string ("VMA\x00")

	  4 -  7:   version
                    Version number (valid value is 1)

          8 - 23:   uuid
		    Unique ID, Same uuid is used to mark extents.

         24 - 31:   ctime
	      	    Backup time stamp (seconds since epoch)

         32 - 47:   md5sum
	      	    Header checksum (from byte 0 to header_size). This field
		    is filled with zero to generate the checksum.

         48 - 51:   blob_buffer_offset
	      	    Start of blob buffer (multiple of 512)

         52 - 55:   blob_buffer_size
	      	    Size of blob buffer (multiple of 512)

         56 - 59:   header_size
	      	    Overall size of this header (multiple of 512)

	 60 - 2043: reserved

       2044 - 3067: uint32_t config_names[256]
       	      	    Offsets into blob_buffer table

       3068 - 4091: uint32_t config_data[256]
       	      	    Offsets into blob_buffer table

       4092 - 4095: reserved

      4096 - 12287: VmaDeviceInfoHeader dev_info[256]
                    The offset in this table is used as 'dev_id' inside
		    the data streams.

      12288 - header_size: Blob buffer


=== Devive Info Header (VmaDeviceInfoHeader) ===

This is use to store details about the contained disk images.

    Byte  0 -  3:   devive name (offsets into blob_buffer table)

    	  4 -  7:   reserved

	  8 - 15:   device size in bytes

	 16 - 31:   reserved

Note: Devive name 'vmstate' is reserved to store VM RAM state.

=== Blob buffer ===

The blob buffer is used to store both configuration file names and
configuration data.

This region contain a list of binary data blobs. Each blob starts with
a 2 byte size field, followed by the actual data.

== Image Data Streams ==

The VMA header is followed by the image data stream. Image data is grouped
with extents, which contains up to 59 clusters from different images.

=== VMA Extent Header ===

    Byte  0 -  3:   magic
                    VMA extent magic string ("VMAE")

   	  4 -  5:   reserved

   	  6 -  7:   block_count
	      	    Overall number of contained 4K block

          8 - 23:   uuid
		    Unique ID, Same uuid as used in the VMA header.

         24 - 39:   md5sum
	      	    Header checksum (from byte 0 to header_size). This field
		    is filled with zero to generate the checksum.

        40 - 511:   blockinfo[59]


Each 'blockinfo' (8 bytes) give further details about contained clusters:

    Byte  0 - 1:   mask
   	      	   Bitmap used to indicate non-zero 4K blocks inside the
		   cluster.

              2:   reserved

              3:   dev_id
	           Device ID (offset into dev_info table)

          4 - 7:   cluster_num

The extend header if followed by the actual cluster data, where we only
store non-zero 4K blocks.

