You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在vCenter中查找未关联磁盘及通过pyVmomi获取VM ID?

问题解决:pyVmomi相关两个问题

一、查找未关联任何VM的磁盘

核心思路是先收集所有已被VM挂载的磁盘路径,再遍历所有数据存储中的VMDK文件,过滤掉已被引用的部分,剩下的就是未关联的磁盘。

步骤及代码示例:

  1. 收集所有VM已使用的磁盘路径
from pyVmomi import vim

# 假设已建立service_instance连接
content = service_instance.RetrieveContent()

# 获取所有VM并收集其挂载的磁盘路径
vm_container = content.viewManager.CreateContainerView(content.rootFolder, [vim.VirtualMachine], recursive=True)
used_disk_paths = set()
for vm in vm_container.view:
    if not vm.config or not vm.config.hardware:
        continue
    for device in vm.config.hardware.device:
        if isinstance(device, vim.vm.device.VirtualDisk) and device.backing and device.backing.fileName:
            used_disk_paths.add(device.backing.fileName)
vm_container.Destroy()
  1. 遍历所有数据存储,筛选未被引用的VMDK
# 获取所有数据存储
ds_container = content.viewManager.CreateContainerView(content.rootFolder, [vim.Datastore], recursive=True)
unattached_disks = []

for datastore in ds_container.view:
    browser = datastore.browser
    # 构建搜索规则,只找.vmdk文件(排除-flat.vmdk这类数据文件,只保留descriptor)
    search_spec = vim.host.DatastoreBrowserSearchSpec()
    search_spec.matchPattern = ["*.vmdk"]
    
    # 执行搜索并等待结果
    search_task = browser.SearchDatastoreSubFolders(datastore.info.url, search_spec)
    search_result = search_task.wait_for_completion()
    
    for folder in search_result:
        for file_info in folder.file:
            # 拼接完整磁盘路径
            full_path = f"{folder.folderPath}{file_info.path}"
            # 排除数据文件和已被使用的磁盘
            if not file_info.path.endswith("-flat.vmdk") and full_path not in used_disk_paths:
                unattached_disks.append(full_path)
ds_container.Destroy()

# 输出结果
for disk in unattached_disks:
    print(f"未关联磁盘:{disk}")

注意:如果需要排除模板虚拟机的磁盘,可以在收集used_disk_paths时,判断vm.config.template是否为False,只收集非模板VM的磁盘。

二、获取VM的moId(如vm-1210809)

你看到的vm-xxxxxx是VM这个Managed Object的ID(moId),在pyVmomi中可以直接通过实例的_moId属性获取,不需要从repr中提取:

# 假设vm是已获取的VirtualMachine实例
vm_moid = vm._moId
print(vm_moid)  # 输出类似 vm-1210809

另外,如果你需要的是VM的全局唯一实例UUID(与moId不同),可以用vm.config.instanceUuid。


内容的提问来源于stack exchange,提问作者VagrantPaladin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 04:40:13