赞
踩
LVMDriver下:
1. 创建raw格式的卷:_create_raw_volume
lvmDriver下最终调用LVM:create_volume函数:
lvcreate -T -V size_str -n name pool_path(支持thin)或
lvcreate -L size_str -n name vg_name
2. 从快照创建卷:drive.create_volume_from_snapshot
lvmDriver首先调用LVM:create_volume函数创建一个空卷,
拷贝快照数据到空卷中(dd或file拷贝)
3. 从已有卷创建卷:_create_from_source_volume
lvmVolumeDriver调用LVM:create_cloned_volume函数:
先对卷做快照(这个快照后来被删除):lvcreate --name name --snapshotvg_name/source_lv_name
然后走从快照创建卷的流程
4. 从image创建卷:driver.clone_image
lvmVolumeDriver先做镜像处理,得到相关参数
然后调用LVM:create_cloned_volume函数,走从已有卷创建卷的流程:
5. source_replica创建卷:基于flash的full_Copy
RBDDriver下:
6. 创建raw格式的卷:_create_raw_volume
RBDDriver调用函数基本过程:
创建一个Rados的连接;
初始化一个RBD类实例,用来创建镜像(就是卷);
调用create函数self.RBDProxy().create(…),最终会调用librbd.rbd_create函数
7. 从快照创建卷:drive.create_volume_from_snapshot
RBDDriver调用函数过程:
创建一个Rados的连接;
初始化一个RBD类实例,用来创建镜像(就是卷);
调用clone函数self.RBDProxy().clone (…),最终会调用librbd.rbd_clone函数
如果卷和快照要分离,最终会调用librbd.rbd_flatten函数
8. 从已有卷创建卷:_create_from_source_volume
该函数根据rbd_max_clone_depth的值确定是否需要flatten。判断源卷是第几代克隆卷,如果不是克隆卷,则为0.
当rbd_max_clone_depth <=0,说明源卷不是克隆卷,直接调用librbd.rbd_copy函数做数据全拷贝到一个新盘;
当rbd_max_clone_depth=5,需要将源卷先flatten(即源卷是某卷的第五代clone子孙,则需要和以前的父辈脱离关系);然后调用librbd函数:创建快照、保护快照、克隆快照。
当0<rbd_max_clone_depth<5,直接调用librbd函数:创建快照librbd.rbd_snap_create、保护快照librbd.rbd_snap_protect、克隆快照librbd.rbd_clone。
总之最后都用的是librbd.rbd_copy或librbd.rbd_clone函数接口。
9. 从image创建卷:driver.clone_image
如果镜像支持克隆(url是rbd://aaa/bbb/ccc/ddd格式),直接通过url的解析获取参数,调用librbd.rbd_clone函数,创建卷。
如果镜像不支持克隆(url是cinder://xxxx格式),这通过镜像id查询数据库,获取镜像信息。然后调用从卷创建卷的流程。
10. source_replica创建卷:基于flash的full_Copy
小结:
在代码中用到的RBDVolumeProxy下的copy函数,会用到Image类的copy函数,最后调用librbd.rbd_copy函数
在代码中用到的RBDProxy().clone函数,会用到RBD类的clone函数,最后调用librbd.rbd_clone函数
复用规律(LVMDriver和RBDDriver都类似):
“从镜像创建卷”会复用到“从卷创建卷”
“从卷创建卷”会复用到“从快照创建卷”
“从快照创建卷”会复用到“创建新卷”
由繁到简顺序:“从镜像创建卷”à“从卷创建卷”à“从快照创建卷”à“创建新卷”
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。