cinder-backup对接分析

Cinder 的 backup 功能是由 cinder-backup 服务提供的,devstack 默认没有启用该服务,需要手工启用。与 cinder-volume 类似,cinder-backup 也通过 driver 架构支持多种备份 backend,包括 POSIX 文件系统、NFS、Ceph、GlusterFS、Swift 和 IBM TSM。支持的driver 源文件放在 /opt/stack/cinder/cinder/backup/drivers/

  • 设置cinder.conf
[default]
backup_driver = cinder.backup.drivers.nfs
backup_mount_point_base = /backup_mount # 注意,这个配置是错误的,下面会说明。
backup_share = 172.24.3.96:/ozb_nfs_glance_volume_236
  • 启动进程:
cinder-backup --config-file /etc/cinder/cinder.conf  >> /opt/stack/logs/cinder-backup.log

cinder service-list 显示cinder-backup服务状态为UP即成功启动:

图片.png

尝试创建一个备份:

[ubuntu@localhost ~]$ cinder backup-create iscsi_volume1

发现cinder-backup日志提示:


图片.png

像是权限异常,为什么会出现这个问题?
检查日志,cinder-backup 做 self._execute('mkdir', '-p', mount_path, check_exit_code=0) 时候出错,这里是调用os_brick.privileged.rootwrap.execute(*cmd, **kwargs)。通过源码:

def execute(*cmd, **kwargs):
    """NB: Raises processutils.ProcessExecutionError on failure."""
    run_as_root = kwargs.pop('run_as_root', False)
    kwargs.pop('root_helper', None)

    try:
        if run_as_root:
            return execute_root(*cmd, **kwargs)
        else:
            return putils.execute(*cmd, **kwargs)

需要传入参数run_as_root=True,才会用root权限执行指令。而cinder-backup没有传入这个参数,对于这个指令操作没有要求root权限执行。
而我之前设置的备份目录backup_mount_point_base = /backup_mount,放在根目录了,需要root权限才行操作!说明openstack的设计就是希望备份目录放在用户目录下。

解决方法: 官方文档里定义了backup_mount_point_base 默认为 $state_path/backup_mount, $state_path即cinder.conf里state_path = /opt/stack/data/cinder。我们直接把配置文件里backup_mount_point_base删了,让它使用默认的路径就可以了;或者定义一个用户目录下的路径。

正确的cinder.conf配置:

[default]
backup_driver = cinder.backup.drivers.nfs
backup_share = 172.24.3.96:/ozb_nfs_glance_volume_236

创建备份

指令:

usage: cinder backup-create [--container <container>] [--name <name>]
                            [--description <description>] [--incremental]
                            [--force] [--snapshot-id <snapshot-id>]
                            <volume>

[--force] 如果卷的状态是in-use,被挂载在某虚机上,需要用这个参数强行创建备份
[--name <name>] 备份的名字
[--incremental] 表示可以执行增量备份,如果不带这个参数就是全量备份。
[--description <description>] 说明
[--container <container>] 存放备份文件的目录

例:

[root@node1 cinder]# cinder backup-create  netapp_volume1 --force
+-----------+--------------------------------------+
| Property  | Value                                |
+-----------+--------------------------------------+
| id        | d445c344-99f2-4b33-a98d-767c77aaa659 |
| name      | None                                 |
| volume_id | 43f962b7-f4d4-4f6e-a1fd-c0cc0e7e2c42 |
+-----------+--------------------------------------+
[root@node1 cinder]# cinder backup-show d445c344-99f2-4b33-a98d-767c77aaa659
+-----------------------+--------------------------------------------+
| Property              | Value                                      |
+-----------------------+--------------------------------------------+
| availability_zone     | nova                                       |
| container             | d4/45/d445c344-99f2-4b33-a98d-767c77aaa659 |
| created_at            | 2017-07-06T09:39:58.000000                 |
| data_timestamp        | 2017-07-06T09:39:58.000000                 |
| description           | None                                       |
| fail_reason           | None                                       |
| has_dependent_backups | False                                      |
| id                    | d445c344-99f2-4b33-a98d-767c77aaa659       |
| is_incremental        | False                                      |
| name                  | None                                       |
| object_count          | 21                                         |
| size                  | 6                                          |
| snapshot_id           | None                                       |
| status                | available                                  |
| updated_at            | 2017-07-06T09:46:59.000000                 |
| volume_id             | 43f962b7-f4d4-4f6e-a1fd-c0cc0e7e2c42       |
+-----------------------+--------------------------------------------+

逻辑流程:

  1. 启动 backup 操作,创建一个目录/backup_mount/cc25579711b2c5b9989005239d0f15a5 来mount NFS。cc25579711b2c5b9989005239d0f15a5是配置项backup_share的hash值。
  2. 创建 volume 的临时快照。
  3. 创建存放 backup 的 Container 目录。目录名为 backup_id[0:2]/backup_id[2:4]/id。比如
    backup: 3c49b86d-04bf-4e89-9317-510fee9e39ff
    container: 3c/49/3c49b86d-04bf-4e89-9317-510fee9e39ff
  4. 对临时快照数据进行压缩,并保存到 container 目录。
  5. 创建并保存 sha256(加密)文件和 metadata 文件。
  6. 删除临时快照。

