| = License = |
| |
| Copyright (c) 2015 Denis Lunev |
| Copyright (c) 2015 Vladimir Sementsov-Ogievskiy |
| |
| This work is licensed under the terms of the GNU GPL, version 2 or later. |
| See the COPYING file in the top-level directory. |
| |
| = Parallels Expandable Image File Format = |
| |
| A Parallels expandable image file consists of three consecutive parts: |
| * header |
| * BAT |
| * data area |
| |
| All numbers in a Parallels expandable image are stored in little-endian byte |
| order. |
| |
| |
| == Definitions == |
| |
| Sector A 512-byte data chunk. |
| |
| Cluster A data chunk of the size specified in the image header. |
| Currently, the default size is 1MiB (2048 sectors). In previous |
| versions, cluster sizes of 63 sectors, 256 and 252 kilobytes were |
| used. |
| |
| BAT Block Allocation Table, an entity that contains information for |
| guest-to-host I/O data address translation. |
| |
| |
| == Header == |
| |
| The header is placed at the start of an image and contains the following |
| fields: |
| |
| Bytes: |
| 0 - 15: magic |
| Must contain "WithoutFreeSpace" or "WithouFreSpacExt". |
| |
| 16 - 19: version |
| Must be 2. |
| |
| 20 - 23: heads |
| Disk geometry parameter for guest. |
| |
| 24 - 27: cylinders |
| Disk geometry parameter for guest. |
| |
| 28 - 31: tracks |
| Cluster size, in sectors. |
| |
| 32 - 35: nb_bat_entries |
| Disk size, in clusters (BAT size). |
| |
| 36 - 43: nb_sectors |
| Disk size, in sectors. |
| |
| For "WithoutFreeSpace" images: |
| Only the lowest 4 bytes are used. The highest 4 bytes must be |
| cleared in this case. |
| |
| For "WithouFreSpacExt" images, there are no such |
| restrictions. |
| |
| 44 - 47: in_use |
| Set to 0x746F6E59 when the image is opened by software in R/W |
| mode; set to 0x312e3276 when the image is closed. |
| |
| A zero in this field means that the image was opened by an old |
| version of the software that doesn't support Format Extension |
| (see below). |
| |
| Other values are not allowed. |
| |
| 48 - 51: data_off |
| An offset, in sectors, from the start of the file to the start of |
| the data area. |
| |
| For "WithoutFreeSpace" images: |
| - If data_off is zero, the offset is calculated as the end of BAT |
| table plus some padding to ensure sector size alignment. |
| - If data_off is non-zero, the offset should be aligned to sector |
| size. However it is recommended to align it to cluster size for |
| newly created images. |
| |
| For "WithouFreSpacExt" images: |
| data_off must be non-zero and aligned to cluster size. |
| |
| 52 - 55: flags |
| Miscellaneous flags. |
| |
| Bit 0: Empty Image bit. If set, the image should be |
| considered clear. |
| |
| Bits 1-31: Unused. |
| |
| 56 - 63: ext_off |
| Format Extension offset, an offset, in sectors, from the start of |
| the file to the start of the Format Extension Cluster. |
| |
| ext_off must meet the same requirements as cluster offsets |
| defined by BAT entries (see below). |
| |
| |
| == BAT == |
| |
| BAT is placed immediately after the image header. In the file, BAT is a |
| contiguous array of 32-bit unsigned little-endian integers with |
| (bat_entries * 4) bytes size. |
| |
| Each BAT entry contains an offset from the start of the file to the |
| corresponding cluster. The offset set in clusters for "WithouFreSpacExt" images |
| and in sectors for "WithoutFreeSpace" images. |
| |
| If a BAT entry is zero, the corresponding cluster is not allocated and should |
| be considered as filled with zeroes. |
| |
| Cluster offsets specified by BAT entries must meet the following requirements: |
| - the value must not be lower than data offset (provided by header.data_off |
| or calculated as specified above), |
| - the value must be lower than the desired file size, |
| - the value must be unique among all BAT entries, |
| - the result of (cluster offset - data offset) must be aligned to cluster |
| size. |
| |
| |
| == Data Area == |
| |
| The data area is an area from the data offset (provided by header.data_off or |
| calculated as specified above) to the end of the file. It represents a |
| contiguous array of clusters. Most of them are allocated by the BAT, some may |
| be allocated by the ext_off field in the header while other may be allocated by |
| extensions. All clusters allocated by ext_off and extensions should meet the |
| same requirements as clusters specified by BAT entries. |
| |
| |
| == Format Extension == |
| |
| The Format Extension is an area 1 cluster in size that provides additional |
| format features. This cluster is addressed by the ext_off field in the header. |
| The format of the Format Extension area is the following: |
| |
| 0 - 7: magic |
| Must be 0xAB234CEF23DCEA87 |
| |
| 8 - 23: m_CheckSum |
| The MD5 checksum of the entire Header Extension cluster except |
| the first 24 bytes. |
| |
| The above are followed by feature sections or "extensions". The last |
| extension must be "End of features" (see below). |
| |
| Each feature section has the following format: |
| |
| 0 - 7: magic |
| The identifier of the feature: |
| 0x0000000000000000 - End of features |
| 0x20385FAE252CB34A - Dirty bitmap |
| |
| 8 - 15: flags |
| External flags for extension: |
| |
| Bit 0: NECESSARY |
| If the software cannot load the extension (due to an |
| unknown magic number or error), the file should not be |
| changed. If this flag is unset and there is an error on |
| loading the extension, said extension should be dropped. |
| |
| Bit 1: TRANSIT |
| If there is an unknown extension with this flag set, |
| said extension should be left as is. |
| |
| If neither NECESSARY nor TRANSIT are set, the extension should be |
| dropped. |
| |
| 16 - 19: data_size |
| The size of the following feature data, in bytes. |
| |
| 20 - 23: unused32 |
| Align header to 8 bytes boundary. |
| |
| variable: data (data_size bytes) |
| |
| The above is followed by padding to the next 8 bytes boundary, then the |
| next extension starts. |
| |
| The last extension must be "End of features" with all the fields set to 0. |
| |
| |
| === Dirty bitmaps feature === |
| |
| This feature provides a way of storing dirty bitmaps in the image. The fields |
| of its data area are: |
| |
| 0 - 7: size |
| The bitmap size, should be equal to disk size in sectors. |
| |
| 8 - 23: id |
| An identifier for backup consistency checking. |
| |
| 24 - 27: granularity |
| Bitmap granularity, in sectors. I.e., the number of sectors |
| corresponding to one bit of the bitmap. Granularity must be |
| a power of 2. |
| |
| 28 - 31: l1_size |
| The number of entries in the L1 table of the bitmap. |
| |
| variable: l1 (64 * l1_size bytes) |
| L1 offset table (in bytes) |
| |
| A dirty bitmap is stored using a one-level structure for the mapping to host |
| clusters - an L1 table. |
| |
| Given an offset in bytes into the bitmap data, the offset in bytes into the |
| image file can be obtained as follows: |
| |
| offset = l1_table[offset / cluster_size] + (offset % cluster_size) |
| |
| If an L1 table entry is 0, the corresponding cluster of the bitmap is assumed |
| to be zero. |
| |
| If an L1 table entry is 1, the corresponding cluster of the bitmap is assumed |
| to have all bits set. |
| |
| If an L1 table entry is not 0 or 1, it allocates a cluster from the data area. |