对虚拟机进行备份时,需要获取指定虚拟机的快照相关信息(包含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 方法省略...
}

代码仅供学习参考。



Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