`
helloyesyes
  • 浏览: 1306714 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

虚拟文件系统之文件系统的安装与卸载

阅读更多

努力成为linux kernel hacker的人李万鹏原创作品,为梦而战。转载请标明出处

http://blog.csdn.net/woshixingaaa/archive/2011/05/14/6420104.aspx

安装普通文件系统
mount系统调用被用来安装一个普通的文件系统;它的服务例程是sys_mount()。这个函数首先把参数的值拷贝到临时内核缓冲区,也就是位于内核栈的这个函数的那些局部变量。获取大内核锁,并调用do_mount()函数。

它调用do_kern_mount函数,给它传递的参数为文件系统类型,安装标志以及块设备名。
do_kern_mount返回一个新的安装文件系统描述符的地址。

do_add_mount实现的基本功能:
1)获得当前进程的写信号量namespace_sem,因为函数要更改namespace结构。
2)do_kern_mount()函数可能让当前进程睡眠;同时,另一个进程可能在完全相同的安装点上安装文件系统或者甚至更改根文件系统(current->namespace->root)。验证在该文件系统安装点上最近安装的文件系统是否仍指向当前的namespace;如果不是,则释放读/写信号量并返回一个错误码。
3)如果要安装的文件系统已经被安装在由系统调用的参数所指定的安装点上,或该安装点是一个符号链接,则释放读/写信号量并返回一个错误码。
4)初始化由do_kern_mount()分配的新安装文件系统对象的mnt_flags字段的标志。
5)调用graft_tree()把新安装的文件系统对象插入到namespace链表,散列表及父文件系统的子链表中。
6)释放namespace_sem读/写信号量并返回
这里说明一下真正实现文件系统安装的是do_add_mount函数,而不是do_kern_mount函数。do_kern_mount函数只是得到一个vfsmount,并初始化超级块之类的。真正的挂载在do_add_mount函数中调用的graft_tree,graft_tree调用的attach_recursive_mnt,attach_recursive_mnt调mnt_set_mountpoint(dest_mnt,dest_dentry,source_mnt)完成的:

分配超级块对象
文件系统对象的get_sb方法通常是由单行函数实现,例如在Ext2文件系统中该方法的实现如下:

get_sb_bdev()VFS函数分配并初始化一个新的适合于磁盘的文件系统的超级块;它接受ext2_fill_super()函数的地址,该函数从Ext2磁盘分区读取磁盘超级块。

安装文件系统
安装文件系统分两个阶段:
1.内核安装特殊rootfs文件系统,该文件系统仅提供一个作为初始安装点的空目录。
2.内核在空目录上安装实际根文件系统。
阶段一:安装rootfs文件系统
第一阶段由init_rootfs()和init_mount_tree()函数完成的,它们在系统初始化过程中完成。

1.调用do_kern_mount函数,把字符串"rootfs"作为文件系统类型参数传递给它,并把该函数返回的新安装文件系统描述符的地址保存在mnt局部变量中。do_kern_mount()最终调用rootfs文件系统的get_sb方法,也即rootfs_get_sb()函数:

get_sb_nodev()函数执行如下步骤:

a.调用sget()函数分配新的超级块,传递set_anon_super()函数的地址作为参数。接下来,用合适的方式设置超级块的s_dev字段:主设备号为0,次设备号不同于其他已安装的特殊文件系统的次设备号。
b.将flags参数的值拷贝到超级块的s_flags字段中。
c.调用ram_fill_super()函数分配索引节点和对应的目录项对象,并填充超级块字段值。由于rootfs是一种特殊文件系统,没有磁盘超级块,因此只需执行两个超级块操作。
d.返回新超级块的地址。
2.为进程0的命名空间分配一个namespace对象,并将新分配的已安装文件系统描述符插入到namespace的链表中。
3.将系统中每个进程的namespace字段设置为namespace对象的地址;同时初始化引用计数器namespace->count(缺省情况下,所有进程共享同一个初始namespace)。
4.将进程0的根目录和当前工作目录设置为根文件系统。
阶段二:安装实际根文件系统
prepare_namespace()函数执行如下:


卸载文件系统
umount()系统调用用来卸载一个文件系统。

该函数执行如下操作:
1.调用user_path()查找安装点路径名;该函数把返回的查找结果存放在nameidata类型的局部变量nd中。
2.如果查找的最终目录不是文件系统的安装点,则设置retval返回码为-EINVAL并跑到第6步。这种检查是通过验证path.mnt->mnt_root进行的。
3.如果要卸载的文件系统还没有安装在命名空间中,则设置retval返回码为-EINVAL并跳到第6步,这种检查是通过验在path.mnt上调用check_mnt()函数进行的。
4.如果用户不具有卸载文件系统的特权,则设置retval返回码为-EPERM并跳到第6步。
5.调用do_umount(),传递给他的参数为path.mnt和flags。
a.从已安装文件系统对象的mnt_sb字段检查超级块对象的sb的地址。
b.如果用户要求强制拆卸操作,则调用umount_begin超级块操作中断任何正在进行的安装操作。
c.如果要卸载的文件系统是根文件系统,且用户并不要求真正的把它卸载下来,则调用do_remount_sb()重新安装根文件系统为只读并终止。
d.为进行写操作而获取当前进程的namespace_sem读/写信号量和vfsmount_lock自旋锁。
e.如果已安装文件系统不包含任何子安装文件系统的安装点,或者用户要求强制卸载文件系统,则调用umount_tree()卸载文件系统(及其所有子文件系统);
f.释放vfsmount_lock自旋锁和当前进程的namespace_sem读/写信号量。
6.减少相应文件系统根目录的目录项对象和已安装文件系统描述符的引用计数器的值;这些计数器值由path_lookup()增加。
7.返回retval的值。

分享到:
评论

相关推荐

    Linux系统中文件系统的安装与卸载

    总的来说,Linux系统中文件系统的安装和卸载是通过VFS(Virtual File System,虚拟文件系统)层实现的,它提供了一个统一的接口,让不同的文件系统能以相同的方式被操作。这种机制允许Linux支持多种文件系统类型,并...

    虚拟文件系统(VFS)

    虚拟文件系统(VFS) 虚拟文件系统(VFS)是由 Sun Microsystems 公司在定义网络文件系统(NFS)时创造的。它是一种用于网络环境的分布式文件系统,是允许和操作系统使用不同的文件系统实现的接口。 知识点: 1. ...

    虚拟文件系统V2

    虚拟文件系统(Virtual File System,简称VFS)是一种在操作系统中用于实现不同文件系统兼容性的抽象层,它是Linux系统中的一项关键技术,为各种不同的文件系统提供统一的用户接口。Linux通过VFS能够在不同的文件...

    载入和卸载文件系统 Linux

    `proc`文件系统是一个虚拟文件系统,用于提供系统进程信息。Linux支持多种文件系统,如ext3、ext4用于常规硬盘存储,tmpfs用于内存文件系统,vfat用于与Windows系统交互,而proc则提供系统状态信息。 在实际操作中...

    C语言编写的虚拟文件系统

    虚拟文件系统还涉及到文件系统的挂载和卸载。挂载操作需要解析设备名或网络路径,初始化文件系统,并将其连接到VFS层次结构中。卸载操作则需要确保所有文件都已关闭,并释放与该文件系统关联的所有资源。 在提供的`...

    虚拟文件系统(包含源代码)

    虚拟文件系统(Virtual File System,VFS)是操作系统中的一个重要组成部分,它为应用程序提供了一个统一的接口来访问各种类型的文件存储设备,无论这些设备是硬盘、网络共享、内存中的文件系统还是其他形式。...

    Linux虚拟文件系统实现机制研究.pdf

    Linux虚拟文件系统(Virtual File System, VFS)是Linux操作系统中的一个核心组件,它提供了一个统一的接口,使得用户程序可以访问多种不同类型的文件系统,如EXT2、EXT3、EXT4、VFAT等,而无需关心底层的具体实现。...

    centos7上安装与卸载vsftpd服务器

    ### CentOS 7 上安装与卸载 vsftpd 服务器 #### 一、vsftpd 服务器简介 vsftpd (Very Secure FTP Daemon) 是 Linux 系统上一款广泛使用的文件传输协议 (FTP) 服务器软件。它以轻量级、高效能著称,尤其适合在资源...

    linux虚拟文件系统与物理文件系统.doc

    总的来说,Linux的虚拟文件系统是操作系统与物理文件系统之间的重要桥梁,它提供了标准化的操作接口,使得开发者和用户能够以一致的方式处理各种不同特性的文件系统。同时,VFS的设计也确保了系统的可扩展性和兼容性...

    (免费)VM虚拟机完全卸载

    然而,有时我们可能需要彻底卸载VM虚拟机以解决安装问题或者更新到新版本,这时可能会遇到卸载不干净、残留文件导致新版本无法安装的情况。本文将详细讲解如何正确、全面地卸载VM虚拟机,确保系统清洁,为后续的安装...

    实现unix虚拟文件系统

    在计算机科学领域,Unix虚拟文件系统(Virtual File System,VFS)是Unix操作系统中的一个核心组件,它为上层应用程序提供了一个统一的接口,用于访问各种不同类型的文件系统,如本地磁盘文件系统、网络文件系统...

    VM虚拟机卸载干净.rar

    本文将详细解释如何正确地卸载VM虚拟机,并利用提供的压缩包文件进行干净卸载。 首先,常规的卸载过程通常通过Windows控制面板或设置中的“程序和功能”来完成。用户只需找到VMware Workstation的条目,点击卸载...

    VM虚拟机卸载工具

    通过正确使用这样的专业卸载工具,可以有效地避免因为VM虚拟机卸载不干净而导致的安装失败,确保系统的稳定性和后续的顺利使用。对于IT专业人士来说,掌握这类问题的解决方案是提升工作效率的关键。

    文件管理_虚拟文件系统_

    虚拟文件系统(Virtual File System, VFS)是这一领域的高级概念,它为不同的物理文件系统提供了一致的接口,使得操作系统能透明地访问各种类型的文件系统。本项目实现了这样一个虚拟文件系统,适用于操作系统课程...

    完全卸载VM软件避免安装错误

    在IT领域,虚拟化技术是不可或缺的一部分,而VMware(VM)是一款广泛应用的虚拟机软件,它允许用户在单个物理主机上运行多个操作系统。然而,有时候由于各种原因,我们可能需要完全卸载VMware,比如为了升级到新版本...

    vmware强制卸载工具

    "Total-Uninstall-Setup-6.2.0.exe"是该软件的安装程序,用户可以通过运行这个文件来安装Total Uninstall,然后利用其强大的卸载功能来解决VMware的卸载问题。 当常规的“控制面板”或“程序与功能”中的卸载选项...

    创建卸载虚拟驱动器的软件源码

    该函数允许应用程序在不改变系统硬件的情况下更改文件路径与驱动器名称之间的映射关系。 - **参数说明**: - `dwFlags`:指定操作类型。常用的值有 0 (表示添加一个新的设备名映射) 和 2 (表示删除现有的设备名...

    linux 中 卸载virbr0 虚拟网卡的方法

    这个命令会删除所有与虚拟化相关的包,包括创建virbr0所需的库和配置文件。 3. **再次检查状态**:执行`ifconfig -a`命令确认virbr0是否已经被成功移除。 ### 方法二:直接卸载libvirt 另一种方法是直接卸载...

Global site tag (gtag.js) - Google Analytics