cinder-backup對接分析

Cinder 的 backup 功能是由 cinder-backup 服務(wù)提供的,devstack 默認沒有啟用該服務(wù),需要手工啟用。與 cinder-volume 類似,cinder-backup 也通過 driver 架構(gòu)支持多種備份 backend,包括 POSIX 文件系統(tǒng)、NFS、Ceph、GlusterFS、Swift 和 IBM TSM。支持的driver 源文件放在 /opt/stack/cinder/cinder/backup/drivers/

  • 設(shè)置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服務(wù)狀態(tài)為UP即成功啟動:

圖片.png

嘗試創(chuàng)建一個備份:

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

發(fā)現(xiàn)cinder-backup日志提示:


圖片.png

像是權(quán)限異常,為什么會出現(xiàn)這個問題?
檢查日志,cinder-backup 做 self._execute('mkdir', '-p', mount_path, check_exit_code=0) 時候出錯,這里是調(diào)用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)

需要傳入?yún)?shù)run_as_root=True,才會用root權(quán)限執(zhí)行指令。而cinder-backup沒有傳入這個參數(shù),對于這個指令操作沒有要求root權(quán)限執(zhí)行。
而我之前設(shè)置的備份目錄backup_mount_point_base = /backup_mount,放在根目錄了,需要root權(quán)限才行操作!說明openstack的設(shè)計就是希望備份目錄放在用戶目錄下。

解決方法: 官方文檔里定義了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

創(chuàng)建備份

指令:

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

[--force] 如果卷的狀態(tài)是in-use,被掛載在某虛機上,需要用這個參數(shù)強行創(chuàng)建備份
[--name <name>] 備份的名字
[--incremental] 表示可以執(zhí)行增量備份,如果不帶這個參數(shù)就是全量備份。
[--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 操作,創(chuàng)建一個目錄/backup_mount/cc25579711b2c5b9989005239d0f15a5 來mount NFS。cc25579711b2c5b9989005239d0f15a5是配置項backup_share的hash值。
  2. 創(chuàng)建 volume 的臨時快照。
  3. 創(chuàng)建存放 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. 對臨時快照數(shù)據(jù)進行壓縮,并保存到 container 目錄。
  5. 創(chuàng)建并保存 sha256(加密)文件和 metadata 文件。
  6. 刪除臨時快照。

container目錄截圖:


圖片.png

container包含三種文件:

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

恢復(fù)備份:

指令:

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

[--volume <volume>] 指定一個空卷對象,用于還原。
[--name <name>] 如果沒有帶參數(shù)[--volume <volume>],系統(tǒng)會自動創(chuàng)建一個size等于buckup的、名字為name的空卷,用于還原

根據(jù)backup_id恢復(fù)卷:
cinder backup-restore 2311d9c7-5bfc-47cb-b2ae-858f67f46733
2311d9c7-5bfc-47cb-b2ae-858f67f46733是由一個volume_type為“vmware-type”的卷創(chuàng)建的backup-id?;謴?fù)出的卷的卷類型變成了None。

圖1.png

檢查cinder.config里沒有配置默認卷類型,所以我加上了配置default_volume_type = vmware-type,再backup-restore一次,還原出來的卷類型就是“vmware-type”了:

圖片.png

總結(jié) backup-restore 兩種用法:
(1)cinder backup-restore <backup> [--name <name>] 系統(tǒng)會選用配置好的默認卷類型創(chuàng)建一個空卷用于還原,如果沒有配置默認卷類型,那這個空卷的類型會顯示None。
(2)先自己用某個卷類型創(chuàng)建一個size不小于backup的空卷,然后cinder backup-restore <backup> [--volume <volume>] 還原。

邏輯流程:

  1. 啟動 restore 操作,mount NFS。
  2. 讀取 Container 目錄中的 metadata。
  3. 將數(shù)據(jù)解壓并寫到 volume 中。
  4. 恢復(fù) volume 的 metadata,完成 restore 操作。

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

rootwrap簡單介紹:

使用rootwrap的目的就是針對系統(tǒng)某些特定的操作,讓非特權(quán)用戶以root用戶的身份來安全地執(zhí)行這些操作

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 文件。這個是過濾器文件,定義了很多具體命令的相關(guān)信息,如命令的應(yīng)用場景,命令封裝所調(diào)用的過濾器,命令的執(zhí)行權(quán)限和命令的執(zhí)行參數(shù)等等。

[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為父類,它們的具體區(qū)別主要體現(xiàn)在其方法match上,所以這9種過濾器主要是根據(jù)不同命令應(yīng)用不同的匹配方式而區(qū)分實現(xiàn)的。

rootwarp實現(xiàn)的具體步驟就是:

  1. 命令行解析
  2. 讀取解析配置文件
  3. 加載過濾器文件中定義的所有命令行過濾對象
  4. 匹配到具體的命令行過濾對象
  5. 通過rootwrap的封裝獲取具體的命令行實現(xiàn)
  6. 派生一個子進程來執(zhí)行命令行

實際上就是把命令行:
sudo nova-rootwrap /etc/nova/rootwrap.conf cat /etc/iscsi/initiatorname.iscsi
經(jīng)過若干參數(shù)處理和匹配操作轉(zhuǎn)化為:
sudo -u XXXX /bin/cat /etc/iscsi/initiatorname.iscsi
之后,啟動一個子進程來實現(xiàn)這個命令行的執(zhí)行操作;類似如下:


圖片.png

kolla環(huán)境的rootwrap.d可以在容器里的/etc/cinder目錄找到

參考:

《Backup Volume 操作 - 每天5分鐘玩轉(zhuǎn) OpenStack(59)》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數(shù)據(jù)革命閱讀 13,203評論 2 33
  • Ubuntu的發(fā)音 Ubuntu,源于非洲祖魯人和科薩人的語言,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲de夢閱讀 100,608評論 9 468
  • 一生中我們每個人都會遇到無數(shù)的人,但是能和自己有交集的都是緣分,如果能成為好友的都是命中注定。我們走過的路沒有白...
    愛吃魚豆腐的小貓閱讀 300評論 0 0
  • 黃昏下的小家 似乎讓我忘掉了世界這個概念 這就是我的世界 庭院里嬉笑著爭吃的雞 一黑一百躺在地上搖著尾巴的小狗 也...
    靜者歸心閱讀 136評論 0 3
  • 好好愛自己
    85ccafcd08ab閱讀 241評論 0 0

友情鏈接更多精彩內(nèi)容