About Changed Block Tracking

VixDiskLib_QueryAllocatedBlocks returns the sectors of a virtual disk that are in use. QueryChangedDiskAreas returns the sectors that changed since the time of a specified changeId.

The current implementation depends on VMFS properties, similar to properties that SAN transport mode uses to locate data on a SCSI LUN. Both rely on unallocated areas (file holes) in virtual disk, and the LazyZero designation for VMFS blocks. Thus, changed block tracking yields best results on VMFS. On other storage types, it could fail, or returns a single extent covering the entire disk.

You should enable changed block tracking in the order recommended by Enable Changed Block Tracking. At first call VixDiskLib_QueryAllocatedBlocks to get allocated areas of virtual disk, and back them up. Subsequently call QueryChangedDiskAreas to get changed areas, and back them up if they were allocated. If you call QueryChangedDiskAreas after a snapshot but before you enable changed block tracking, it also returns unallocated areas of virtual disk. With thin-provisioned virtual disk this could be a large amount of zero data.

The guest operating system has no visibility of changed block tracking. Once a virtual machine has written to a block on virtual disk, the block is considered in use. The information required for tracking is computed when changed block tracking is enabled, and the .ctk file is pre-filled with allocated blocks. The mechanism cannot report changes made to virtual disk before changed block tracking was enabled.