= License =

Copyright (c) 2015-2017, Virtuozzo, Inc.
Authors:
        2015 Denis Lunev <den@openvz.org>
        2015 Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
        2016-2017 Klim Kireev <klim.kireev@virtuozzo.com>
        2016-2017 Edgar Kaziakhmedov <edgar.kaziakhmedov@virtuozzo.com>

This work is licensed under the terms of the GNU GPL, version 2 or later.
See the COPYING file in the top-level directory.

This specification contains minimal information about Parallels Disk Format,
which is enough to proper work with QEMU. Nevertheless, Parallels Cloud Server
and Parallels Desktop are able to add some unspecified nodes to xml and use
them, but they are for internal work and don't affect functionality. Also it
uses auxiliary xml "Snapshot.xml", which allows to store optional snapshot
information, but it doesn't influence open/read/write functionality. QEMU and
other software should not use fields not covered in this document and
Snapshot.xml file and must leave them as is.

= Parallels Disk Format =

Parallels disk consists of two parts: the set of snapshots and the disk
descriptor file, which stores information about all files and snapshots.

== Definitions ==
    Snapshot       a record of the contents captured at a particular time,
                   capable of storing current state. A snapshot has UUID and
                   parent UUID.

 Snapshot image    an overlay representing the difference between this
                   snapshot and some earlier snapshot.

    Overlay        an image storing the different sectors between two captured
                   states.

   Root image      snapshot image with no parent, the root of snapshot tree.

    Storage        the backing storage for a subset of the virtual disk. When
                   there is more than one storage in a Parallels disk then that
                   is referred to as a split image. In this case every storage
                   covers specific address space area of the disk and has its
                   particular root image. Split images are not considered here
                   and are not supported. Each storage consists of disk
                   parameters and a list of images. The list of images always
                   contains a root image and may also contain overlays. The
                   root image can be an expandable Parallels image file or
                   plain. Overlays must be expandable.

  Description      DiskDescriptor.xml stores information about disk parameters,
     file          snapshots, storages.

     Top           The overlay between actual state and some previous snapshot.
   Snapshot        It is not a snapshot in the classical sense because it
                   serves as the active image that the guest writes to.

    Sector         a 512-byte data chunk.

== Description file ==
All information is placed in a single XML element Parallels_disk_image.
The element has only one attribute "Version", that must be 1.0.
Schema of DiskDescriptor.xml:

<Parallels_disk_image Version="1.0">
    <Disk_Parameters>
        ...
    </Disk_Parameters>
    <StorageData>
        ...
    </StorageData>
    <Snapshots>
        ...
    </Snapshots>
</Parallels_disk_image>

== Disk_Parameters element ==
The Disk_Parameters element describes the physical layout of the virtual disk
and some general settings.

The Disk_Parameters element MUST contain the following child elements:
    * Disk_size - number of sectors in the disk,
                  desired size of the disk.
    * Cylinders - number of the disk cylinders.
    * Heads     - number of the disk heads.
    * Sectors   - number of the disk sectors per cylinder
                  (sector size is 512 bytes)
                  Limitation: Product of the Heads, Sectors and Cylinders
                  values MUST be equal to the value of the Disk_size parameter.
    * Padding   - must be 0. Parallels Cloud Server and Parallels Desktop may
                  use padding set to 1, however this case is not covered
                  by this spec, QEMU and other software should not open
                  such disks and should not create them.

== StorageData element ==
This element of the file describes the root image and all snapshot images.

The StorageData element consists of the Storage child element, as shown below:
<StorageData>
    <Storage>
        ...
    </Storage>
</StorageData>

A Storage element has following child elements:
    * Start     - start sector of the storage, in case of non split storage
                  equals to 0.
    * End       - number of sector following the last sector, in case of non
                  split storage equals to Disk_size.
    * Blocksize - storage cluster size, number of sectors per one cluster.
                  Cluster size for each "Compressed" (see below) image in
                  parallels disk must be equal to this field. Note: cluster
                  size for Parallels Expandable Image is in 'tracks' field of
                  its header (see docs/interop/parallels.txt).
    * Several Image child elements.

Each Image element has following child elements:
    * GUID - image identifier, UUID in curly brackets.
             For instance, {12345678-9abc-def1-2345-6789abcdef12}.
             The GUID is used by the Snapshots element to reference images
             (see below)
    * Type - image type of the element. It can be:
             "Plain" for raw files.
             "Compressed" for expanding disks.
    * File - path to image file. Path can be relative to DiskDecriptor.xml or
             absolute.

== Snapshots element ==
The Snapshots element describes the snapshot relations with the snapshot tree.

The element contains the set of Shot child elements, as shown below:
<Snapshots>
    <TopGUID> ... </TopGUID> /* Optional child element */
    <Shot>
        ...
    </Shot>
    <Shot>
        ...
    </Shot>
    ...
</Snapshots>

Each Shot element contains the following child elements:
    * GUID       - an image GUID.
    * ParentGUID - GUID of the image of the parent snapshot.

The software may traverse snapshots from child to parent using <ParentGUID>
field as reference. ParentGUID of root snapshot is
{00000000-0000-0000-0000-000000000000}. There should be only one root
snapshot. Top snapshot could be described via two ways: via TopGUID child
element of the Snapshots element or via predefined GUID
{5fbaabe3-6958-40ff-92a7-860e329aab41}. If TopGUID is defined, predefined GUID is
interpreted as usual GUID. All snapshot images (except Top Snapshot) should be
opened read-only. There is another predefined GUID,
BackupID = {704718e1-2314-44c8-9087-d78ed36b0f4e}, which is used by original and
some third-party software for backup, QEMU and other software may operate with
images with GUID = BackupID as usual, however, it is not recommended to use this
GUID for new disks. Top snapshot cannot have this GUID.
