linux文件系统调用(1)---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定义了文件系统类型;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()->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挂载文件系统主要分为三个阶段:创建源文件系统,查找目的文件系统的最终挂载目录并创建挂载节点,最后将源文件系统关联到挂载节点上。

版权声明:

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

时间: 2024-10-13 06:05:37

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

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

fdisk –l查看dos/win/ext2分区(partiton,不是slice,slice是solaris分区) [[email protected] etc]# /sbin/fdisk -l Disk /dev/hda: 80.0 GB, 80026361856 bytes 255 heads, 63 sectors/track, 9729 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot     

Linux文件挂载命令mount

在linux系统中硬盘.u盘.光驱等其他设备都需要挂载后才能正常使用.下面是对挂载命令mount使用方法的一些总结. 文件挂载命令mountmount [-t 文件系统类型][-L卷标名][-o特殊选项] 设备文件名 挂载点mount 查看系统中已经挂载的设备选项:-l 查询系统中已经挂载的设备,-l会显示卷标名称-a 根据配置文件/etc/fstab的内容,自动挂载-t 指定文件系统类型挂载,可以ext3.ext4.iso9600等文件系统-L 挂载指定卷标的分区,而不是按照设备文件名挂载-o

linux文件系统调用(2)---umount

术语表: struct mount:挂载点 struct mountpoint:挂载点节点 struct vfsmount:挂载项 源文件系统:用户将要挂载的文件系统 目的文件系统:挂载源文件系统的文件系统 一.目的 本文将介绍linux卸载文件系统的过程,从系统调用umount()函数开始解析,主要分为三个阶段: 1.查找挂载目录下所有已挂载的文件系统: 2.删除这些已挂载文件系统的挂载节点: 3.释放这些已挂载文件系统的挂载点数据结构: 本文以linux3.10版本为基础进行讲解. 二.函数

文件编程之Linux下系统调用

说明: linux下文件编程可使用两种方法: ****linux系统调用 ****C语言库函数 前者依赖于linux系统,后者与操作系统是独立的. 在任何操作系统下,使用C语言库函数操作文件的方法都是相同的. 这里首先记录下Linux下系统调用操作文件编程的学习过程.函数原型: 1.系统调用--创建: int create(const char *filename, mode_t mode); filename为要创建的文件名(包含路径,缺省为当前路径): mode为创建模式. 模式可用数字来表

linux下挂载(mount)光盘镜像文件、移动硬盘

挂接命令(mount) 命令格式: mount [-t vfstype] [-o options] device dir其中:1.-t vfstype指定文件系统的类型,通常不必指定.mount会自动选择正确的类型.常用类型有:光盘或光盘镜像:iso9660DOS fat16文件系统:msdosWindows 9x fat32文件系统:vfatWindows NT ntfs文件系统:ntfsMount Windows文件网络共享:smbfsUNIX(LINUX)文件网络共享:nfs2.-o op

Linux文件管理系统

LINUX文件系统体系结构 用户空间(User space)包含一些应用程序(例如,文件系统的使用者)和 GNU C 库(glibc),它们为文件系统调用(打开.读取.写和关闭)提供用户接口.系统调用接口(System call interface)的作用就像是交换器,它将系统调用从用户空间发送到内核空间(Kernel space)中的适当端点. VFS(Virutal file systems) 是底层文件系统的主要接口.这个组件导出一组接口,然后将它们抽象到各个文件系统,各个文件系统的行为可

Linux 增加系统调用 (转)

Linux 增加系统调用大致步骤: 1.下载好内核文件,在内核源文件中添加好自己的调用函数. 2.编译内核 3.验证. 一.在内核源文件中增加自己的函数 首先将内核文件移至/usr/src/下并解压. 过程参考http://www.cnblogs.com/kavs/p/4607371.html 下面开始添加自己的函数. sudo gedit /usr/src/linux-4.0.6/kernel/sys.c 插入头文件 #include <linux/linkage.h> /* *leemo'

如何挂载一个镜像文件(how to mount an image file)

如何挂载一个镜像文件(how to mount an image file) 08/16/2012master 4 Comments 在使用KVM或Xen虚拟化的情况下,经常需要使用镜像文件(image file),我们可以将Guest系统启动起来,然后对镜像文件进行修改,不过这样有时也是比较麻烦,其实也是可以将镜像文件直接进行mount的,可以用如下两种办法. (本文写的RAW格式镜像文件的挂载:我的另一篇文章写了"如何挂载qcow2格式的镜像文件") 方法一:找出分区开始的开始位置

linux入门教程(六) Linux文件与目录管理

在linux中什么是一个文件的路径呢,说白了就是这个文件存在的地方,例如在上一章提到的/root/.ssh/authorized_keys 这就是一个文件的路径.如果你告诉系统这个文件的路径,那么系统就可以找到这个文件.在linux的世界中,存在着绝对路径和相对路径. 绝对路径:路径的写法一定由根目录”/”写起,例如/usr/local/mysql 这就是绝对路径. 相对路径:路径的写法不是由根目录”/”写起,例如,首先用户进入到/ 然后再进入到home ,命令为 cd /home 然后 cd