您的位置:首页 > 其它

vfsmount和dentry之间的关系以及vfsmount的理解

2018-01-09 15:38 447 查看
vfsmount和dentry之间的关系

对于每一个 mount 的文件系统,都由一个 vfsmount 结构来表示。

对于每一个目录项,都用一个dentry来表示,例如对于/usr/local/lib : / usr local lib 表示4个目录项

两者关系以一个例子来说明:
例如我们要mount一个设备 /dev/sdb1 到 /home/my目录下,
我们假设 /home/my 就是当前进程的根文件系统中的目录(即 home 和 my 都没有mount任何文件系统),
命令行是: mount -t ext2 /dev/sdb1 /home/my
我们mount的时候,传入的参数有三个: 要mount的设备( /dev/sdb1 ) , 设备的文件系统 ( ext2 之类的), mount到什么目录 ( /home/my )

mount的过程就是把设备的文件系统加入到
vfs 框架中
1. 首先,要mount一个新的设备,需要创建一个新的 super block。 这通过要mount的文件系统的 file_system_type, 调用其 get_sb 方法来创建一个新的 super block。
2. 需要创建一个新的vfsmount ,对于任何一个 mount 的文件系统,都要有一个 vfsmount, 创建这个vfsmount, 并设置好vfsmount 中的各个成员
3. 将创建好的 vfsmount 加入到系统中。

对于新的vfsmount:
其mountpoint为目录 "my" 的dentry,
其mnt_root 是设备sdb1上的根目录的 dentry
其父 vfsmount 就是原文件系统中的那个 vfsmount

----------------------


关于vfsmount的理解

struct vfsmount {

 struct list_head mnt_hash;

 struct vfsmount *mnt_parent; /* fs we are mounted on */     

 struct dentry *mnt_mountpoint; /* dentry of mountpoint */

 struct dentry *mnt_root; /* root of the mounted tree */

 struct super_block *mnt_sb; /* pointer to superblock */
 struct list_head mnt_mounts; /* list of children, anchored here */
 struct list_head mnt_child; /* and going through their mnt_child */

 int mnt_flags;

 /* 4 bytes hole on 64bits arches */

 const char *mnt_devname; /* Name of device e.g. /dev/dsk/hda1 */
 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 */

 atomic_t __mnt_writers;

...

};

1 vfsmount结构描述的是一个独立文件系统的挂载信息,每个不同挂载点对应一个独立的vfsmount结构,属于同一文件系统的所有目录和文件隶属于同一个vfsmount,该vfsmount结构对应于该文件系统顶层目录,即挂载目录

2 比如对于mount /dev/sdb1 /media/Kingston,挂载点为/media/Kingston,对于Kingston这个目录,其产生新的vfsmount,独立于根文件系统挂载点/所在的vfsmount;

3 所有的vfsmount挂载点通过mnt_list双链表挂载于mnt_namespace->list链表中,该mnt命名空间可以通过任意进程获得

4 子vfsmount挂载点结构通过mnt_mounts挂载于父vfsmount的mnt_child链表中,并且mnt_parent直接指向父亲fs的vfsmount结构,从而形成层次结构

5 vfsmount的super_block结构->statfs函数可以获得该文件系统中空间的使用情况

6 对于挂载点/media/Kingston来讲,其vfsmount->mnt_root->f_dentry->d_name.name = '/';而vfsmount->mnt_mountpoint->f_dentry->d_name.name = 'Kingston'。对于/media/Kingston下的所有目录和文件而言,都是这样的。

以上都是经过代码验证
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