根据虚拟机获取快照信息
对虚拟机进行备份时,需要获取指定虚拟机的磁盘相关信息(包含uuid、changeId、diskMode、fileName等),这些信息可以在快照创建完成之后通过快照来获取,下面给出根据虚拟机获取快照对应信息的代码:/*** @Title: getVirtualDiskInfo* @Description: 获取快照信息(包含uuid、changeId、diskMode、fileName...
·
对虚拟机进行备份时,需要获取指定虚拟机的快照相关信息(包含uuid、changeId、diskMode、fileName等),这些信息可以在快照创建完成之后通过快照来获取,下面给出根据虚拟机获取快照对应信息的代码:
/**
* @Title: getVirtualDiskInfo
* @Description: 获取快照信息(包含uuid、changeId、diskMode、fileName)
* @param vmMor 虚拟机托管对象引用
* @param vmName 虚拟机名称
* @param snapshotName 快照名称
* @return
* @throws RuntimeFaultFaultMsg
* @throws InvalidPropertyFaultMsg
* @throws Exception
* @version 1.0
*/
public VirtualMachineSnapshot getSnapshotInfo(ManagedObjectReference vmMor, String vmName, String snapshotName)
throws RuntimeFaultFaultMsg, InvalidPropertyFaultMsg, Exception {
VirtualMachineSnapshot snapshot = new VirtualMachineSnapshot();
// 虚拟磁盘属性列表
String[] propsArr = new String[] {"config", // 虚拟机配置信息
"config.changeTrackingEnabled", // CBT是否启动
"snapshot", "vm" // 虚拟机引用
};
// 获取快照托管对象引用(方法参考前一篇文章)
ManagedObjectReference snMor = getSnapshotReference(vmMor, vmName, snapshotName);
// 获取快照对应的虚拟设备属性(方法参考前一篇文章)
Map<String, Object> result = retrieveEntityProps(snMor, propsArr);
// 遍历结果,并设置到实体对象
for (String key : result.keySet()) {
if ("config".equals(key)) {
// BackingInfo 里包含uuid、changeId、diskMode、fileName("[datastore1]
// centos_restore1/centos_restore1.vmdk")
VirtualMachineConfigInfo vmConfigInfo = (VirtualMachineConfigInfo) result.get(key);
snapshot.setConfig(vmConfigInfo);
snapshot.setGuestFullName(vmConfigInfo.getGuestFullName()); // 虚拟机全名-"CentOS 4/5/6/7
// (64-bit)"
snapshot.setGuestId(vmConfigInfo.getGuestId()); // 虚拟机操作系统ID-"centos64Guest"
snapshot.setVmName(vmConfigInfo.getName()); // 虚拟机名称
snapshot.setUuid(vmConfigInfo.getUuid());
snapshot.setVersion(vmConfigInfo.getVersion());
// 硬件信息
VirtualHardware hardware = vmConfigInfo.getHardware();
snapshot.setMemoryMB(hardware.getMemoryMB());
snapshot.setNumCPU(hardware.getNumCPU());
// 遍历虚拟设备 获取虚拟磁盘
List<VirtualDevice> vdList = hardware.getDevice();
for (VirtualDevice vd : vdList) {
if (vd instanceof VirtualDisk) {
VirtualDisk disk = (VirtualDisk) vd;
snapshot.setCapacityInKB(disk.getCapacityInKB()); // 磁盘容量
snapshot.setDiskLabel(disk.getDeviceInfo().getLabel()); // 磁盘标签 "Hard disk 1"
snapshot.setKey(disk.getKey());
// 虚拟磁盘 backing 信息
VirtualDiskFlatVer2BackingInfo bi = (VirtualDiskFlatVer2BackingInfo) disk.getBacking();
snapshot.setChangeId(bi.getChangeId()); // 数据块改变ID
snapshot.setDiskMode(bi.getDiskMode());
String path = rebuildDiskPath(bi.getFileName());
snapshot.setDiskPath(path.toString()); // 磁盘路径"[datastore1] centos/centos.vmdk"
}
}
} else if ("config.changeTrackingEnabled".equals(key)) {
snapshot.setChangeTrackingEnabled((boolean) result.get(key));
} else if ("snapshot".equals(key)) {
VirtualMachineSnapshotInfo snap = (VirtualMachineSnapshotInfo) result.get(key);
snapshot.setSnapshot(snap);
} else if ("vm".equals(key)) {
snapshot.setVmMOR((ManagedObjectReference) result.get(key));
}
}
return snapshot;
}
快照实体对象如下:
import com.vmware.vim25.ArrayOfManagedObjectReference;
import com.vmware.vim25.ManagedObjectReference;
import com.vmware.vim25.VirtualMachineConfigInfo;
import com.vmware.vim25.VirtualMachineSnapshotInfo;
/**
* @ClassName: VirtualMachineSnapshot
* @Description: 虚拟机快照实体对象
*/
public class VirtualMachineSnapshot {
private VirtualMachineSnapshotInfo snapshot;
private String snapshotName; // 快照名称
private String description; // 快照描述
private boolean removechild; // 是否删除子快照
private ArrayOfManagedObjectReference childSnapshot; // 子快照
private VirtualMachineConfigInfo config; // 虚拟机配置信息
private ManagedObjectReference vmMOR; // 虚拟机引用
// 虚拟机信息
private boolean changeTrackingEnabled; // CBT是否启动
private String guestFullName; // "CentOS 4/5/6/7 (64-bit)"
private String guestId; // "centos64Guest"
private String vmName; // 虚拟机名称
private String version; // 虚拟机版本
private int memoryMB; // 虚拟机内存
private int numCPU; // 虚拟机CPU个数
private String uuid; // 虚拟机uuid
// 虚拟磁盘信息
private long capacityInKB; // 磁盘容量
private String diskLabel; // "Hard disk 1"
private String diskObjectId; // "53-2000" 53表示虚拟机编号, 2000 指虚拟磁盘
private int key; // 虚拟磁盘编号 2000
// 虚拟磁盘 backing 信息
private String changeId; // 数据块改变ID
private String diskMode; // 磁盘模式 persistent
private String diskPath; // 磁盘路径"[datastore1] centos/centos.vmdk"
// getter、setter 方法省略...
}
代码仅供学习参考。
更多推荐
已为社区贡献19条内容
所有评论(0)