linux文件系统调用---mount

Posted llguanli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux文件系统调用---mount相关的知识,希望对你有一定的参考价值。

术语表:

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定义了文件系统类型;flagsdata定义了一些选项内容。

我们重点关注前三个參数,后两个參数眼下不关注。

? ? ? ? 下图描写叙述了基本的函数调用关系,linux挂载文件系统主要分为三个阶段:

? ? ? ? 1vfs_kern_mount()负责创建源文件系统;

? ? ? ? 2lock_mount()负责在目的文件系统中查找挂载文件夹。

? ? ? ? 3graft_tree()负责将源文件系统挂载到目的文件系统的挂载文件夹上;


技术分享图片


三、目的文件系统

? ? ? ?为了便于描写叙述,我们如果当前系统已经挂载了ext2文件系统(即目的文件系统),tmp文件夹将是目的文件系统的挂载文件夹。

? ? ? ? 以下我们将要把ext3文件系统挂载到ext2tmp挂载文件夹上,使用的命令是mount(/dev/sda1, /tmp, ?ext3)(省略了flagsdata參数)。

技术分享图片


四、新建源文件系统

? ? ? ? 首先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()->lock_mount()的功能是递归的查找终于的挂载文件夹。这里的代码比較难懂,所以以下将具体描写叙述。
? ? ? ? linux同意挂载文件夹上挂载多个文件系统,后面挂载的文件系统将“覆盖”之前挂载的文件系统。比如,minix文件系统挂载到ext3文件系统的tmp挂载文件夹下,nfs文件系统挂载到minix文件系统的/挂载文件夹下,终于使用ls命令将仅仅能看见nfs文件系统,而minix被nfs“覆盖”了。


? ? ? ? 当中。tmp文件夹指向minix挂载点的红色虚线仅仅表示逻辑关系,实际并不存在这种指向关系,linux使用<挂载点。挂载文件夹>二元组作为哈希因子构成哈希表mount_hashtable的表项。用来查找已经挂载的文件系统。比如。minix挂载到ext3的tmp文件夹,那么linux就依据<ext3, tmp>二元组构成哈希表项。而且将minix记录到<ext3, tmp>哈希表项的链表中。当须要查找ext3的tmp文件夹下挂载了哪个文件系统时,能够依据<ext3, tmp>二元组找到相应的哈希表项,然后找到相应的已挂载文件系统minix。


技术分享图片

? ? ? ? 有了以上基础后,我们再回过头来看lock_mount()的功能。lock_mount()首先依据当前的<ext3, tmp>二元组找到已挂载的minix文件系统,然后依据<minix, />二元组找到已挂载的nfs文件系统。当找到最后一个文件系统时,依据nfs的根文件夹调用new_mountpoint()创建挂载节点(由于minix和nfs挂载到同一个挂载文件夹tmp下。所以在挂载minxi时已经创建了挂载节点。所以实际上nfs共用了minix的挂载节点,仅仅是将挂载节点的挂载次数统计加1)。
? ? ? ? 以下回到第四节描写叙述的情形继续讲述,由于当前文件系统中仅仅存在ext2文件系统。因此lock_mount()将依据ext2的挂载文件夹tmp调用new_mountpoint()创建挂载节点,而且将挂载节点指向挂载文件夹tmp,挂载次数统计加1。最后将挂载节点增加到mountpoint_hashtable哈希表中(该哈希表使用挂载文件夹tmp作为哈希因子)。


技术分享图片


六、挂载源文件系统

? ? ? ? do_mount()->do_new_mount()->do_add_mount()->graft_tree()负责把新建的源文件系统ext3挂载到挂载节点上。mnt_set_mountpoint()负责将源文件系统指向挂载节点。commit_tree()负责将源文件系统ext3增加到mount_hashtable哈希表中。(注:图中省略了目的文件系统和源文件系统之间的父子关系)

技术分享图片


七、总结

? ? ? ? linux挂载文件系统主要分为三个阶段:创建源文件系统,查找目的文件系统的终于挂载文件夹并创建挂载节点。最后将源文件系统关联到挂载节点上。


版权声明:

? ? ? ? 原创作品,如非商业性转载,请注明出处。如商业性转载出版,请与作者联系。


以上是关于linux文件系统调用---mount的主要内容,如果未能解决你的问题,请参考以下文章

Linux文件系统管理 挂载命令mount

Linux命令(二十四) 磁盘管理命令 mkfs,mount

Linux mount 修改文件系统的读写属性

linux命令:挂载mount与卸载umount

linux 系统下的mount和umount命令

Linux文件挂载命令mount