需求介绍:

   之前已经使用pyvmomi库实现了虚拟机的自动备份,不过由于备份的虚拟机都是较为重要的系统,磁盘都是厚置备模式,终于有一天,备份目标的空间不够了,导致几个虚拟机无法备份。在不想增加磁盘的情况下,想着能不能把磁盘的厚置备模式改成thin精简模式,是不是就可以节省空间了呢?

过程介绍:

    pyvmomi的示例程序比较简单,这个看起来不是很高级的需求竟然没有,看了下手动操作克隆时是可以修改的,就想着肯定是可以实现的。

   从网上包括问了ChatGPT4.0 和文心都不太好使,折腾了一天,都有些气馁了。还是去翻官网文档,说实话有些费劲,vsphere的功能确实强,但文档也确实复杂,至少pyvmomi的是这样。

  总结下:

虚拟机克隆时的参数很简单,主要配置参数都在CloenSpec这个对象中指定,包括目标主机、存储、资源池等。在这个对象中,主要有RelocateSpec 和 configSpec两个对象,在这两个对象中都有deviceChange这个子对象,是网上找到的资料主要修改的目标。

1. 首先,官网说clonespec 的config 已经不用了。改用location下的deviechange。

PyVMomi 克隆虚拟机时将磁盘改为Thin模式-LMLPHP

2. RelocateSpec中的devicechange说明只有极少数配置可以改,其他的都会被忽略。网上的大部分文章都是修改这个devicechange的,所以都没有效果。

PyVMomi 克隆虚拟机时将磁盘改为Thin模式-LMLPHP

3. 上图中RelocateSpec中的disk 表明可以指定磁盘参数的。进去看下:

PyVMomi 克隆虚拟机时将磁盘改为Thin模式-LMLPHP

RelocateSpec的disk参数是一个vim.vm.RelocateSpec.DiskLocator的列表,而DiskLocator对象包含有diskID、diskBackingINfo等信息,diskbakcingInfo对象中的VirtualDiskFlatVer2BackingInfo中有thinProvisioned参数来指定磁盘格式。 感觉就像是俄罗斯套娃,一个对象包含着另外的对象,一层层的,你不知道需要的参数在那一层的口袋里。

4. 这里还遇到一个难题,就是DiskLocator对象中的diskId参数怎么指定? 问了ChatGPT4.0 和文心一言,给出的例子是将设备出现的顺序当成diskId,系统一直报错说diskId指定不对。

PyVMomi 克隆虚拟机时将磁盘改为Thin模式-LMLPHP

还是ChatGPT4 好一些:

PyVMomi 克隆虚拟机时将磁盘改为Thin模式-LMLPHP

直接提示了diskId是virtualdisk设备的key属性,不是排序和索引。

把事情搞清楚了,问题就简单了:

1.  通过源VM的设备信息获取到有多少个磁盘,并获取对应的key值作为diskLocator的diskId参数。

   for device in source_vm_inst.config.hardware.device:

         if isinstance(device, vim.vm.device.VirtualDisk):

               diskId = device.key

2. 对每个磁盘,组装一个diskLocator对象:

    disk_locator = vim.vm.RelocateSpec.DiskLocator()

    disk_locator.datastore= datestore  #这个也是必选参数,就是目标VM的存储对象

    disk_locator.diskId = device.key

    disk_locator.diskBackingInfo = vim.vm.device.VirtualDisk.FlatVer2BackingInfo()

    disk_locator.diskBackingInfo.thinProvisioned = True

    disk_change.append(disk_locator)

3. 定义cloneSpec和relocateSPec对象,将参数注入进去

    clone_spec = vim.vm.CloneSpec()

    relocate_spec = vim.vm.RelocateSpec()

    relocate_spec.disk = disk_change # 将磁盘的配置信息注入到relocatespec的disk参数中

    clone_spec.location = relocate_spec # 将relocatespec配置信息注入clonespec中。

4. 剩下的事情就是交给Clone Task去完成克隆任务,然后查看克隆后的虚拟机磁盘是否已经是精简模式。

最后: chatGPT 4.0 真的很强,可以看到给的代码大部分直接可用,下一个10年就是AI的时代,错过了互联网,错过了移动互联网,不要错过AI。

12-15 14:53