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

如何使用Python扩展VMware vCenter现有虚拟机磁盘大小

可行方案说明

你查阅的新版vSphere Automation SDK确实未封装现有虚拟磁盘的直接修改接口,目前用Python完成vCenter虚拟机磁盘扩容的成熟可行方案是基于pyVmomi(vSphere原生Python API绑定)实现,无需删除原有磁盘重建,同时支持关机冷扩容、开机热扩容两种场景。

前置注意事项

  • 操作前建议为目标虚拟机创建快照,避免配置异常导致数据丢失
  • 开机热扩容需满足:vCenter版本≥6.0、虚拟机操作系统支持磁盘热扩展、磁盘未设置独立持久化之外的特殊模式
  • 扩容传入的容量单位为KB,新设置的容量必须大于磁盘现有容量,该API不支持磁盘缩容
  • vCenter侧的扩容操作只完成虚拟磁盘块设备的容量调整,操作完成后需要登录虚拟机操作系统内部扩展分区、文件系统,才能正常使用新增容量

实现示例代码

from pyVim.connect import SmartConnectNoSSL, Disconnect
from pyVmomi import vim
import time

def expand_vm_disk(vcenter_host, vcenter_user, vcenter_pwd, vm_name, disk_label, new_total_size_gb):
    # 建立vCenter连接
    si = SmartConnectNoSSL(
        host=vcenter_host,
        user=vcenter_user,
        pwd=vcenter_pwd,
        port=443
    )
    content = si.RetrieveContent()

    # 匹配目标虚拟机
    target_vm = None
    container = content.viewManager.CreateContainerView(content.rootFolder, [vim.VirtualMachine], True)
    for vm_item in container.view:
        if vm_item.name == vm_name:
            target_vm = vm_item
            break
    if not target_vm:
        raise RuntimeError(f"未找到名称为{vm_name}的虚拟机")

    # 匹配目标虚拟磁盘
    target_disk = None
    for device in target_vm.config.hardware.device:
        if isinstance(device, vim.vm.device.VirtualDisk) and device.deviceInfo.label == disk_label:
            target_disk = device
            break
    if not target_disk:
        raise RuntimeError(f"未找到标签为{disk_label}的虚拟磁盘")

    # 容量单位转换(GB转KB)
    new_capacity_kb = new_total_size_gb * 1024 * 1024
    if new_capacity_kb <= target_disk.capacityInKB:
        raise RuntimeError("新设置的容量必须大于磁盘现有容量,接口不支持缩容操作")

    # 构造磁盘编辑配置
    disk_change_spec = vim.vm.device.VirtualDeviceSpec()
    disk_change_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.edit
    disk_change_spec.device = target_disk
    disk_change_spec.device.capacityInKB = new_capacity_kb

    # 构造虚拟机重配置参数
    vm_reconfig_spec = vim.vm.ConfigSpec()
    vm_reconfig_spec.deviceChange = [disk_change_spec]

    # 提交扩容任务并等待执行结果
    task = target_vm.ReconfigVM_Task(spec=vm_reconfig_spec)
    while task.info.state not in [vim.TaskInfo.State.success, vim.TaskInfo.State.error]:
        time.sleep(2)
    if task.info.state == vim.TaskInfo.State.error:
        raise RuntimeError(f"磁盘扩容失败: {task.info.error.msg}")
    
    print(f"磁盘{disk_label}已成功扩容至{new_total_size_gb}GB")
    Disconnect(si)

# 调用示例
if __name__ == "__main__":
    expand_vm_disk(
        vcenter_host="vCenter访问地址",
        vcenter_user="vCenter管理员账号",
        vcenter_pwd="vCenter管理员密码",
        vm_name="待操作的虚拟机名称",
        disk_label="Hard disk 1", # 磁盘标签可在vCenter虚拟机硬件详情页查看
        new_total_size_gb=100 # 此处填写扩容完成后的磁盘总容量,不是新增容量
    )

补充说明

  • 示例代码中使用SmartConnectNoSSL跳过了vCenter自签名证书校验,如果你的环境配置了可信SSL证书,替换为SmartConnect方法并传入证书路径即可
  • 若虚拟机挂载了多块磁盘,除了通过磁盘标签匹配,也可以通过磁盘对应的SCSI控制器ID、单元号匹配目标磁盘,避免误操作
  • 批量扩容场景下,只需要提前整理好虚拟机、磁盘、目标容量的对应关系,遍历执行上述逻辑即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 20:57:23