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

如何通过PyVmomi SDK获取VMware vSphere中每个快照的大小?

如何通过PyVmomi SDK获取VMware vSphere中每个快照的大小?

嘿,这个问题我之前写vSphere自动化脚本的时候也碰到过!PyVmomi返回的基础快照对象确实没把大小数据直接暴露出来,不过有两种靠谱的方法能拿到,我给你详细拆解下:

方法一:用QuerySnapshotInfo()直接获取(最推荐)

其实VMware藏了个专门的接口用来查快照的详细信息,包括大小,只是不是直接挂在我们一开始拿到的Snapshot对象上。你可以调用虚拟机的QuerySnapshotInfo()方法,返回的结果里就有现成的大小数据,这是最省心的方式。

给你贴个能直接跑的代码片段:

from pyVim.connect import SmartConnect, Disconnect
import ssl

# 先处理SSL证书(测试环境可以这么搞,生产环境记得用正规的证书验证哦)
ssl_context = ssl._create_unverified_context()
si = SmartConnect(
    host="你的vCenter或ESXi主机地址",
    user="你的登录账号",
    pwd="你的登录密码",
    sslContext=ssl_context
)

# 定位到目标虚拟机(这里按名称查找,你也可以用其他方式定位)
content = si.RetrieveContent()
target_vm_name = "要查询的虚拟机名称"
target_vm = None
container = content.viewManager.CreateContainerView(
    content.rootFolder, [vim.VirtualMachine], recursive=True
)
for vm in container.view:
    if vm.name == target_vm_name:
        target_vm = vm
        break
container.Destroy()

if target_vm:
    # 调用接口获取快照详细信息
    snapshot_info = target_vm.QuerySnapshotInfo()
    for snap_entry in snapshot_info.snapshots:
        print(f"快照名称: {snap_entry.name}")
        print(f"创建时间: {snap_entry.createTime}")
        print(f"总大小(字节): {snap_entry.size}")
        print(f"总大小(MB): {round(snap_entry.size / (1024*1024), 2)}")
        print("---")

# 别忘了断开连接
Disconnect(si)

这个方法返回的size字段是vSphere已经计算好的快照总占用空间,不用自己折腾计算,非常方便。

方法二:遍历快照树+磁盘布局计算(兼容旧版本)

如果你的vSphere版本比较老(比如6.0之前),QuerySnapshotInfo()接口可能不支持,那可以用这个兜底方法:每个快照的大小其实是它对应的所有差异磁盘的大小总和,我们可以通过快照的LayoutEx属性拿到磁盘布局信息,手动累加计算。

代码示例如下:

from pyVim.connect import SmartConnect, Disconnect
import ssl

def calculate_snapshot_size(snapshot):
    total_size = 0
    # 获取快照的磁盘布局扩展信息
    layout_ex = snapshot.LayoutEx
    if layout_ex:
        for disk_layout in layout_ex.disk:
            # 遍历每个磁盘的快照层
            for snap_layer in disk_layout.snapshot:
                if snap_layer.snapshot == snapshot:
                    total_size += snap_layer.size
    return total_size

# 递归遍历快照树
def traverse_snapshot_tree(snap_tree):
    snap_size = calculate_snapshot_size(snap_tree.snapshot)
    print(f"快照名称: {snap_tree.name}")
    print(f"创建时间: {snap_tree.createTime}")
    print(f"总大小(字节): {snap_size}")
    print(f"总大小(MB): {round(snap_size / (1024*1024), 2)}")
    print("---")
    # 处理子快照
    if snap_tree.childSnapshotList:
        for child_snap in snap_tree.childSnapshotList:
            traverse_snapshot_tree(child_snap)

# 连接vSphere并查询虚拟机
ssl_context = ssl._create_unverified_context()
si = SmartConnect(
    host="你的vCenter或ESXi主机地址",
    user="你的登录账号",
    pwd="你的登录密码",
    sslContext=ssl_context
)

content = si.RetrieveContent()
target_vm_name = "要查询的虚拟机名称"
target_vm = None
container = content.viewManager.CreateContainerView(
    content.rootFolder, [vim.VirtualMachine], recursive=True
)
for vm in container.view:
    if vm.name == target_vm_name:
        target_vm = vm
        break
container.Destroy()

if target_vm and target_vm.snapshot:
    # 从根快照开始遍历
    for root_snap in target_vm.snapshot.rootSnapshotList:
        traverse_snapshot_tree(root_snap)

Disconnect(si)

这个方法虽然需要自己计算,但兼容性更好,适合老版本环境。

最后给你提两个小注意点:

  • 如果查到的size是0,别慌!大概率是快照刚创建,vSphere还没完成大小统计,等个几分钟再查就有数据了。
  • 权限要到位:你的登录账号必须拥有虚拟机>快照>查看快照的权限,不然可能拿不到这些敏感的存储数据。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 13:23:13