术语表:

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參数)。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHVvbW93ZWlsYW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

四、新建源文件系统

        首先do_mount()->do_new_mount()->vfs_kern_mount()依据type參数指定的文件系统类型,新建一个ext3文件系统。当中须要重点关注的是。vfs_kern_mount()->moutn_fs()依据实际文件系统的超级块mount回调钩子函数,填充超级块和文件系统内容(为了简化,图中仅仅给出了最简单的ext3文件系统,即仅仅有根文件夹)。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHVvbW93ZWlsYW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

五、查找挂载文件夹并创建挂载节点

        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哈希表中。(注:图中省略了目的文件系统和源文件系统之间的父子关系)

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHVvbW93ZWlsYW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

七、总结

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

版权声明:

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

linux文件系统调用(1)---mount的更多相关文章

  1. Linux文件挂载命令mount

    在linux系统中硬盘.u盘.光驱等其他设备都需要挂载后才能正常使用.下面是对挂载命令mount使用方法的一些总结. 文件挂载命令mountmount [-t 文件系统类型][-L卷标名][-o特殊选 ...

  2. linux文件系统和mount(硬盘,win分区,光驱,U盘)

    fdisk –l查看dos/win/ext2分区(partiton,不是slice,slice是solaris分区) [root@localhost etc]# /sbin/fdisk -l Disk ...

  3. Linux实战教学笔记08:Linux 文件的属性(上半部分)

    第八节 Linux 文件的属性(上半部分) 标签(空格分隔):Linux实战教学笔记 第1章 Linux中的文件 1.1 文件属性概述(ls -lhi) linux里一切皆文件 Linux系统中的文件 ...

  4. Linux文件系统性能优化 (转)

    http://blog.chinaunix.net/uid-7530389-id-2050116.html 由于各种的I/O负载情形各异,Linux系统中文件系统的缺省配置一般来说都比较中庸,强调普遍 ...

  5. 【转】漫谈linux文件IO--io流程讲的很清楚

    [转]漫谈linux文件IO--io流程讲的很清楚 这篇文章写的比较全面,也浅显易懂,备份下.转载自:http://blog.chinaunix.net/uid-27105712-id-3270102 ...

  6. 2.Linux文件IO编程

    2.1Linux文件IO概述 2.1.0POSIX规范 POSIX:(Portable Operating System Interface)可移植操作系统接口规范. 由IEEE制定,是为了提高UNI ...

  7. Linux文件查找.md

    Linux 文件查找 在Linux系统的查找相关的命令: which 查看可执行文件的位置 whereis 查看文件的位置 locate 配合数据库查看文件位置 find 实际搜寻硬盘查询文件名称 w ...

  8. Linux 下系统调用的三种方法

    系统调用(System Call)是操作系统为在用户态运行的进程与硬件设备(如CPU.磁盘.打印机等)进行交互提供的一组接口.当用户进程需要发生系统调用时,CPU 通过软中断切换到内核态开始执行内核系 ...

  9. Linux文件权限;ACL;Setuid、Setgid、Stick bit特殊权限;sudo提权

    相关学习资料 http://blog.sina.com.cn/s/blog_4e2e6d6a0100g47o.html http://blog.csdn.net/aegoose/article/det ...

随机推荐

  1. 洛谷——P1102 A-B数对

    P1102 A-B数对 题目描述 出题是一件痛苦的事情! 题目看多了也有审美疲劳,于是我舍弃了大家所熟悉的A+B Problem,改用A-B了哈哈! 好吧,题目是这样的:给出一串数以及一个数字C,要求 ...

  2. Coloring Dominoes

    问题 E: Coloring Dominoes 时间限制: 1 Sec  内存限制: 128 MB提交: 279  解决: 95[提交] [状态] [讨论版] [命题人:] 题目描述 We have ...

  3. 【分块】【常数优化】【Orz faebdc】洛谷 P1083 NOIP2012提高组 借教室

    分块90分. By AutSky_JadeK [重点在下面] #include<cstdio> #include<cmath> using namespace std; #de ...

  4. 求满足n^2>12000的n的最大值 Exercise05_13

    /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:求满足n^2>12000的n的最大值 * */ public class Exercise05_13 { public ...

  5. 乐观锁-version的使用

    出处:http://chenzhou123520.iteye.com/blog/1863407 乐观锁介绍: 乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般 ...

  6. 解决sqlite删除数据后,文件大小不变问题 转载

    原文地址:http://blog.csdn.net/yangchun1213/article/details/7656146   说了这么多,没进主题,我的主题是给Sqlite在删除数据后擦屁股. 大 ...

  7. [转载]CodeGear RAD 2007 SP4 最新下载及破解

    CodeGear RAD 2007 SP4 最新下载及破解  SN: 3AKS-S46LXF-5W7LSF-52CN SN: H4DP-YUSNW7-3MB4TK-2BLD (用这个安装才有源码) C ...

  8. linux内核分析笔记----上半部与下半部(下)

    接着上节的来,我们在上节说了软中断和tasklet,那这最后就是工作队列了哦.. 工作队列和前面讨论的其他形式都不相同,它可以把工作推后,交由一个内核线程去执行----该工作总是会在进程上下文执行.这 ...

  9. pymongo增删查改以及条件查询

    ---恢复内容开始--- 下载Pymongo pip install pymongo pip install pymongo==x.x.x指定下载版本 连接数据库 from pymongo impor ...

  10. 多重采样(MultiSample)下的FBO反锯齿 【转】

    在三维渲染的过程中,锯齿总是让人讨厌的东西.抗锯齿的一种采用方式是多重采样,本文主要小记一下FBO与多重采样的关系.——ZwqXin.com 首先,关于FBO(Frame Buffer Object) ...