Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >从ceph对象中提取RBD中的指定文件

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

作者头像
用户2772802
发布于 2018-08-06 01:44:36
发布于 2018-08-06 01:44:36
6.3K00
代码可运行
举报
文章被收录于专栏:磨磨谈磨磨谈
运行总次数: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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
《大话 Ceph》 之 RBD 那点事儿
腾讯云TStack
2017/11/03
14.5K0
rbd的image对象数与能写入文件数的关系
对于这个问题,我原来的理解也是:对象默认设置的大小是4M一个,存储下去的数据,如果小于4M,就会占用一个小于4M的对象,如果超过4M,那么存储的数据就会进行拆分成多个4M,这个地方其实是不严谨的
用户2772802
2018/08/06
7710
ceph的rbd备份软件ceph-backup
teralytics是一家国外的大数据公司,这个是他们开源的ceph的备份的工具,在twitter上搜索相关信息的时候看到,觉得不错就拿来试用一番
用户2772802
2018/08/06
2.1K0
RBD快速删除的方法分析与改进
这个问题在很久以前就有一篇文章进行过讨论 remove-big-rbd,这个文章写的比较清楚了,并且对不同的方法做了分析,这里先把结论说下
用户2772802
2018/08/06
1.2K0
Ceph删除OSD上一个异常object
ceph里面的数据是以对象的形式存储在OSD当中的,有的时候因为磁盘的损坏或者其它的一些特殊情况,会引起集群当中的某一个对象的异常,那么我们需要对这个对象进行处理
用户2772802
2018/08/06
1.5K0
rbd-mirror配置指南-单向备份
RBD 的 mirroring 功能将在Jewel中实现的,这个Jewel版本已经发布了很久了,这个功能已经在这个发布的版本中实现了,本来之前写过一篇文章,但是有几个朋友根据文档配置后,发现还是有问题,自己在进行再次配置的时候也发现有些地方没讲清楚,容易造成误解,这里对文档进行再一次的梳理
用户2772802
2018/08/06
2K0
rbd-mirror配置指南-单向备份
每天10分钟玩转Ceph(二)探索RBD块存储接口
部署完Ceph集群之后,如何在Ceph集群中存储文件呢?ceph提供了三种接口供用户使用,分别是:
HappyLau谈云计算
2020/03/02
5K0
每天10分钟玩转Ceph(二)探索RBD块存储接口
初试 Ceph 存储之块设备、文件系统、对象存储
哎_小羊
2018/01/02
6.8K0
初试 Ceph 存储之块设备、文件系统、对象存储
ceph-块存储客户端
ceph块设备,以前称为RADOS块设备,为客户机提供可靠性、分布式和高性能的块存储磁盘。RADOS块设备利用librbd库并以顺序的形式在ceph集群的多个osd上存储数据块。RBD是由ceph的RADOS层支持,因此每个块设备都分布在多个ceph节点上,提供了性能和优异的可靠性。RBD有linux内核的本地支持,这意味着RBD驱动程序从过去几年就与linux内核集成的很好。除了可靠性和性能外,RBD还提供了企业特性,例如完整和增量快照、瘦配置、写时复制克隆、动态调整大小等,RBD还支持内存缓存,这大大提高了性能。
yuezhimi
2020/09/30
3.3K0
Ceph数据盘怎样实现自动挂载
在Centos7 下,现在采用了 systemctl来控制服务,这个刚开始用起来可能不太习惯,不过这个服务比之前的服务控制要强大的多,可以做更多的控制,本节将来介绍下关于 Ceph的 osd 磁盘挂载的问题
用户2772802
2018/08/06
2.3K0
基于Docker部署ceph分布式文件系统(Luminous版本)
本文记录分享了ceph分布式文件系统的详尽部署过程,既是为了方便自己后续回溯,也希望能给初次接触ceph的同学提供些许参考。
张戈
2018/06/20
3.7K3
Linux 磁盘管理命令:使用xfs 管理命令
在 GNU/Linux 中,管理 XFS 的工作主要使用 xfsprogs 中的一系列工具。
度假的小鱼
2025/01/12
7080
Linux 磁盘管理命令:使用xfs 管理命令
CentOS Linux下的3款分区工具
  伴随着科技的飞速发展,越来越多的企业对于服务器的稳定要求越来越高,越来越多的企业开始采用linux系统来部署自己的服务,以求高效的稳定性,当然任何操作系统都需要一个最基本的基础,那就是硬盘,及硬盘分区,今天来给大家推荐几款CentOS Linux下的分区工具及如何查看分区环境,也会给大家来带一些硬盘的基本知识
py3study
2020/01/07
4.1K0
Ceph用户邮件列表Vol45-Issue1
这个问题是作者一个集群中(ceph 0.94.5)出现了一个磁盘损坏以后造成了一些对象的丢失,然后在做了一定的处理以后,集群状态已经正常了,但是还是新的请求会出现block的状态,这个情况下如何处理才能让集群正常,作者贴出了pg dump,ceph -s,ceph osd dump相关信息,当出现异常的时候,需要人协助的时候,应该提供这些信息方便其他人定位问题,最后这个问题作者自己给出了自己的解决办法,出现的时候影响是当时的流量只有正常情况下的10%了,影响还是很大的
用户2772802
2018/08/06
6500
rados put striper功能的调试
之前对于striper这个地方的功能并没研究太多,只是知道这个里面可以以条带方式并行的去写对象,从而加大并发性来提高性能,而默认的条带数目为1,也就是以对象大小去写,并没有条带,所以不是很好感觉到差别,今天就尝试下用rados命令来看下这个条带是怎么回事
用户2772802
2018/08/06
1.2K0
linux基础命令介绍十二:磁盘与文件系统
本篇讲述磁盘管理相关的命令。计算机中需要持久化存储的数据一般是保存在硬盘等辅助存储器中。硬盘一般容量较大,为了便于管理和使用,可以将硬盘分成一到多个逻辑磁盘,称为分区;为使分区中的文件组织成操作系统能够处理的形式,需要对分区进行格式化(创建文件系统);在linux中,对于格式化后的分区,还必须经过挂载(可简单理解为将分区关联至linux目录树中某个已知目录)之后才能使用。
用户5030870
2019/04/11
5.1K0
linux基础命令介绍十二:磁盘与文件系统
fio测试ceph的filestore
fio是一个适应性非常强的软件,基本上能够模拟所有的IO请求,是目前最全面的一款测试软件,之前在看德国电信的一篇分享的时候,里面就提到了,如果需要测试存储性能,尽量只用一款软件,这样从上层测试到底层去,才能更好的去比较差别
用户2772802
2018/08/06
2.5K1
fio测试ceph的filestore
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.7K0
Linux磁盘管理和文件系统[通俗易懂]
  磁盘和文件系统的管理是运维人员的重要工作内容之一,本文对磁盘和文件系统的一些概念做了详细解释,管理命令给出了常用示例,方便自己在工作时随时查阅,也欢迎各位一同学习。
全栈程序员站长
2022/09/01
5.3K0
ceph 分布式存储-块存储(RBD)搭建
PG数量的预估 集群中单个池的PG数计算公式如下:PG 总数 = (OSD 数 * 100) / 最大副本数 / 池数 (结果必须舍入到最接近2的N次幂的值)
Lucien168
2020/07/20
3.9K0
相关推荐
《大话 Ceph》 之 RBD 那点事儿
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验