对虚拟机进行备份时,若进行增量备份,需要获取从上一次备份到此次快照时的数据改变区块(ChangedDiskAreas),而确定上一次改变的位置就是通过上一次创建快照时生成的changeId,这个changeId相当于每次备份的一个节点记录标记,获取该changeId可以在快照创建完成之后根据快照名称获取。
通过MOB,可以发现每次快照之后生成的changeId位于该快照对应的虚拟设备属性路径下(config.hardware.device)的VirtualDisk下,具体详情浏览MOB。
下面给出根据虚拟机快照获取快照中虚拟磁盘的changeId的代码:
/**
* @Title: getChangeId
* @Description: 获取快照中虚拟磁盘的changeId
* @param vmMor 虚拟机托管对象引用
* @param vmName 虚拟机名称
* @param snapshotName 快照名称
* @return
* @throws RuntimeFaultFaultMsg
* @throws InvalidPropertyFaultMsg
* @throws Exception
*/
public String getChangeId(ManagedObjectReference vmMor, String vmName, String snapshotName)
throws RuntimeFaultFaultMsg, InvalidPropertyFaultMsg, Exception {
String changeId = null;
// 获取快照托管对象引用
ManagedObjectReference snMor = getSnapshotReference(vmMor, vmName, snapshotName);
// 获取快照对应的虚拟设备
ArrayOfVirtualDevice devs =
(ArrayOfVirtualDevice) retrieveEntityProps(snMor, new String[] {"config.hardware.device"})
.get("config.hardware.device");
// 遍历虚拟设备以得到虚拟磁盘
for (VirtualDevice vd : devs.getVirtualDevice()) {
if (vd instanceof VirtualDisk) {
VirtualDisk disk = (VirtualDisk) vd;
VirtualDiskFlatVer2BackingInfo bi = (VirtualDiskFlatVer2BackingInfo) disk.getBacking();
changeId = bi.getChangeId();
break;
}
}
return changeId;
}
注:getSnapshotReference()和retrieveEntityProps()方法参考之前的文章——根据虚拟机获取虚拟机快照引用。
代码仅供学习参考。