前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >从ceph对象中提取RBD中的指定文件

从ceph对象中提取RBD中的指定文件

作者头像
用户2772802
发布于 2018-08-06 01:44:36
发布于 2018-08-06 01:44:36
5K00
代码可运行
举报
文章被收录于专栏:磨磨谈磨磨谈
运行总次数:0
代码可运行

前言

之前有个想法,是不是有办法找到rbd中的文件与对象的关系,想了很久但是一直觉得文件系统比较复杂,在fs 层的东西对ceph来说是透明的,并且对象大小是4M,而文件很小,可能在fs层进行了合并,应该很难找到对应关系,最近看到小胖有提出这个问题,那么就再次尝试了,现在就是把这个实现方法记录下来 这个提取的作用个人觉得最大的好处就是一个rbd设备,在文件系统层被破坏以后,还能够从rbd提取出文件,我们知道很多情况下设备的文件系统一旦破坏,无法挂载,数据也就无法读取,而如果能从rbd中提取出文件,这就是保证了即使文件系统损坏的情况下,数据至少不丢失

本篇是基于xfs文件系统情况下的提取,其他文件系统有时间再看看,因为目前使用的比较多的就是xfs文件系统

本篇也回答了一个可能会经常被问起的问题,能告诉我虚拟机里面的文件在后台存储在哪里么,看完本篇就知道存储在哪里了

XFS文件系统介绍

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# mkfs.xfs -f /dev/rbd0p1 warning: device is not properly aligned /dev/rbd0p1
meta-data=/dev/rbd0p1            isize=256    agcount=9, agsize=162816 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0data     =                       bsize=4096   blocks=1310475, imaxpct=25
         =                       sunit=1024   swidth=1024 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=8 blks, lazy-count=1realtime =none                   extsz=4096   blocks=0, rtextents=0

XFS文件系统采取是AG管理的,每个AG维护自己的inode和数据,所以XFS文件系统是一种很容易扩展的文件系统,本篇里面主要用到的命令是xfs_bmap这个命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# xfs_bmap -lvp /etc/fstab/etc/fstab:
 EXT: FILE-OFFSET      BLOCK-RANGE        AG AG-OFFSET        TOTAL FLAGS   0: [0..7]:          26645424..26645431  1 (431024..431031)     8 00000

一个文件最小就是8个block(512b),也就是4k,这个因为上面默认的xfs的格式化就是data bsize=4K,这个值可以自行调整的,本篇尽量用默认常规的参数来讲例子

查看man xfs_bmap这个命令可以看到:

Holes are marked by replacing the startblock..endblock with hole. All the file offsets and disk blocks are in units of 512-byte blocks, no matter what the filesystem’s block size is.

意思是这个查询到的里面的计数单位都是512-byte,不管上层设置的block大小是多少,我们知道文件系统底层的sector就是512-byte,所以这个查询到的结果就可以跟当前的文件系统的sector的偏移量联系起来,这里强调一下,这个偏移量的起始位子为当前文件系统所在分区的偏移量,如果是多分区的情况,在计算整个偏移量的时候就要考虑分区的偏移量了,这个会在后面用实例进行讲解的

rbd的对象是不清楚内部分区的偏移量,所以在rbd层进行提取的时候是需要得到的是分区当中的文件相对整个磁盘的一个sector的偏移量

rbd的对象结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# rados -p rbd ls|grep datarbd_data.25a636b8b4567.00000000000009ff
rbd_data.25a636b8b4567.00000000000001dd
rbd_data.25a636b8b4567.0000000000000000rbd_data.25a636b8b4567.000000000000009f
rbd_data.25a636b8b4567.0000000000000459rbd_data.25a636b8b4567.000000000000027e
rbd_data.25a636b8b4567.00000000000004ff
rbd_data.25a636b8b4567.000000000000027c
rbd_data.25a636b8b4567.000000000000027d
rbd_data.25a636b8b4567.0000000000000001rbd_data.25a636b8b4567.000000000000013e
rbd_data.25a636b8b4567.00000000000003ba
rbd_data.25a636b8b4567.000000000000031b
rbd_data.25a636b8b4567.00000000000004f8

rbd被xfs格式化以后会产生一些对象,这些对象是以16进制名称的方式存储在后台的,也就是rbd大小一定的情况下对象数目是一定的,也就是名称也是一定的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# parted -s /dev/rbd0 unit s printModel: Unknown (unknown)
Disk /dev/rbd0: 20971520s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start      End        Size       File system  Name     Flags 1      1953s      10485759s  10483807s  xfs          primari 2      10485760s  20963327s  10477568s               primari

