使用vSphere SDK for C#开发WinForm程序备份无vCenter的ESX运行VM遇阻求助
我之前也碰到过类似的需求——用C#开发工具直接对接ESXi(没有vCenter)做虚拟机备份,确实vSphere SDK本身没有提供一键备份的API,得靠组合现有功能来实现。下面是几个可行的方案,按推荐程度排序:
方案1:基于快照API + 磁盘复制实现(最可靠)
vSphere SDK虽然没有直接的备份方法,但可以借助虚拟机快照+磁盘复制的思路,完成运行中VM的一致性备份。核心逻辑是:创建静默快照→获取磁盘存储路径→复制VMDK到本地→清理快照。
具体步骤:
创建一致性快照
用SDK的VirtualMachine.CreateSnapshot_Task方法创建快照,关键参数要设置quiesce=true(启用文件系统静默,保证备份数据的一致性),memory=false(如果不需要备份虚拟机内存,关闭可以加快快照创建速度)。
代码示例:// 假设已经通过SDK连接到ESXi并获取到目标VirtualMachine对象vm var snapshotSpec = new VirtualMachineSnapshotSpec { name = $"Backup_Snap_{DateTime.Now:yyyyMMddHHmmss}", description = "Auto-created snapshot for backup", quiesce = true, memory = false }; // 启动快照创建任务并等待完成 var createSnapshotTask = vm.CreateSnapshot_Task(snapshotSpec); var taskResult = createSnapshotTask.WaitForTaskCompletion(); if (taskResult != TaskInfoState.Success) { // 处理快照创建失败的情况 throw new Exception($"Failed to create snapshot: {createSnapshotTask.Info.Error.LocalizedMessage}"); }获取快照磁盘的存储路径
通过VM的config.hardware.device找到所有磁盘设备,关联到刚创建的快照,获取其在ESXi存储上的完整路径(通常是/vmfs/volumes/[数据存储名]/[VM文件夹]/[磁盘文件名].vmdk)。复制VMDK到本地存储
可以通过以下方式复制文件:- 利用ESXi的SMB共享:如果ESXi开启了SMB服务,直接通过C#的
File.Copy或WebClient访问共享路径复制。 - 用SSH执行命令:通过C#的
Process类调用SSH客户端(比如PuTTY的plink.exe),执行cp命令将VMDK复制到本地挂载的存储,或者用scp推送到本地。
- 利用ESXi的SMB共享:如果ESXi开启了SMB服务,直接通过C#的
清理快照
备份完成后,一定要删除快照避免占用存储空间:var snapshot = vm.Snapshot.RootSnapshotList.First(s => s.Name == snapshotSpec.name); var removeSnapshotTask = snapshot.Snapshot.RemoveSnapshot_Task(removeChildren: true); removeSnapshotTask.WaitForTaskCompletion();
方案2:调用ESXi命令行工具(轻量但需开启SSH)
如果不想复杂的API操作,可以直接通过C#远程执行ESXi的命令行工具来完成备份:
- 用
vim-cmd管理虚拟机快照 - 用
vmkfstools复制磁盘文件
示例流程:
- 通过SSH执行
vim-cmd vmsvc/snapshot.create <VMID> "Backup_Snap" "Backup snap" 1 0(1表示启用静默,0表示不备份内存) - 执行
vmkfstools -i /vmfs/volumes/.../vm-disk1.vmdk /vmfs/volumes/local-storage/backup/vm-disk1-backup.vmdk(克隆磁盘到本地存储) - 执行
vim-cmd vmsvc/snapshot.remove <VMID> <SnapshotID> 1删除快照
在C#中可以用Process类调用plink.exe或ssh.exe来执行这些命令,注意处理命令的输出和错误信息。
方案3:集成VMware PowerCLI(快速开发)
如果允许在项目中依赖PowerCLI,可以在C#中调用PowerCLI的命令来简化操作:
- 引用PowerCLI的相关DLL(比如
VMware.Vim.dll、VMware.VimAutomation.Core.dll) - 用PowerCLI的
New-VMSnapshot、Copy-VMGuestFile等命令完成备份逻辑
不过要注意,免费版ESXi可能会限制PowerCLI的某些功能,需要测试兼容性。
关键注意事项
- 权限问题:ESXi的登录用户需要拥有
VirtualMachine.Snapshot.Create、Datastore.FileManagement等权限,建议使用管理员账号或自定义权限组。 - 免费版ESXi限制:免费版ESXi不支持增量备份,只能做全量备份;同时快照数量有限制,备份后务必清理。
- 数据一致性:如果备份的是数据库等需要严格一致性的VM,务必开启
quiesce=true,否则备份的文件可能损坏。
内容的提问来源于stack exchange,提问作者hiimjack

