标签:lock_mount graft_tree mount mount_hashtable mountpoint_hashtable
struct mount:挂载点
struct mountpoint挂载点节点
struct vfsmount:挂载项
源文件系统用户将要挂载的文件系统
目的文件系统挂载源文件系统的文件系统
本文将介绍linux挂载文件系统的过程,从系统调用mount()函数开始解析,主要分为三个阶段:
1、新建源文件系统;
2、查找目的文件系统的挂载目录;
3、将源文件系统挂载到目的文件系统的挂载目录;
本文以linux 3.10版本为基础进行讲解。
mount系统调用的定义在fs/namespace.c文件中,具体的定义为:SYSCALL_DEFINE5(mount,char __user *, dev_name, char __user *, dir_name, char __user *,type, unsigned long, flags, void __user *, data)。
其中,dev_name定义了设备路径;di_name定义了挂载目录;type定义了文件系统类型;flags和data定义了一些选项内容。我们重点关注前三个参数,后两个参数目前不关注。
下图描述了主要的函数调用关系,linux挂载文件系统主要分为三个阶段:
1、vfs_kern_mount()负责创建源文件系统;
2、lock_mount()负责在目的文件系统中查找挂载目录;
3、graft_tree()负责将源文件系统挂载到目的文件系统的挂载目录上;
为了便于描述,我们假设当前系统已经挂载了ext2文件系统(即目的文件系统),tmp目录将是目的文件系统的挂载目录。
下面我们将要把ext3文件系统挂载到ext2的tmp挂载目录上,使用的命令是mount(/dev/sda1, /tmp, ext3)(省略了flags和data参数)。
首先do_mount()->do_new_mount()->vfs_kern_mount()根据type参数指定的文件系统类型,新建一个ext3文件系统。其中需要重点关注的是,vfs_kern_mount()->moutn_fs()根据实际文件系统的超级块mount回调钩子函数,填充超级块和文件系统内容(为了简化,图中只给出了最简单的ext3文件系统,即只有根目录)。
do_mount()->do_new_mount()->do_add_mount()->graft_tree()负责把新建的源文件系统ext3挂载到挂载节点上。mnt_set_mountpoint()负责将源文件系统指向挂载节点,commit_tree()负责将源文件系统ext3加入到mount_hashtable哈希表中。(注:图中省略了目的文件系统和源文件系统之间的父子关系)
linux挂载文件系统主要分为三个阶段:创建源文件系统,查找目的文件系统的最终挂载目录并创建挂载节点,最后将源文件系统关联到挂载节点上。
标签:lock_mount graft_tree mount mount_hashtable mountpoint_hashtable
原文地址:http://blog.csdn.net/luomoweilan/article/details/41324187