上面可以看到rbd0的sector个数为20971520s 20971520s*512byte=10737418240byte=10485760KB=10240MB sector的大小一定,总rbd大小一定的情况下sector的数目也是一定的,本篇实例的rbd大小

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# rbd info zprbd image 'zp':
    size 10000 MB in 2500 objects
    order 22 (4096 kB objects)
    block_name_prefix: rbd_data.25a776b8b4567
    format: 2
    features: layering
    flags: 
    create_timestamp: Sat Jul 22 18:04:12 2017

sector和ceph object的对应关系的查询

这个就像个map一样,需要把这个关系给找到,一个sector的区间对应到object的map,这里我用python写个简单的方法来做查询,也可以自己用其他语言来实现

首先查询到rbd的对象数目

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# rbd info zprbd image 'zp':
    size 10000 MB in 2500 objects
    order 22 (4096 kB objects)
    block_name_prefix: rbd_data.25a776b8b4567
    format: 2
    features: layering
    flags: 
    create_timestamp: Sat Jul 22 18:04:12 2017

处理脚本如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vim getsecob.py

添加下面内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#! /bin/python# *-* conding=UTF-8 *-*import commands

def main():
    getmap(2500)

def getmap(object):
    sector=int(object)*4096*1024/512
    print "object:"+str(object)
    print "sector:"+str(sector)
    incre=sector/object    for item in range(int(object)):
        a=int(item*8192)
        b=int((item+1)*8192-1)
        print str([a,b])+"  -->  "+"%016x" %itemif __name__ == '__main__':
    main()

其中getmap后面为对象数目 输出是这个形式的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# python getsecob.pyobject:2500sector:20480000[0, 8191]  -->  0000000000000000[8192, 16383]  -->  0000000000000001[16384, 24575]  -->  0000000000000002[24576, 32767]  -->  0000000000000003[32768, 40959]  -->  0000000000000004[40960, 49151]  -->  0000000000000005···

对rbd0进行分区,分区后的结果如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# parted -s /dev/rbd0 unit s printModel: Unknown (unknown)
Disk /dev/rbd0: 20480000s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start      End        Size       File system  Name     Flags 1      1953s      10240000s  10238048s               primari 2      10248192s  20471807s  10223616s               primari

这个是个测试用的image,大小为10G分成两个5G的分区,现在我们在两个分区里面分别写入两个测试文件,然后经过计算后,从后台的对象中把文件读出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mount /dev/rbd0p1 /mnt1
mount /dev/rbd0p2 /mnt2
cp /etc/fstab /mnt1
cp /etc/hostname /mnt2

首先获取文件在分区上的sector的偏移量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# xfs_bmap -lvp /mnt1/fstab /mnt1/fstab:
 EXT: FILE-OFFSET      BLOCK-RANGE      AG AG-OFFSET        TOTAL FLAGS   0: [0..7]:          8224..8231        0 (8224..8231)         8 01111

可以得到是(8224..8231)共8个sector 从上面的分区1的start的sector可以知道起始位置是1953,那么相对于磁盘的偏移量就变成了

(8224+1953..8231+1953) = (10177..10184)

这里说下,这个地方拿到偏移量后,直接通过对rbd设备进行dd读取也可以把这个文件读取出来,这个顺带讲下,本文主要是从对象提取:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dd if=/dev/rbd0 of=a bs=512 count=8 skip=10177

bs取512是因为sector的单位就是512b 这样就把刚刚的fstab文件读取出来了,skip就是文件的sector相对磁盘的起始位置,count就是文件所占的block数目

继续我们的对象提取方式,上面的(10177..10184)这个我们根据上面那个脚本输出的对象列表来找到对象

[8192, 16383] → 0000000000000001 获取名称,这个因为我的是测试环境,就只有一个匹配,多个image的时候要过滤出对用的rbd的对象,用prifix过滤即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# rados -p rbd ls|grep 0000000000000001rbd_data.25a776b8b4567.0000000000000001

下载对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# rados -p rbd get rbd_data.25a776b8b4567.0000000000000001 rbd_data.25a776b8b4567.0000000000000001

根据偏移量计算对象中的偏移量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
10177..10184[8192, 16383]  -->  0000000000000001

得到

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
10177-8192=1985dd if=rbd_data.25a776b8b4567.0000000000000001 of=a bs=512 count=8 skip=1985

得到的文件a的内容即为之前文件的内容

准备取第二个分区的文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# xfs_bmap -lvp /mnt2/hostname /mnt2/hostname:
 EXT: FILE-OFFSET      BLOCK-RANGE      AG AG-OFFSET        TOTAL FLAGS   0: [0..7]:          8224..8231        0 (8224..8231)         8 01111

