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
----------------------
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下的所有目录和文件而言,都是这样的。
以上都是经过代码验证
对于每一个 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下的所有目录和文件而言,都是这样的。
以上都是经过代码验证
相关文章推荐
- vfs的superblock、inode、dentry、file之间的关系
- Linux2.4文件系统中vfsmount、安装点的dentry、设备的dentry之间的关系【转】
- 10分钟理解TCP/IP各个协议以及协议之间的关系
- JavaScript的原型链继承__propt__、prototype、constructor的理解、以及他们之间相互的关系。
- 10分钟理解TCP/IP各个协议以及协议之间的关系
- iptables相关操作以及简单理解端口和服务之间关系
- 10分钟理解TCP/IP各个协议以及协议之间的关系
- 连续傅里叶变换,拉普拉斯变换之间的关系以及理解
- 10分钟理解TCP/IP各个协议以及协议之间的关系
- Linux2.4文件系统中vfsmount、安装点的dentry、设备的dentry之间的关系
- 【iOS开发-72】设置状态栏的两种方式、程序生命周期以及更好地理解几大类(对象)之间的关系
- 【iOS开发-72】设置状态栏的两种方式、程序生命周期以及更好地理解几大类(对象)之间的关系
- 10分钟理解TCP/IP各个协议以及协议之间的关系
- vfsmount和dentry之间的关系
- servlet理解和Spring的DispatcherServlet理解以及之间关系
- mysql中相关,无关子查询,表与表之间的关系以及编码和乱码的解决
- 简单理解java的File,InputStream,InputStreamReader,BufferedReader之间的关系
- Spring包结构以及各个包之间引用关系说明
- PHP的工作原理以及lamp四者之间的关系
- 细说一个汉字等于几个字符,以及汉字,字符,字节,位之间的关系