| = 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 DiskDescriptor.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. |