8224+10248192..8231+10248192=10256416..10256423

从磁盘方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# dd if=/dev/rbd0 of=a bs=512 count=8 skip=10256416

从对象方式 10256416..10256423 对应 [10256384, 10264575] → 00000000000004e4 对象偏移量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
10256416-10256384=32
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rados -p rbd get 
[root@lab8106 ~]# rados -p rbd get rbd_data.25a776b8b4567.00000000000004e4 rbd_data.25a776b8b4567.00000000000004e4

获取文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# dd if=rbd_data.25a776b8b4567.00000000000004e4 of=a bs=512 count=8 skip=32

如果文件比较大的情况,可能出现就是文件是跨对象的,那么还是跟上面的提取方法一样,然后进行提取后的文件进行合并即可

总结

在存储系统上面存储的文件必然会对应到底层磁盘的sector,而sector也是会一一对应到后台的对象的,这个在本文当中得到了验证,所以整个逻辑就是,在文件系统层找到文件对应的sector位置,然后再在底层把sector和对象关系找好,就能从找到文件在对象当中的具体的位置,也就能定位并且能提取了,本篇是基于xfs的,其他文件系统只要能定位文件的sector,就可以在底层找到文件,这个以后会补充其他文件系统进来

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 磨磨谈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
rbd的image对象数与能写入文件数的关系
对于这个问题,我原来的理解也是:对象默认设置的大小是4M一个,存储下去的数据,如果小于4M,就会占用一个小于4M的对象,如果超过4M,那么存储的数据就会进行拆分成多个4M,这个地方其实是不严谨的
用户2772802
2018/08/06
7250
Ceph数据盘怎样实现自动挂载
在Centos7 下,现在采用了 systemctl来控制服务,这个刚开始用起来可能不太习惯,不过这个服务比之前的服务控制要强大的多,可以做更多的控制,本节将来介绍下关于 Ceph的 osd 磁盘挂载的问题
用户2772802
2018/08/06
2.1K0
《大话 Ceph》 之 RBD 那点事儿
腾讯云TStack
2017/11/03
14.3K0
每天10分钟玩转Ceph(二)探索RBD块存储接口
部署完Ceph集群之后,如何在Ceph集群中存储文件呢?ceph提供了三种接口供用户使用,分别是:
HappyLau谈云计算
2020/03/02
4.9K0
每天10分钟玩转Ceph(二)探索RBD块存储接口
ceph-块存储客户端
ceph块设备,以前称为RADOS块设备,为客户机提供可靠性、分布式和高性能的块存储磁盘。RADOS块设备利用librbd库并以顺序的形式在ceph集群的多个osd上存储数据块。RBD是由ceph的RADOS层支持,因此每个块设备都分布在多个ceph节点上,提供了性能和优异的可靠性。RBD有linux内核的本地支持,这意味着RBD驱动程序从过去几年就与linux内核集成的很好。除了可靠性和性能外,RBD还提供了企业特性,例如完整和增量快照、瘦配置、写时复制克隆、动态调整大小等,RBD还支持内存缓存,这大大提高了性能。
yuezhimi
2020/09/30
3.1K0
RBD快速删除的方法分析与改进
这个问题在很久以前就有一篇文章进行过讨论 remove-big-rbd,这个文章写的比较清楚了,并且对不同的方法做了分析,这里先把结论说下
用户2772802
2018/08/06
1.2K0
如何避免Cephfs被完全毁掉
一套系统的最低要求是可恢复,也就是数据不丢失,但是在各种各样的原因下,整套系统都有被毁掉的可能,一直以来有个观点就是存储是需要两套的,一般情况下很难实现,但是如何把故障发生的概率降低到最低,这个是我们需要考虑的问题 最近在社区群里面又听闻一个案例,一套系统的文件系统被重置掉了,也就是fs被重建了,实际上这属于一个不应该有的操作,但是已经发生的事情,就看怎么样能在下次避免或者把损失降到最低,对于hammer版本来说,重建cephfs只是把目录树给冲掉了,实际的目录还是能创建起来,但是这其实是一个BUG,并且在最新的Jewel下已经解决掉这个问题,这就造成无法重建目录树,在Jewel下,在不修改代码的情况下,文件都可以扫描回来,但是全部塞到了一个目录下,对于某些场景来说,这个已经是最大限度的恢复了,至少文件还在,如果文件类型可知,也可以一个个去人工识别的,虽然工作量异常的大,但至少文件回来了,这种情况,如果有保留文件名和文件md5值的强制要求的话,文件是可以完全找回来的,当然,这都是一些防范措施,看有没有重视,或者提前做好了预备
用户2772802
2018/08/06
1.7K0
Cephfs的文件存到哪里了
在ceph里面使用rbd接口的时候,存储的数据在后台是以固定的prifix的对象存在的,这样就能根据相同的前缀对象去对image文件进行拼接或者修复
用户2772802
2018/08/06
1.6K0
Ceph OSD从filestore 转换到 bluestore的方法
前段时间看到豪迈的公众号上提到了这个离线转换工具,最近看到群里有人问,找了下没什么相关文档,就自己写了一个,供参考
用户2772802
2018/08/06
1.7K0
云服务器存储扩容详解
Linux操作系统:CentOS Linux release 7.6.1810 (Core)
HappyLau谈云计算
2020/01/14
31.1K2
云服务器存储扩容详解
处理Ceph osd的journal的uuid问题
一、前言 之前有一篇文章介绍的是,在centos7的jewel下面如果自己做的分区如何处理自动挂载的问题,当时的环境对journal的地方采取的是文件的形式处理的,这样就没有了重启后journal的磁盘偏移的问题 如果采用的是ceph自带的deploy去做分区的处理的时候,是调用的sgdisk去对磁盘做了一些处理的,然后deploy能够识别一些特殊的标记,然后去做了一些其他的工作,而自己分区的时候,是没有做这些标记的这样就可能会有其他的问题
用户2772802
2018/08/06
1.1K0
ceph的rbd备份软件ceph-backup
teralytics是一家国外的大数据公司,这个是他们开源的ceph的备份的工具,在twitter上搜索相关信息的时候看到,觉得不错就拿来试用一番
用户2772802
2018/08/06
2K0
rados put striper功能的调试
之前对于striper这个地方的功能并没研究太多,只是知道这个里面可以以条带方式并行的去写对象,从而加大并发性来提高性能,而默认的条带数目为1,也就是以对象大小去写,并没有条带,所以不是很好感觉到差别,今天就尝试下用rados命令来看下这个条带是怎么回事
用户2772802
2018/08/06
1.1K0
Ceph CookBook
原因:2017年5月4日 星期四 理解Ceph。 说明:阅读书籍。 官方文档:http://docs.ceph.com/docs/master/rbd/rbd-openstack/ 块存储、文件储存、对象存储:http://limu713.blog.163.com/blog/static/15086904201222024847744/ 可靠性、低成本、可扩展 SDS(软件定义存储-softwate defined storage) SDS可以降低存储基础设施的TCO(Total Cost of O
ZHaos
2019/02/27
1.6K0
rbd-mirror配置指南-单向备份
RBD 的 mirroring 功能将在Jewel中实现的,这个Jewel版本已经发布了很久了,这个功能已经在这个发布的版本中实现了,本来之前写过一篇文章,但是有几个朋友根据文档配置后,发现还是有问题,自己在进行再次配置的时候也发现有些地方没讲清楚,容易造成误解,这里对文档进行再一次的梳理
用户2772802
2018/08/06
1.9K0
rbd-mirror配置指南-单向备份
fio测试ceph的filestore
fio是一个适应性非常强的软件,基本上能够模拟所有的IO请求,是目前最全面的一款测试软件,之前在看德国电信的一篇分享的时候,里面就提到了,如果需要测试存储性能,尽量只用一款软件,这样从上层测试到底层去,才能更好的去比较差别
用户2772802
2018/08/06
2.5K1
fio测试ceph的filestore
Linux 磁盘管理命令:使用xfs 管理命令
在 GNU/Linux 中,管理 XFS 的工作主要使用 xfsprogs 中的一系列工具。
鱼多多
2025/01/12
1620
Linux 磁盘管理命令:使用xfs 管理命令
Jewel版本Ceph集群功能性能测试
参考文档 http://docs.ceph.com/docs/master/start/quick-start-preflight/#rhel-centos https://www.linuxidc.com/Linux/2017-09/146760.htm http://s3browser.com/ http://docs.ceph.org.cn/man/8/rbd/ https://hub.packtpub.com/working-ceph-block-device/# https://github.co
三杯水Plus
2018/11/14
1.2K0
centos 查看磁盘分区的文件系统类型
查看已格式化分区的 UUID 和文件系统。使用 blkid 可以输出分区或分区的文件系统类型,查看 TYPE 字段输出。
Qicloud-W
2023/03/07
5.3K0
Ceph删除OSD上一个异常object
ceph里面的数据是以对象的形式存储在OSD当中的,有的时候因为磁盘的损坏或者其它的一些特殊情况,会引起集群当中的某一个对象的异常,那么我们需要对这个对象进行处理
用户2772802
2018/08/06
1.5K0
相关推荐
rbd的image对象数与能写入文件数的关系
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验