一,元数据池中的数据结构
1,Dir
Cephfs 的元数据池中次要寄存着目录dir或目录决裂后的分片对象,数据池中寄存着文件的对象(依据偏移能够划分多个)。
查看名为vdb.1_1.dir(目录下有100万个文件)的目录的inode号为1099511627788,转换为16进制为1000000000C
通过inode号在metapool里搜到513个对象,去掉原目录1000000000c.00000000,能够看到该目录存在512个目录分片,每个分片由inode号1000000000c和分片号frag_t(32位)组成,前8位示意有效位数,前面24位为value值,这里前8位为09示意value前9位无效。每一个目录分片在元数据池中作为一个dir对象存在。
[root@node2 cephfs]# rados -p cephfs-metadata ls
2,Dentry和Inode组织构造
通过查看元数据池中目录分片的内容,咱们能够看到对应dir对象中存在的文件的dentry和inode信息,以1000000000c.09640000分片为例,如下可见dir对象中寄存的items map记录治理的目录项dentry, 每一个目录或文件的dentry信息以key-value键值对的模式存在dir中。
[root@node2 testSetattr]# rados -p cephfs-metadata listomapvals 1000000000c.09640000
以文件vdb_f0033为例,在其所在的分片1000000000c.09640000中,key是以文件名_head的模式存在,value外面寄存着对应文件的元数据inode信息(蕴含inode号,如上图红框所示为1000000002D,小端模式须要倒着看。
从数据池中能找到这个对象,对象的名称为文件的inode号.编号(总大小/对象大小object_size个),对象存的数据多了就依据偏移拆成多个)
咱们目前的目录vdb.1_1.dir的上级文件的元数据信息就全副找到了,依照元数据的组织构造,不论是文件或者目录,其inode信息和dentry都寄存在其下级目录dir(或者对应分片)的items map之内。
以vdb.1_1.dir为例,其父目录为testSetattr,inode号为109951163887,转成16进制为10000002B59。查看10000002b59.00000000对象能够找到vdb.1_1.dir的元数据信息。
[root@node3 cephfs]# rados -p cephfs-metadata listomapvals 10000002b59.00000000
因为testSetattr目录下级目录就是文件系统根目录,所以其inode信息寄存在根目录的dir对象中(根目录的inode号为1),通过以下命令查到
[root@node3 cephfs]# rados -p cephfs-metadata listomapvals 1.00000000
而针对于根目录的inode信息,寄存在1.00000000.inode对象当中。
二,内存对象中的构造
大体的内存组织构造借用上图示意,上面具体介绍:
1,Dir
CInode *inode; // my inodefrag_t frag; // my frag...dentry_key_map items;
Dir内存构造次要是其本身的inode索引和以后的分片号,以及存在其中的dentry 列表items,具体参数见Dir.h。
通过CDir::fetch()
读取metapool中的数据,填充本人的CDir::items
,从而在内存初中创立相应的dentry和inode构造。
2,Dentry
简要地说,dentry的内存构造次要蕴含对应文件或目录的名字mempool::mds_co::string name,其归属的目录或者分片CDir *dir,以及链接的inode信息linkage_t linkage,链接linkage蕴含inode或remote inode(跟硬链接无关)索引。
3,Inode
Inode的数据结构较为简单,次要变量CDentry *parent(失常链接的primary dentry)和remote_parents(硬链接应用),指向其所链接的dentry,dirfragtree是以后inode为dir的状况下指向对应目录分片。
次要信息存在其继承的InodeStoreBase类中,其蕴含了具体inode信息所在的inode_t(即mempool_inode构造),和对应文件或目录的扩大属性xattr,inode_t则蕴含了传统inode的元数据信息,包含ctime、mtime、mode、uid、gid等等具体的属性信息。