从模板克隆时如何将磁盘添加到VM?

2024-09-30 12:30:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经找到了pyvmomi示例,介绍了如何将磁盘添加到已存在的VM中,但我希望自定义VM模板,然后进行克隆。设置CPU和内存是非常简单的,但是在现有模板中添加一个或多个磁盘(从引导磁盘中删除)让我无法理解

# Add an additional 200 GB disk
new_disk_kb = int(20) * 1024 * 1024
disk_spec = vim.vm.device.VirtualDeviceSpec()
disk_spec.fileOperation = "create"
disk_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.add
disk_spec.device = vim.vm.device.VirtualDisk()
disk_spec.device.backing = vim.vm.device.VirtualDisk.RawDiskMappingVer1BackingInfo()
disk_spec.device.backing.diskMode = 'persistent'
disk_spec.device.unitNumber = 3
disk_spec.device.capacityInKB = new_disk_kb

# vm configuration
vmconf = vim.vm.ConfigSpec()
vmconf.numCPUs = 8            # change the template's cpus from 4 to 8
vmconf.memoryMB = 16 * 1024   # change the template's memory from 4 GB to 16 GB
# change the template's disks from
#    1 250 GB boot, 1 x 200 GB disk
# to 
#    1 250 gB boot, 2 x 200 GB disks
vmconf.deviceChange = [ disk_spec ]  # something is not right
                               
clonespec = vim.vm.CloneSpec()
clonespec.location = relospec
clonespec.powerOn = True
clonespec.config = vmconf
clonespec.customization = customspec
task = template.Clone(folder = destfolder, name = vmname, spec = clonespec)

代码在没有vmconf.deviceChange的情况下工作。一旦我尝试添加磁盘,我就会看到错误

Invalid configuration for device '0'.

Incompatible device backing specified for device '0'.

Tags: thetofromdevicevmtemplatevimchange
3条回答

我刚刚遇到了向vm添加RDM磁盘的问题

问题是:

disk_spec.device.backing=vim.vm.device.VirtualDisk.RawDiskMappingVer1BackingInfo()

您需要为您的规范提供backing.deviceName和backing.lunUuid。之后就可以使用了。我很自信,因为我看到了完全相同的错误消息,它为我修复了它

您可以从host.config.storageDevice.scsiLun获取感兴趣lun的lun uuid和deviceName

您得到的错误似乎表明您需要修复unit_number。请记住,7是为scsi控制器保留的,16是VMWare支持的最大磁盘数(查看sample code

这个问题有多个移动部分,包括创建模板、修改模板和克隆VM

让我们先解决最简单的问题。这部分代码不正确:

new_disk_kb = int(20) * 1024 * 1024
disk_spec = vim.vm.device.VirtualDeviceSpec()
disk_spec.fileOperation = "create"
disk_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.add
disk_spec.device = vim.vm.device.VirtualDisk()
disk_spec.device.backing = vim.vm.device.VirtualDisk.RawDiskMappingVer1BackingInfo()
disk_spec.device.backing.diskMode = 'persistent'
disk_spec.device.unitNumber = 3
disk_spec.device.capacityInKB = new_disk_kb

在查看了多个pyvmomi示例脚本之后,我发现您没有正确设置unitNumber。根据这些脚本,您需要确定磁盘的数量,并分配下一个可用的unitNumber,在您的情况下,我假设它是2,而不是3

下面的代码是从add raw disk to vm{}脚本中提取的

spec = vim.vm.ConfigSpec()
# get all disks on a VM, set unit_number to the next available
unit_number = 0
controller = None
for device in vm.config.hardware.device:
    if hasattr(device.backing, 'fileName'):
        unit_number = int(device.unitNumber) + 1
        # unit_number 7 reserved for scsi controller
        if unit_number == 7:
            unit_number += 1
        if unit_number >= 16:
            print("we don't support this many disks")
            return -1
    if isinstance(device, vim.vm.device.VirtualSCSIController):
        controller = device
if controller is None:
    print("Disk SCSI controller not found!")
    return -1
disk_spec = vim.vm.device.VirtualDeviceSpec()
disk_spec.fileOperation = "create"
disk_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.add
disk_spec.device = vim.vm.device.VirtualDisk()
rdm_info = vim.vm.device.VirtualDisk.RawDiskMappingVer1BackingInfo()
disk_spec.device.backing = rdm_info
disk_spec.device.backing.compatibilityMode = disk_compatibility_mode
disk_spec.device.backing.diskMode = disk_mode
# The device_name will look something like
#     /vmfs/devices/disks/naa.41412340757396001d7710df0fdd22a9
disk_spec.device.backing.deviceName = device_name
disk_spec.device.unitNumber = unit_number
disk_spec.device.controllerKey = controller.key
spec.deviceChange = [disk_spec]

关于你想解决的其他问题。有几个pyvmomi script可能是有用的。特别是Clone VM,它提供了从您试图创建的模板克隆VM的详细信息

我不确定这个脚本有多有用,因为看起来您正在寻找一个完整的解决方案来解决您的用例

我建议看一下这个旧的Github{a4},它有很多有用的代码用于创建模板、修改模板和克隆VM

关于您对使用已有一个磁盘(启动磁盘)的现有模板以及在克隆过程中添加辅助磁盘的评论

根据我对VM文档的解释,我目前认为这是不可能的,原因何在:

  1. VM模板是虚拟机的主副本映像,其中包括VM磁盘、虚拟设备和设置。此模板可用于VM克隆过程。此模板是静态的,应视为配置基线

  2. 在克隆过程中无法修改此模板。若出于任何原因需要修改此静态模板,则需要使用新添加的内容重新创建它。这意味着需要将原始模板转换为VM,需要编辑此VM,然后再转换回新模板

如果不可能,您可以在新VM上克隆基线模板,并使用pyvmomi添加磁盘scripts中的一个来启用VM上的新磁盘

我不知道您的具体用例,但我认为重新创建模板是合乎逻辑的选择,但是您的用例在克隆后创建新磁盘可能会更好

我前面提到的GitHub项目使用一个基线模板来克隆VM,并且它还有一个addDisks函数。后者用于向克隆过程中创建的VM添加新磁盘

下面是一个较旧的pyvmomi{a6},其中有人想修改与正在克隆的模板相关的磁盘。建议OP在克隆后过程中执行此任务

GitHub项目展示了如何使用基线模板并根据需要修改VMs配置。从代码来看,它似乎是在克隆过程中使用CloneSpec()修改VM,而不是在克隆后过程中

相关问题 更多 >

    热门问题