快照列表获取失败常见原因是权限不足或虚拟机对象获取错误,需确保用户具备virtualmachine.config.snapshot和virtualmachine.state.query权限,并通过精确方法获取vm对象后再操作。

快照列表获取失败:get_snapshot_info() 返回空或报 vim.fault.NoPermission
常见原因是当前用户权限不足,或目标虚拟机路径/名称拼写错误。vCenter 对快照操作要求明确的 VirtualMachine.Config.Snapshot 权限,仅“只读”角色无法列出快照。
- 确认账户在 vCenter 中被赋予
VirtualMachine.Config.Snapshot和VirtualMachine.State.Query权限(通常需“虚拟机管理员”或自定义策略) - 用
content.searchIndex.FindByDnsName()或get_obj(content, [vim.VirtualMachine], vm_name)精确获取vm对象,避免传入字符串名直接调用快照方法 - 快照树是嵌套结构,不要依赖
vm.snapshot直接遍历 —— 它可能为None;应先检查vm.snapshot is not None and vm.snapshot.rootSnapshotList
创建快照时卡住或超时:CreateSnapshot_Task() 长时间 pending
根本原因通常是虚拟机正在运行且 I/O 密集(如备份中、磁盘写入高峰),或快照链已超过 32 层(vSphere 硬限制)。该方法默认同步等待完成,但底层任务可能因存储响应慢而挂起。
- 始终传入
memory=False(除非真需要内存状态),否则会触发完整内存 dump,耗时陡增且易失败 - 添加超时控制:用
task.WaitForTask(timeout=300)替代裸调用,捕获vim.fault.TaskInProgress或pyVmomi.vim.fault.InvalidState - 检查快照层级:
len(vm.snapshot.rootSnapshotList),超过 30 层就应先清理旧快照,否则新创建大概率失败
删除快照后磁盘空间没释放:调用 RemoveSnapshot_Task() 但厚置备磁盘仍占满
这是典型误解 —— RemoveSnapshot_Task() 默认不合并磁盘(即保留 delta 文件),只断开快照链引用。真正释放空间需设置 removeChildren=True 并等待后台合并完成(可能数分钟)。
- 务必显式传参:
snapshot_obj.RemoveSnapshot_Task(removeChildren=True, consolidate=True);consolidate=True是关键,否则 delta 文件残留 - 合并过程不可逆,执行前建议先用
vm.config.hardware.device检查是否有热插拔磁盘,某些配置下consolidate可能失败 - 删除后立即查
vm.layout.disk不可靠,应轮询task.info.state == 'success'再验证 datastore 使用率
批量操作快照时报 vim.fault.InvalidArgument: A specified parameter was not correct
多出现在并发调用或对象复用场景:同一个 vim.VirtualMachine 实例被多个线程反复调用 CreateSnapshot_Task(),或快照对象(vim.vm.Snapshot)跨 session 复用。
- 每个快照操作必须基于当前 session 下实时获取的
vm对象,禁止缓存vm超过 30 秒(vCenter 会回收 stale reference) - 不要保存
snapshot_obj长期使用;每次操作前用vm.snapshot.rootSnapshotList[0].snapshot等方式重新获取最新引用 - 批量处理时加锁或串行化(哪怕慢点),pyVmomi 的 connection 不是线程安全的,
SmartConnect实例不能共享
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











