从虚拟机中的文件到RADOS的object

从虚拟机中的文件到RADOS的object

Ceph将虚拟机的卷映射到最终的OSD,经过了两次映射。第一次,从object名到PG做简单hash,并结合pool_id作为前缀,第二次,从PG到OSD通过CRUSH算法计算得到。我们想知道卷最终被映射到哪些主机、哪些OSD、哪些object还是比较麻烦的。
我这里摸索出了,从虚拟机的某个文件找到该文件所在rados的object, osd, host的方法 (基于J版Ceph) 。如下:

查看文件的磁盘设备偏移地址

1
2
3
4
5
[root@vmhost]# filefrag -v test
Filesystem type is: 58465342
File size of test is 35052 (9 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 8: 268435473.. 268435481: 9: eof

根据physical_offset的起始地址 268435473 计算所在的object编号(磁盘设备是顺序切分成object的)
268435473/1024 = 262144.0166015625
即此从第262144个object开始的,
object名字是由prefix和后缀组成的,其中后缀是16进制的,262144转化成16进制为40000。

查看object的名字

1
2
3
4
5
6
7
8
[root@server]# rbd info efs-nfsd-test/quotatest18.img
rbd image 'quotatest18.img':
size 8192 GB in 2097152 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.4d79a4238e1f29
format: 2
features: layering, exclusive-lock
flags:

找到对应的object prefix为: rbd_data.4d79a4238e1f29

通过下面这个命令找到该卷对应的所有的object:

1
rados -p efs-nfsd-test ls |grep 'rbd_data.4d79a4238e1f29' >> efs-nfsd-test-objects.txt

在这里面可以找到我们需要的object:rbd_data.4d79a4238e1f29.0000000000040000

找到对应的object映射到的osd

1
2
3
[root@server]# ceph osd map efs-nfsd-test rbd_data.4d79a4238e1f29.0000000000040000

osdmap e188415 pool 'efs-nfsd-test' (16) object 'rbd_data.4d79a4238e1f29.0000000000040000' -> pg 16.4fa43842 (16.42) -> up ([0,20,13], p0) acting ([0,20,13], p0)

从osd找到对应的主机

1
[root@server]# ceph osd tree

如果需要可以对object的内容进行验证,导出对应object的内容

1
rados -p efs-nfsd-test get rbd_data.4d79a4238e1f29.0000000000040000 rbd_data.4d79a4238e1f29.0000000000040000.txt

用dd可以定位到对应位置的文件内容

1
2
3
4
[root@vmhost]# dd if=rbd_data.4d79a4238e1f29.0000000000040000.txt of=rbd_data.4d79a4238e1f29.0000000000040000_2.txt bs=4k count=9 skip=17
9+0 records in
9+0 records out
36864 bytes (37 kB) copied, 0.000475126 s, 77.6 MB/s

其中skip的数目是以4k为单位的,可以从开始的filefrag -v test的数字计算出来
268435473-262144*1024=17
可以看到从object导出的文件内容和实际的文件内容是一致的。