Cinder VMware VMDK Driver分析

  • Post author:
  • Post category:IT
  • Post comments:0评论

背景

VMware vmdk driver已经成为了一种可选的cinder volume driver,分析它,对于将已经成熟的虚拟化产品接入openstack,有着很大的借鉴价值。

VMware VMDK driver的介绍

支持的卷操作

  1. 创建卷
  2. 从源卷创建新卷(支持这一操作当且仅当源卷没有被挂在到虚拟机上)
  3. 从快照创建卷
  4. 从glance镜像创建卷
  5. 挂载卷(挂载卷到虚拟机,这一重新配置的操作会为虚拟机添加一块VMDK硬盘,用户必须在虚拟机内的客户操作系统中手动扫描并mount这块新的设备)
  6. 卸载卷
  7. 创建快照(支持这一操作当且仅当源卷没有被挂在到虚拟机上)
  8. 删除快照(支持这一操作当且仅当源卷没有被挂在到虚拟机上)
  9. 作为镜像上传到glance(支持这一操作当且仅当源卷没有被挂在到虚拟机上)

VMware VMDK driver的使用约束

  1. 必须是共享存储(NFS, iSCSI, FiberChannel, and vSAN)。
  2. 必须与Nova的VMware driver配合使用。

影子虚拟机(Shadow VM)

要想理解VMware在cinder中怎样实现VMDK driver,就需要理解影子虚拟机(Shadow VM)这个概念。

ShadowVM

在上面这幅图里,可以看到一个名字以“volume”开头的虚拟机,这个虚拟机就是影子虚拟机,它挂载着一块vmdk,但是它永远也不会启动,之所以影子虚拟机会存在,是因为VMware的对象模型中卷是从属于虚拟机的二级对象,不能独立于虚拟机而存在,所以创建卷在VMware中不是一个独立的操作,它只能是创建虚拟机的一部分。而cinder认为卷是独立的一种对象。这种冲突就导致在实现driver时,每一个volume即vmdk都和一个影子虚拟机关联,很多高级功能的实现也依赖于影子虚拟机的特性,如快照、链接克隆等。而影子虚拟机本身只会在VMware的界面上看到,对于openstack的云用户来说是不可见不可操作的。

VMware VMDK driver中卷操作的实现解读

create volume

vmdk driver没有真正的创建卷的实体,只是校验了一下创卷的卷规格,即self._verify_volume_creation(volume)校验方法就是查找是否有满足要求的datastore可以用来容纳卷,即self._select_ds_for_volume(volume)真正的创建卷将延迟到第一次挂载卷的时候,随着创建影子虚拟机而完成。之所以这样延迟创建,是为了将卷创建在虚拟机所在主机能够访问的datastore上,最大限度地避免主机连接不到datastore也就是虚拟机挂不了卷这种情况下,而不得不进行的在不同datastore上迁移卷的开销。

attach volume

当挂载卷的请求发出后,下面三个流程之一就会发生:

  • 如果卷从未被挂载,则卷及其影子虚拟机还不存在,则在将要挂卷的虚拟机所在主机的可见datastore里会创建卷及其影子虚拟机,将卷从影子虚拟机上卸载,挂给要求的虚拟机。

  • 如果卷已经被挂载过,且卷及其影子虚拟机所在的datastore对于要挂卷的虚拟机所在主机也是可见的,则直接将卷挂载给要求的虚拟机即可。

  • 如果卷已经被挂载过,但是卷及其影子虚拟机所在的datastore对于要挂卷的虚拟机所在主机是不可见的,则Storage vMotion将会被调用,将卷迁移到主机可见的datastore上,然后挂给要求的虚拟机。

create snapshot

  1. 卷只有在available状态下(即没有挂载到虚拟机上且正常的卷),才允许做卷快照。
  2. 这个卷如果没有影子虚拟机说明其从没有被使用过,直接返回。(这时候做快照没有意义)
  3. 最后真正开始做卷快照实际上是在将卷挂载到影子虚拟机上,对影子虚拟机做虚拟机快照。
task = self._session.invoke_api(self._session.vim,
                                'CreateSnapshot_Task',
                                backing, name=name,
                                description=description,
                                memory=False, quiesce=quiesce)

create cloned volume

这个driver接口实现的功能就是前面提到的通过源卷创建一个新卷。其过程大致是这样的:

  1. 校验新建卷的参数,实际上就是看是否可以找到满足条件的datastore创建该卷
  2. 源卷如果没有影子虚拟机说明其从没有被使用过,直接返回。
  3. 创建一个存储上与源卷相同规格的新的影子虚拟机,将其vmdk文件删除,将源卷的vmdk文件拷贝一份,作为新的影子虚拟机的vmdk文件。
  4. 如果新创建的卷大小>源卷大小,则extend_virtual_disk。

参考

http://cloudarchitectmusings.com/2013/11/19/laying-cinder-block-volumes-in-openstack-part-2-integration-with-vsphere/

发表回复