glusterfs.py文件html
cinder/volume/drivers/glusterfs.py就是cinder调用glusterfs的驱动了python
glusterfs.py只有一个GlusterfsDriver class,以下图所示linux
from os_brick.remotefs import remotefs as remotefs_brick # client端操做 from oslo_concurrency import processutils from oslo_config import cfg from oslo_log import log as logging from oslo_utils import fileutils from oslo_utils import units from cinder import exception from cinder.i18n import _, _LE, _LI, _LW from cinder.p_w_picpath import p_w_picpath_utils from cinder import utils from cinder.volume import driver # 不少定义的方法还没具体实现 from cinder.volume.drivers import remotefs as remotefs_drv # 基类 class GlusterfsDriver(remotefs_drv.RemoteFSSnapDriver, driver.CloneableVD, driver.ExtendVD): """Gluster based cinder driver. Creates file on Gluster share for using it as block device on hypervisor. Operations such as create/delete/extend volume/snapshot use locking on a per-process basis to prevent multiple threads from modifying qcow2 chains or the snapshot .info file simultaneously. """
class GlusterfsDriver的父类remotefs_drv.RemoteFSSnapDriver(主要看这个)后端
cinder/volume/drivers/remotefs.py有两个class,类RemoteFSSnapDriver从类RemoteFSDriver继承安全
class RemoteFSSnapDriver(RemoteFSDriver, driver.SnapshotVD): """Base class for remotefs drivers implementing qcow2 snapshots. Driver must implement: _local_volume_dir(self, volume) """
类RemoteFSSnapDriver主要是针对volume snapshot的一系列操做。ide
类RemoteFSDriver能够认为是一个base class,里面定义了不少基本方法ui
上面提到的class都是关于server端的封装。spa
client端的封装已经独立为一个项目:os-brick
.net
os_brick/remotefs/remotefs.py,只有一个class RemoteFsClient,右边是类中定义的方法。
3d
cinder后端是glusterfs做为openstack的附加盘来使用,glusterfs自己没有快照机制,云硬盘快照是经过qemu来实现的,代码位置:
cinder作快照的时候,分为两种:
一、volume available的时候,cinder使用qemu-img直接作快照
二、volume in-use的时候,cinder会call nova来完成
cinder/volume/drivers/remotefs.py
qemu-img rebase的做用见这里:http://linux.die.net/man/1/qemu-img
-u是非安全模式,适用于backing-file重命名和移动
简而言之,就是对比backing_filename和旧的backing_filename的差别部分写入new_snap_path
关于Cinder QuiescedSnapshot介绍:
https://wiki.openstack.org/wiki/Cinder/QuiescedSnapshotWithQemuGuestAgent
cinder删除快照的时候,分为两种:
一、volume available的时候,cinder使用qemu-img直接删除快照
二、volume in-use的时候,cinder会先计算快照链如何整合( 须要Libvirt版本'1.2.7'以上),最终call nova来完成
大体流程:
cinder/volume/drivers/remotefs.py ->> cinder/volume/drivers/glusterfs.py ->> cinder/compute/nova.py ->> novaclient/v1_1/contrib/assisted_volume_snapshots.py ->> novaclient/base.py ->> nova/virt/libvirt/driver.py
nova/virt/libvirt/driver.py:
这里能够看到Cinder QuiescedSnapshot,第一次会先尝试作Quiesce快照,若是抛异常了,就执行下面不带Quiesce的快照。
cinder run unit test http://docs.openstack.org/developer/cinder/devref/unit_tests.html