需求
在Ceph Luminous里部署了CephFS,想查看上面的一个file到Rados,再到OSDs的映射关系。
之前在Ceph Jewel版本里,有个cephfs的工具,可以获取file的location信息,如下:
1 | # cephfs /mnt/tstfs2/mike512K/tstfile show_location |
但如上面的WARNING所述,这个命令被遗弃了,在Ceph Luminous里没找到相关的替换命令。。。
在Ceph的官方文档里也没找到相关说法:http://docs.ceph.com/docs/master/cephfs/file-layouts/
那只能自己看代码分析了 ;(
代码分析
Jewel版本
在Jewel版本里是有cephfs
这个工具的,那先看看它是如何工作的?
1 | 文件:src/cephfs.cc |
上面代码段就是与命令cephfs <file_path> show_location
相关的代码。
1 | 文件:src/client/ioctl.h |
查看ceph代码里的ioctl,如下,这里只是ceph-fuse
客户端实现:
1 | 文件:src/client/fuse_ll.cc |
看到ceph-fuse仅仅支持CEPH_IOC_GET_LAYOUT
ioctl命令。
查看Linux的kernel代码,看相关cephfs的ioctl部分:
1 | 文件:fs/ceph/ioctl.c |
看出file的location信息是根据其layout
信息和inode
规则生成的。
Luminous版本
在Luminous版本里,没有找到src/cephfs.cc
文件,那就查查其它相关代码。
想象一个file的什么过程会要求获取到Rados的映射信息?首先想到的就是read/write,那就看Ceph Luminous版本里的相关代码吧~
1 | 文件:src/client/Client.cc |
也就是说在CephFS中file到Rados里object的映射关系如下。
object命名规则:<file inode number>.<slice number>
验证
1 | root@ceph0:/mnt/cephfs# dd if=/dev/zero of=4Mfile bs=4M count=1 |
1099511628901
转换为16进制为:0x10000000465
查看文件的layout信息:
1 | root@ceph0:/mnt/cephfs# getfattr -n ceph.file.layout 4Mfile |
查看Rados里的object和其map信息:
1 | root@ceph0:/mnt/cephfs# rados ls -p cephfs_data | grep -i 10000000465 |