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

术语表:

struct mount:挂载点

struct mountpoint:挂载点节点

struct vfsmount:挂载项

源文件系统:用户将要挂载的文件系统

目的文件系统:挂载源文件系统的文件系统

一、目的

本文将介绍linux卸载文件系统的过程,从系统调用umount()函数开始解析,主要分为三个阶段:

1、查找挂载目录下所有已挂载的文件系统;

2、删除这些已挂载文件系统的挂载节点;

3、释放这些已挂载文件系统的挂载点数据结构;

本文以linux3.10版本为基础进行讲解。

二、函数调用关系

umount系统调用的定义在fs/namespace.c文件中,具体的定义为:SYSCALL_DEFINE2(umount,char
__user *, name, int, flags)。

下图描述了主要的函数调用关系,linux卸载文件系统主要分为三个阶段:

1、umount_tree()前半部分代码负责查找挂载目录下所有的文件系统;

2、umount_tree()后半部分代码负责删除这些文件系统的挂载节点;

3、namespace_unlock()负责释放这些已挂载文件系统的挂载点数据结构;

三、已挂载文件系统之间的关系

为了便于描述,我们假设ext2文件系统的tmp目录下挂载了ext3文件系统,ext3文件系统的sys目录下挂载了xfs文件系统,home目录下挂载了brtfs文件系统。我们将使用umount命令卸载ext2文件系统的tmp目录下所有已挂载的文件系统ext3、xfs和brtfs。

这四种文件系统存在以下几种关系:ext3、xfs和btrfs文件系统都存在于挂载点哈希表中;ext3的父文件系统是ext2,ext3是ext2的子文件系统;xfs和btrfs的父文件系统是ext3,exfs和btrfs是ext3的子文件系统。同时,三个挂载节点存在于挂载目录哈希表中,对应的挂载目录分别是tmp、sys和home。

四、查找挂载目录下所有的文件系统

        首先do_umount()->umount_tree()前半部分代码的主要作用是把ext2文件系统tmp挂载目录下的所有文件系统通过递归的方式都查找出来,然后把这些文件系统从挂载点哈希表中删除,最后将查找到的所有文件系统都链接到tmp_list链表中。

其中,next_mnt()函数比较重要也很难懂,该函数的主要作用就是递归的把挂载目录下所有子文件系统都查找出来。例如,next_mnt()首先查找出ext2的子文件系统ext3,如果ext3也挂载了子文件系统,那么next_mnt()接着查找出ext3文件系统下所有的子文件系统,如此递归,直到查找出ext2文件系统下所有的已挂载的文件系统。

五、删除所有子文件系统的挂载节点

do_umount()->umount_tree()后半部分代码的主要作用是解除父子文件系统之间的关系,调用put_mountpoint()将挂载节点从挂载目录哈希表中删除并且释放挂载节点数据结构。

从图中可以看到tmp、sys和home三个挂载节点已经从挂载目录哈希表中删除了,并且挂载节点structmountpoint数据结构也被释放了。

六、挂载源文件系统

do_umount()->namespace_unlock()负责将tmp_list记录的所有文件系统依次从链表中删除,并且调用mntput()释放文件系统挂载点structmount数据结构。

从图中可以看到ext3、xfs和btrfs三个文件系统已经被彻底释放了,即被卸载了,系统中只剩下ext2文件系统了。

七、总结

linux卸载文件系统主要分为三个阶段:查找挂载目录下所有子文件系统的集合,并且链接到一个临时链表中;然后释放这些子文件系统的挂载节点数据结构;最后,遍历临时链表,释放所有子文件系统。

版权声明:

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

时间: 2024-10-09 20:19:54

linux文件系统调用(2)---umount的相关文章

linux文件系统调用(1)---mount

术语表: struct mount:挂载点 struct mountpoint挂载点节点 struct vfsmount:挂载项 源文件系统用户将要挂载的文件系统 目的文件系统挂载源文件系统的文件系统 一.目的 本文将介绍linux挂载文件系统的过程,从系统调用mount()函数开始解析,主要分为三个阶段: 1.新建源文件系统: 2.查找目的文件系统的挂载目录: 3.将源文件系统挂载到目的文件系统的挂载目录: 本文以linux 3.10版本为基础进行讲解. 二.函数调用关系 mount系统调用的

文件编程之Linux下系统调用

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

Linux文件管理系统

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

操作系统-文件系统(5)Linux文件系统管理

主流分区机制有MBR和GPT两种 MBR分区:第一个扇区最重要,里面有:引导代码(Bootstrap code area)及分区表(partition table), 其中Bootstrap code area 占有 446 bytes,而 partition table 则占有 16*4 bytes,知道分隔槽的启动和结束磁柱,最后两个字节是启动标识55h和AAh 只能使用不超过2T的硬盘,否则只能使用2T空间(有第三方解决方案) 最多4个主分区,扩展分区占用主分区位置且无法格式化 逻辑分区建

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'

关于Linux文件描述符的笔记

当某个程序打开文件时,操作系统返回相应的文件描述符,程序为了处理该文件必须引用此描述符.所谓的文件描述符是一个低级的正整数.最前面的三个文件描述符(0,1,2)分别与标准输入(stdin),标准输出(stdout)和标准错误(stderr)对应.因此,函数 scanf() 使用 stdin,而函数 printf() 使用 stdout.你可以用不同的文件描述符改写默认的设置并重定向进程的 I/O 到不同的文件. 首先说什么是文件描述符,它有什么作用? 文件描述符是一个简单的整数,用以标明每一个被

linux内核系统调用--sendfile函数

在apache,nginx,lighttpd等web服务器当中,都有一项sendfile相关的配置,在一些网上的资料都有谈到sendfile会提升文件传输性能,那sendfile到底是什么呢?它的原理又是如何呢? 在传统的文件传输里面(read/write方式),在实现上其实是比较复杂的,需要经过多次上下文的切换,我们看一下如下两行代码: Java代码 read(file, tmp_buf, len); write(socket, tmp_buf, len); 以上两行代码是传统的read/wr

linux 挂载命令mount &nbsp; umount详解

命令格式: mount [选项] <-t 类型> [-o 挂载选项] <设备> <挂载点> mount   [-t vfstype]    [-o options]   device  dir 其中: 1. -t vfstype 指定文件系统的类型,通常不必指定.mount 会自动选择正确的类型. 常用类型有: 光盘或光盘镜像:iso9660 DOS fat16文件系统:msdos Windows 9x fat32文件系统:vfat Windows NT ntfs文件系

Linux文件系统管理命令(第二版)

Linux文件系统管理命令 常用命令 1.df命令 查看分区使用情况 常用选项 -h 比较人性化 -m 以兆字节显示分区使用情况 显示信息: Mounted on:挂载点 Filesystem:对应的具体硬件名 2.du命令 查看文件/目录大小,默认以K为单位 常用选项: -h[humanity] du -h /home/xiaofang -s[统计statistics] du -sh /etc #查看目录大小,常用 3.检测修复文件系统fsck[file system check].e2fsc