Nova与Cinder进行交互挂载卷的流程如下:
1)Nova通过命令nova volume-attach server volume device-name或者HTTP请求发起卷挂载请求。
2)Nova获取可用的挂载点,若指定了挂载点则验证其有效性,若没有则找出一个有效的挂载点,同时创建数据库信息。
3)Nova向Cinder发送请求,获取Cinder回复的卷信息。
4)Nova检查卷的状态,若volume['status']!='available',则抛出400异常。
5)如果volume状态为可用,向Cinder发送请求,保留这个盘,避免被别人使用。
6)Nova获取connector,得到connector信息。
表3-1 Cinder对存储设备及Ceph的支持
7)将上一步得到的connector和volume-id发送给Cinder,初始化连接接口,获取iscsi的connection_info,Cinder返回connection_info。
8)若第6)、第7)步有异常(不区分异常种类,所有异常都一样),则给Cinder发送unreserve请求,修改卷的状态。
9)Nova调用驱动挂载卷到宿主机上,Nova默认是调用LibvirtISCSIVolumeDriver驱动的connect_volume方法,该方法用libvirt执行一些相关的iscsi命令挂载云硬盘到宿主机上,然后调用libvirt将该卷挂载到虚拟机上去。若在挂载卷到虚拟机过程中出现异常,则将前面卷挂载到宿主机这一步操作撤销,执行的是LibvirtISCSIVolumeDriver驱动的disconnect_volume方法。至此,挂载过程完成。
10)Nova给Cinder发送请求挂载信息,通知Cinder此卷已经完成宿主机虚拟机挂载过程,Cinder收到请求后,进行挂载。从Cinder的代码上看,并未做什么操作,只是将信息更新到数据库而已,将卷的状态改为in-use。
11)Nova更新数据库,主要把connection_info信息更新进去。