container目录截图:


图片.png

container包含三种文件:

  1. backup-00001,压缩后的 backup 文件。
  2. backup_metadata,metadata 文件。
  3. backup_sha256file,加密文件。

恢复备份:

指令:

usage: cinder backup-restore [--volume <volume>] [--name <name>] <backup>

[--volume <volume>] 指定一个空卷对象,用于还原。
[--name <name>] 如果没有带参数[--volume <volume>],系统会自动创建一个size等于buckup的、名字为name的空卷,用于还原

根据backup_id恢复卷:
cinder backup-restore 2311d9c7-5bfc-47cb-b2ae-858f67f46733
2311d9c7-5bfc-47cb-b2ae-858f67f46733是由一个volume_type为“vmware-type”的卷创建的backup-id。恢复出的卷的卷类型变成了None。

图1.png

检查cinder.config里没有配置默认卷类型,所以我加上了配置default_volume_type = vmware-type,再backup-restore一次,还原出来的卷类型就是“vmware-type”了:

图片.png

总结 backup-restore 两种用法:
(1)cinder backup-restore <backup> [--name <name>] 系统会选用配置好的默认卷类型创建一个空卷用于还原,如果没有配置默认卷类型,那这个空卷的类型会显示None。
(2)先自己用某个卷类型创建一个size不小于backup的空卷,然后cinder backup-restore <backup> [--volume <volume>] 还原。

逻辑流程:

  1. 启动 restore 操作,mount NFS。
  2. 读取 Container 目录中的 metadata。
  3. 将数据解压并写到 volume 中。
  4. 恢复 volume 的 metadata,完成 restore 操作。

==代码分析尚未完成==

rootwrap简单介绍:

使用rootwrap的目的就是针对系统某些特定的操作,让非特权用户以root用户的身份来安全地执行这些操作

rootwrap 的配置文件是/etc/cinder/rootwrap.conf:

[DEFAULT]
# List of directories to load filter definitions from (separated by ',').
# These directories MUST all be only writeable by root !
filters_path=/etc/cinder/rootwrap.d

其中filters_path 指定了若干过滤器文件所在的目录,这个目录有个volume.filters 文件。这个是过滤器文件,定义了很多具体命令的相关信息,如命令的应用场景,命令封装所调用的过滤器,命令的执行权限和命令的执行参数等等。

[Filters]
# cinder/volume/iscsi.py: iscsi_helper '--op' ...
ietadm: CommandFilter, ietadm, root
tgtadm: CommandFilter, tgtadm, root
iscsictl: CommandFilter, iscsictl, root
tgt-admin: CommandFilter, tgt-admin, root
cinder-rtstool: CommandFilter, cinder-rtstool, root
scstadmin: CommandFilter, scstadmin, root

用于命令行封装过滤的过滤器有很多,实际上共有CommandFilter、RegExpFilter、PathFilter、KillFilter、ReadFileFilter、IpFilter、EnvFilter、ChainingFilter和IpNetnsExecFilter共9种;这些过滤器类都以CommandFilter为父类,它们的具体区别主要体现在其方法match上,所以这9种过滤器主要是根据不同命令应用不同的匹配方式而区分实现的。

rootwarp实现的具体步骤就是:

  1. 命令行解析
  2. 读取解析配置文件
  3. 加载过滤器文件中定义的所有命令行过滤对象
  4. 匹配到具体的命令行过滤对象
  5. 通过rootwrap的封装获取具体的命令行实现
  6. 派生一个子进程来执行命令行

实际上就是把命令行:
sudo nova-rootwrap /etc/nova/rootwrap.conf cat /etc/iscsi/initiatorname.iscsi
经过若干参数处理和匹配操作转化为:
sudo -u XXXX /bin/cat /etc/iscsi/initiatorname.iscsi
之后,启动一个子进程来实现这个命令行的执行操作;类似如下:


图片.png

kolla环境的rootwrap.d可以在容器里的/etc/cinder目录找到

参考:

《Backup Volume 操作 - 每天5分钟玩转 OpenStack(59)》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容

  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,016评论 2 34
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 98,505评论 9 468
  • 一生中我们每个人都会遇到无数的人,但是能和自己有交集的都是缘分,如果能成为好友的都是命中注定。我们走过的路没有白...
    爱吃鱼豆腐的小猫阅读 243评论 0 0
  • 昨天你是谁今天你又是谁我认识同样的你似乎又判若两人有时候不敢看你的脸你的心事写满了天空我要是懂得绘画的话定会在你烦...
    方夏阅读 156评论 0 2
  • 黄昏下的小家 似乎让我忘掉了世界这个概念 这就是我的世界 庭院里嬉笑着争吃的鸡 一黑一百躺在地上摇着尾巴的小狗 也...
    静者归心阅读 101评论 0 3