对虚拟机进行备份时,需要获取指定虚拟机的磁盘相关信息,包含磁盘容量、磁盘路径、磁盘 key 等信息,这些信息可以在快照创建完成之后通过快照来获取,下面给出根据虚拟机获取虚拟磁盘信息代码:

/**
 * @Title: getDiskInfo
 * @Description: 获取磁盘信息
 * @param vmmor
 * @param vmName
 * @return
 * @throws RuntimeFaultFaultMsg
 * @throws InvalidPropertyFaultMsg
 * @version 1.0
 * @throws Exception
 */
@Override
public DiskInfo getDiskInfo(ManagedObjectReference vmMor, String vmName, String snapshotName)
    throws RuntimeFaultFaultMsg, InvalidPropertyFaultMsg, Exception {

  // 虚拟磁盘属性列表
  String[] propsArr = new String[] {"snapshot"};

  // 获取属性对应的实体,并设置到DiskInfo
  DiskInfo info = new DiskInfo();
  info.setName(vmName);

  VirtualMachineSnapshotInfo snap = (VirtualMachineSnapshotInfo) retrieveEntityProps(vmMor, propsArr).get("snapshot");
  info.setSnapshot(snap);

  if (StringUtils.isNotBlank(snapshotName)) {
    // 获取快照托管对象引用
    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();
        info.setCapacity(disk.getCapacityInKB()); // 磁盘容量
        info.setPath(bi.getFileName()); // 磁盘路径"[datastore1] vnname/vnname.vmdk"
        info.setKey(vd.getKey()); // 磁盘 key
        break;
      }
    }
  } else { // 获取新建虚拟机的磁盘路径
    ArrayOfVirtualDevice devs =
        (ArrayOfVirtualDevice) retrieveEntityProps(vmMor, 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();
        // String path = rebuildDiskPath(bi.getFileName());
        info.setPath(bi.getFileName()); // 磁盘路径"[datastore1] vnname/vnname.vmdk"
        break;
      }
    }
  }
  return info;
}

DiskInfo实体对象如下:

import com.vmware.vim25.VirtualMachineSnapshotInfo;

/**
 * @ClassName: DiskInfo
 * @Description: 磁盘信息
 */
public class DiskInfo {
  private String name;
  private long capacity;
  private int key;
  private String path;
  private VirtualMachineSnapshotInfo snapshot;

  // getter、setter 方法省略...
}

代码仅供学习参考。



Logo

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

更多推荐