Ext3 mount过程分析 - 面向对象网,存储技术,nosql,学习,对象 - 面向对象技术开发

面向对象技术开发

会员投稿 投稿指南 站长资讯通告:
您的位置: 首页 > 计算机相关技术 > 存储技术 > 正文

Ext3 mount过程分析

来源: www.bianceng.cn 阅读:

Ext3 mount原理

本质上,Ext3 mount的过程实际上是inode被替代的过程。例如,/dev/sdb块设备被mount到/mnt/alan目录。那么mount这个过程所需要解决的问题就是将/mnt/alan的dentry目录项所指向的inode屏蔽掉,然后重新定位到/dev/sdb所表示的inode索引节点。在没有分析阅读linux vfs mount代码的时候,我的想法是修改dentry所指向的inode索引节点,以此实现mount文件系统的访问。经过分析,在实际的vfs mount实现过程中,还是和我原始的想法略有差别,但是,基本目标还是相同的。

Linux VFS的mount过程基本原理如下图所示:

\

当用户输入”mount /dev/sdb /mnt/alan”命令后,Linux会解析/mnt/alan字符串,并且从Dentry Hash表中获取相关的dentry目录项,然后将该目录项标识成DCACHE_MOUNTED。一旦该dentry被标识成DCACHE_MOUNTED,也就意味着在访问路径上对其进行了屏蔽。

在mount /dev/sdb设备上的ext3文件系统时,内核会创建一个该文件系统的superblock对象,并且从/dev/sdb设备上读取所有的superblock信息,初始化该内存对象。Linux内核维护了一个全局superblock对象链表。s_root是superblock对象所维护的dentry目录项,该目录项是该文件系统的根目录。即新mount的文件系统内容都需要通过该根目录进行访问。在mount的过程中,VFS会创建一个非常重要的vfsmount对象,该对象维护了文件系统mount的所有信息。Vfsmount对象通过HASH表进行维护,通过path地址计算HASH值,在这里vfsmount的HASH值通过“/mnt/alan”路径字符串进行计算得到。Vfsmount中的mnt_root指向superblock对象的s_root根目录项。因此,通过/mnt/alan地址可以检索VFSMOUNT Hash Table得到被mount的vfsmount对象,进而得到mnt_root根目录项。

例如,/dev/sdb被mount之后,用户想要访问该设备上的一个文件ab.c,假设该文件的地址为:/mnt/alan/ab.c。在打开该文件的时候,首先需要进行path解析。在解析到/mnt/alan的时候,得到/mnt/alan的dentry目录项,并且发现该目录项已经被标识为DCACHE_MOUNTED。之后,会采用/mnt/alan计算HASH值去检索VFSMOUNT Hash Table,得到对应的vfsmount对象,然后采用vfsmount指向的mnt_root目录项替代/mnt/alan原来的dentry,从而实现了dentry和inode的重定向。在新的dentry的基础上,解析程序继续执行,最终得到表示ab.c文件的inode对象。

关键数据结构说明

Linux VFS mount所涉及的关键数据结构分析如下。

Vfsmount数据结构

Vfsmount数据结构是vfs mount最为重要的数据结构,其维护了一个mount点的所有信息。该数据结构描述如下:

struct vfsmount {  
    struct list_head mnt_hash;  /* 连接到VFSMOUNT Hash Table */
    struct vfsmount *mnt_parent;    /* 指向mount树中的父节点 */
    struct dentry *mnt_mountpoint;  /* 指向mount点的目录项 */
    struct dentry *mnt_root;    /* 被mount的文件系统根目录项 */
    struct super_block *mnt_sb; /* 指向被mount的文件系统superblock */
#ifdef CONFIG_SMP  
    struct mnt_pcp __percpu *mnt_pcp;  
    atomic_t mnt_longterm;      /* how many of the refs are longterm */
#else  
    int mnt_count;  
    int mnt_writers;  
#endif  
    struct list_head mnt_mounts;    /* 下级(child)vfsmount对象链表 */
    struct list_head mnt_child; /* 链入上级vfsmount对象的链表点 */
    int mnt_flags;  
    /* 4 bytes hole on 64bits arches without fsnotify */
#ifdef CONFIG_FSNOTIFY  
    __u32 mnt_fsnotify_mask;  
    struct hlist_head mnt_fsnotify_marks;  
#endif  
    const char *mnt_devname;    /* 文件系统所在的设备名字,例如/dev/sdb */
    struct list_head mnt_list;  
    struct list_head mnt_expire;    /* link in fs-specific expiry list */
    struct list_head mnt_share; /* circular list of shared mounts */
    struct list_head mnt_slave_list;/* list of slave mounts */
    struct list_head mnt_slave; /* slave list entry */
    struct vfsmount *mnt_master;    /* slave is on master->mnt_slave_list */
    struct mnt_namespace *mnt_ns;   /* containing namespace */
    int mnt_id;         /* mount identifier */
    int mnt_group_id;       /* peer group identifier */
    int mnt_expiry_mark;        /* true if marked for expiry */
    int mnt_pinned;  
    int mnt_ghosts;  
};

Tags:
相关文章列表: