Changed Block Tracking on
Virtual Disks
On ESXi hosts release 4.0 and later, virtual
machines can keep track of disk sectors that have changed. This is called
changed block tracking. Its method in the VMware vSphere API is
QueryChangedDiskAreas
, which takes
the following parameters:
- _this– Managed object reference to the virtual machine.
- snapshot– Managed object reference to a Snapshot of the virtual machine.
- deviceKey– Virtual disk for which to compute the changes.
- startOffset– Byte offset where to start computing changes to virtual disk. The length of virtual disk sector(s) examined is returned inDiskChangeInfo.
- changeId– An identifier for the state of a virtual disk at a specific point in time. A newChangeIdresults every time someone creates a snapshot. You should retain this value with the version of change data that you extract (usingQueryChangedDiskAreas) from the snapshot’s virtual disk.
When you back up a snapshot for the first time,
ChangeId
should be unset, or
unsaved, indicating that a baseline (full) backup is required. If you have a
saved
ChangeId
, it identifies the last
time a backup was taken, and tells the changed block tracking logic to identify
changes that have occurred since the time indicated by the saved
ChangeId
.
There are two ways to get this baseline backup:
- Directly save the entire contents of the virtual disk.
- Call theVixDiskLib_QueryAllocatedBlocksfunction, which returns the allocated portions of a virtual disk. Usually this substantially reduces the amount of data to save, especially for thin provisioned and sparse virtual disks.
To summarize,
changeID
is an identifier for a
time in the past. It should be a
changeId
string saved at the
time when a pre-backup snapshot was taken. If a previous
ChangeId
does exist, then
QueryChangedDiskAreas
returns
the disk sectors that changed since the new
ChangeId
was collected.
Table 1
shows the algorithm.
New Change ID
| Old Change ID
| Used for Query
| Result
|
---|---|---|---|
change 0
| none
| null
| All sectors, use Query
Allocated Sectors instead.
|
change 1
| change 0
| change 0
| All sectors altered since
change 0.
|