`
lancelotwjq
  • 浏览: 53611 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

inode详解

 
阅读更多

inode是glusterfs中重要的数据结构之一, glusterfs用它来表示文件系统中的inode,但二者不是 等价的。

 

inode数据结构

 

先粗略看下inode数据结构定义,对它有个整体印象

 

typedef struct _inode inode_t;

struct _inode {
        inode_table_t       *table;         /* the table this inode belongs to */
        uuid_t               gfid;
        gf_lock_t            lock;
        uint64_t             nlookup;
        uint32_t             ref;           /* reference count on this inode */
        ia_type_t            ia_type;       /* what kind of file */
        struct list_head     fd_list;       /* list of open files on this inode */
        struct list_head     dentry_list;   /* list of directory entries for this inode*/
        struct list_head     hash;          /* hash table pointers */
        struct list_head     list;          /* active/lru/purge */

        struct _inode_ctx   *_ctx;    /* replacement for dict_t *(inode->ctx) */
};

 

其中 一个叫list的成员十分重要,将在后面提到,它以节点的形式插入active list或lru list或purge list中

成员hash, list都是一个节点,他们不存放任何数据,只是用来表示各种链表关系

成员fd_list, dentry_list 是真正的链表

 

inode与dentry的关系

 

在inode.c文件中,高频词除了inode外,还有dentry。它对应与文件系统中目录项。

dentry与inode是多对一的关系,很多dentry可以指向同一个inode。 dentry主要的数据是目录项的名字。

typedef struct _dentry dentry_t;
struct _dentry {
        struct list_head   inode_list;   /* list of dentries of inode */
        struct list_head   hash;         /* hash table pointers */
        inode_t           *inode;        /* inode of this directory entry */
        char              *name;         /* name of the directory entry */
        inode_t           *parent;       /* directory of the entry */
}; 

 

同上,inode_list,hash也只是一个节点。

 

inode.c中,另一个数据结构是inode_table, 它相当于是一个总管,管理所有inode的状态/lru/hash/内存分配/。定义请察看源文件。

 

 

 

inode 的状态转移图

 

                                ------ref-------> [active]

                              /                             / \

inode_create ---> [lru] <------unref-----     ---unref-retire------->[purge] ---->  destory                   

                              \                                                                              /

                                -------table-prune--(lru_size>lru_limit)--->--            

 

注:lru表示Least Recently Used最近最少使用算法, 网上一堆,这里就不赘述了。

 

其中active,lru,purge代表inode的三个状态, 在inode_table中定义有3个链表与之对应。

 

当inode->list在某个链表中时,就代表inode处于这种状态。

 

list_move函数负责将链表节点在不同的链表中转移。如

 

   list_move (&inode->list, &inode->table->active);

 

就表示将inode的状态设为active。

 

 


inode_ctx

 

ctx(context) 存放inode的一些私有数据,它的定义很有意思:

struct _inode_ctx {
        union {
                uint64_t    key;
                xlator_t   *xl_key;
        };
        union {
                uint64_t    value1;
                void       *ptr1;
        };
        union {
                uint64_t    value2;
                void       *ptr2;
        };
};  

 它有3个union, union在C语言中并不常见,这么高密度的出现在这里,我猜测是为了内存对齐。这样ctx结构体的大小不会随着操作系统是32位还是64位而变化,一定为3*64bit。

 

 

hash & grep

 

为了提高 inode和dentry的查找速度,作者都对他们做了hash:

 

inode使用gfid 作为hash key; dentry使用name 作为hash key。

 

hash表存放在inode_table中:  inode_hash[],  name_hash[]

 

hash查找函数为: inode_grep(...),  dentry_grep(...)

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    详解Linux索引节点inode

    1.inode简介 理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做”扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,...

    linux文件系统,inode,datablock,superblock,Filesystem Description等详解

    每个块都可能含有superblock,但是我们也说一个文件系统应该仅有一个superblock 而已,那是怎么回事?事实上除了第一个块内会含有superblock 之外,后续的块不一定含有superblock,而若含有superblock则该superblock...

    jffs2代码分析详尽资料

    jffs2代码分析详尽资料jffs2代码分析详尽资料jffs2代码分析详尽资料

    linux命令行系统详解

    这个PPT非常详细的讲解了linux的命令行,我相信读者在读完这个PPT后会更加清晰的理解linux的命令行系统

    详解Linux ln 命令

    Linux 中的文件分为 Hard Link 和 Symbolic Link 两种。Hard Link 文件又被称为硬链接文件、实体...要读取该文件的内容,需要通过文件所在的目录中记录的文件名找到文件的 inode 号,然后通过 inode 找到存储文件内容的

    文件系统结构详解

    文件系统结构详解,文件系统组成以及存储原理,以及linux中操作磁盘的一些常用命令

    linux文件系统详解合集

    linux文件系统 系统管理员很重要的任务之一就是管理好自己的磁盘文件系统,...这就得要谈到 filesystem 中的 inode 与 block 了。 本资源是linux文件系统资源的合集,内容详细,通俗易懂,有需要的朋友可以下载学习。

    公众号一口Linux驱动部分源码汇总.rar

    《手把手教Linux驱动4-进程、文件描述符、file、inode关系详解》 《 手把手教Linux驱动3-之字符设备架构详解,有这篇就够了 》 《手把手教Linux驱动2-模块参数param和符号导出export用法》 《手把手教Linux驱动1-...

    ext2文件系统详解

    Ext2文件系统详细介绍,包括superblock,inode,group descriptor等详细内容

    Linux文件系统详解

    从操作系统的角度详解Linux文件系统层次、文件系统分类、文件系统的存储结构、不同存储介质的区别(RAM、ROM、Flash)、存储节点inode。 在LINUX系统中有一个重要的概念:一切都是文件。其实这是UNIX哲学的一个体现,...

    Linux中stat函数和stat命令使用详解

    linux文件里的【inode = index node】解释:要理解inode必须了解磁盘和【目录项】,inode实际是连接【目录项】和磁盘的中间物质。 图里的大圈代表硬件的磁盘,里面的小圈代表某个文件存储在磁盘上了。 【inode = ...

    Linux mke2fs命令用法详解

    Linux mke2fs命令 Linux mke2fs命令用于建立ext2文件系统。...-i 指定”字节/inode”的比例。 -N 指定要建立的inode数目。 -l 从指定的文件中,读取文件西中损坏区块的信息。 -L 设置文件系统的标签名称。 -m

    入门学习Linux常用必会60个命令实例详解doc/txt

    入门学习Linux常用必会60个命令实例详解 Linux必学的60个命令 Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作、文件存取、目录操作、进程管理、文件权限设定等。所以,在Linux系统上工作离不...

    Linux中如何查看文件的创建时间详解

    一、简介 Linux的文件能否找到文件的创建时间取决于文件系统类型,在ext4之前的早期文件系统中(ext、ext2、ext3),文件的元数据不会...Device: 807h/2055d Inode: 5255117 Links: 1 Access: (0755/-rwxr-xr-x) Uid

    Linux mkfs.minix命令用法详解

    Linux mkfs.minix命令 Linux mkfs.minix命令用于建立Minix文件系统。...-i 指定文件系统的inode总数。 -l 从指定的文件中,读取文件系统中损坏区块的信息。 -n 指定文件名称长度的上限。 -v 建立第2版的Minix文件系统。

    详解Linux命令修改文件的三个时间

    Linux命令如何修改文件的三个时间 ...Device: 801h/2049d 文件所在的设备名 Inode: 378 文件索引节点号 Links: 4 被硬链接的次数 Access: (0775/drwxrwxr-x) 文件的用户权限 Uid: ( 1000/houh

    Python 实现文件的全备份和差异备份详解

    Python实现文件的全备份和差异备份 之前有写利用md5方式来做...ctime(Create time)是在写入文件、更改所有者、权限或链接设置时随Inode的内容更改而更改的 废话不多说直接上代码: #!/usr/bin/env python import

    在Linux上识别同样内容的文件详解

    在最近的帖子中,我们看了 如何识别并定位硬链接的文件 (即,指向同一硬盘内容并共享 inode)。在本文中,我们将查看能找到具有相同 内容 ,却不相链接的文件的命令。 硬链接很有用是因为它们能够使文件存放在文件...

Global site tag (gtag.js) - Google Analytics