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

使用vSphere SDK for C#开发WinForm程序备份无vCenter的ESX运行VM遇阻求助

解决无vCenter环境下用vSphere SDK for C#备份运行中ESXi虚拟机的问题

我之前也碰到过类似的需求——用C#开发工具直接对接ESXi(没有vCenter)做虚拟机备份,确实vSphere SDK本身没有提供一键备份的API,得靠组合现有功能来实现。下面是几个可行的方案,按推荐程度排序:

方案1:基于快照API + 磁盘复制实现(最可靠)

vSphere SDK虽然没有直接的备份方法,但可以借助虚拟机快照+磁盘复制的思路,完成运行中VM的一致性备份。核心逻辑是:创建静默快照→获取磁盘存储路径→复制VMDK到本地→清理快照。

具体步骤:

  1. 创建一致性快照
    用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}");
    }
    
  2. 获取快照磁盘的存储路径
    通过VM的config.hardware.device找到所有磁盘设备,关联到刚创建的快照,获取其在ESXi存储上的完整路径(通常是/vmfs/volumes/[数据存储名]/[VM文件夹]/[磁盘文件名].vmdk)。

  3. 复制VMDK到本地存储
    可以通过以下方式复制文件:

    • 利用ESXi的SMB共享:如果ESXi开启了SMB服务,直接通过C#的File.Copy或WebClient访问共享路径复制。
    • 用SSH执行命令:通过C#的Process类调用SSH客户端(比如PuTTY的plink.exe),执行cp命令将VMDK复制到本地挂载的存储,或者用scp推送到本地。
  4. 清理快照
    备份完成后,一定要删除快照避免占用存储空间:

    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复制磁盘文件

示例流程:

  1. 通过SSH执行vim-cmd vmsvc/snapshot.create <VMID> "Backup_Snap" "Backup snap" 1 0(1表示启用静默,0表示不备份内存)
  2. 执行vmkfstools -i /vmfs/volumes/.../vm-disk1.vmdk /vmfs/volumes/local-storage/backup/vm-disk1-backup.vmdk(克隆磁盘到本地存储)
  3. 执行vim-cmd vmsvc/snapshot.remove <VMID> <SnapshotID> 1删除快照

在C#中可以用Process类调用plink.exe或ssh.exe来执行这些命令,注意处理命令的输出和错误信息。

方案3:集成VMware PowerCLI(快速开发)

如果允许在项目中依赖PowerCLI,可以在C#中调用PowerCLI的命令来简化操作:

  1. 引用PowerCLI的相关DLL(比如VMware.Vim.dll、VMware.VimAutomation.Core.dll)
  2. 用PowerCLI的New-VMSnapshot、Copy-VMGuestFile等命令完成备份逻辑

不过要注意,免费版ESXi可能会限制PowerCLI的某些功能,需要测试兼容性。

关键注意事项

  • 权限问题:ESXi的登录用户需要拥有VirtualMachine.Snapshot.Create、Datastore.FileManagement等权限,建议使用管理员账号或自定义权限组。
  • 免费版ESXi限制:免费版ESXi不支持增量备份,只能做全量备份;同时快照数量有限制,备份后务必清理。
  • 数据一致性:如果备份的是数据库等需要严格一致性的VM,务必开启quiesce=true,否则备份的文件可能损坏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:57:02