文件系统的挂载(2)---挂载rootfs文件系统
一、目的
本文主要讲述linux内核rootfs文件系统的挂载过程,内核版本为3.10。
rootfs是基于内存的文件系统,没有实际的存储设备,所有操作都在内存中完成。为了保证linux内核的精简性,很多与内核不强相关的功能(设备驱动等)都放在了initrd中,而rootfs文件系统最重要的作用就是为initrd提供了挂载目录:root根目录。
initrd挂载完成后,内核运行第一个进程init,init进行一系列的初始化操作,包括加载磁盘设备驱动程序和磁盘文件系统,最后把内核的根目录从rootfs的根目录切换到磁盘文件系统的根目录。
二、主要函数调用过程
下面给出挂载rootfs文件系统的主要函数调用关系(图中红色部分),便于后面的分析。
三、分析vfs_cache_init()
vfs_cache_init()首先建立并初始化目录hash表dentry_hashtable和索引节点hash表inode_hashtable;然后设置内核可以打开的最大文件数;最后调用mnt_init()负责sysfs和rootfs文件系统的建立和挂载。
四、挂载sysfs文件系统
sysfs文件系统主要用来展示linux驱动模型,sysfs先于rootfs挂载是为了全面展示linux驱动设备做好准备。
mnt_init()调用sysfs_init()创建并挂载sysfs文件系统,然后调用kobject_create_and_add()创建“fs”目录。
下面详细介绍sysfs文件系统的挂载过程:
1、sysfs_init()调用register_filesystem()注册sysfs文件系统类型sysfs_fs_type,并加入到全局单链表file_systems中。sysfs_fs_type定义如下,mount成员函数负责超级块、根目录和索引节点的建立和初始化工作。
2、sysfs_init()调用kern_mount()挂载文件系统,kern_mount()调用vfs_kern_mount()创建并初始化挂载点数据结构structmount,并使用全局变量sysfs_mnt保存该挂载点的挂载项(mnt成员)。
3、kern_mount()调用sysfs_fs_type的成员函数sysfs_mount()创建并初始化超级块、根目录“/”、根目录的索引节点等数据结构;并且把超级块添加到全局单链表super_blocks中,把索引节点添加到hash表inode_hashtable和超级块的inode链表中。
4、vfs_kern_mount()初始化sysfs_mnt挂载点的根目录和超级块。
5、mnt_init()调用kobject_create_and_add()创建“fs”目录。
通过以上步骤,sysfs文件系统在VFS中的视图如下:其中超级块处在super_blocks单链表中;为了提高查找效率,索引节点处在名为inode_hashtabld的hash表中;超级块链接起所有属于该文件系统的索引节点;目录项指向各自的索引节点;挂载点指向超级块和根目录。
五、挂载rootfs文件系统
mnt_init()调用init_rootfs()注册rootfs文件系统,然后调用init_mount_tree()挂载rootfs文件系统。
下面详细介绍rootfs文件系统的挂载过程:
1、mnt_init()调用init_rootfs()注册rootfs文件系统类型rootfs_fs_type,并加入到全局单链表file_systems中。rootfs_fs_type定义如下,mount成员函数负责超级块、根目录和索引节点的建立和初始化工作。
2、init_mount_tree()调用vfs_kern_mount()挂载rootfs文件系统,详细的挂载过程与sysfs文件系统类似,不再熬述。
3、init_mount_tree()调用create_mnt_ns()创建命名空间,并设置该命名空间的挂载点为rootfs的挂载点,同时将rootfs的挂载点链接到该命名空间的双向链表中。
4、init_mount_tree()设置init_task的命名空间,同时调用set_fs_pwd()和set_fs_root()设置init_task任务的当前目录和根目录为rootfs的根目录”/”。
通过以上分析,我们发现sysfs和rootfs的区别在于:虽然系统同时挂载了sysfs和rootfs文件系统,但是只有rootfs处于init_task进程的命名空间内,也就是说系统当前实际使用的是rootfs文件系统。
此时,sysfs和rootfs在VFS中的视图如下:为了突出图中主要的关系,省略了挂载点指向超级块和根目录的关系。
从图中看出,只有rootfs处于进程的命名空间中,并且进程的fs_struct数据结构的root和pwd都指向了rootfs的根目录”/”,所以此时用户的所有文件操作,实际只在rootfs文件系统上生效,而sysfs并不参与。
六、总结
linux文件系统在初始化时,同时挂载了sysfs和rootfs文件系统,但是只有rootfs处于进程的命名空间中,且进程的root目录和pwd目录都指向rootfs的根目录。至此,linux的VFS已经准备好了根目录(rootfs的根目录”/”),此时用户就可以使用系统调用进行文件和目录的各种操作,对rootfs文件树进行扩展。
文件系统的挂载(2)---挂载rootfs文件系统的更多相关文章
- linux文件系统初始化过程(2)---挂载rootfs文件系统
一.目的 本文主要讲述linux3.10文件系统初始化过程的第一阶段:挂载rootfs文件系统. rootfs是基于内存的文件系统,所有操作都在内存中完成:也没有实际的存储设备,所以不需要设备驱动程序 ...
- 嵌入式环境:挂载开发板根NFS文件系统失败
挂载开发板根NFS文件系统的时候,发现了下面的问题: Looking up port of RPC 100003/2 on 192.168.2.109rpcbind: server 192.168.2 ...
- CentOS6.5下挂载NTFS格式的文件系统
下载对应CentOS版本的rpmforge,下载地址:http://pkgs.repoforge.org/rpmforge-release/ 安装rpmforge,输入命令:# rpm -ivh rp ...
- 鸿蒙内核源码分析(挂载目录篇) | 为何文件系统需要挂载 | 百篇博客分析OpenHarmony源码 | v65.01
百篇博客系列篇.本篇为: v65.xx 鸿蒙内核源码分析(挂载目录篇) | 为何文件系统需要挂载 | 51.c.h.o 文件系统相关篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说一 ...
- Linux的文件系统及其硬盘分区挂载原理
如果您是一位新手,也许 您还不知道如何把文件从Windows拷贝到Linux上吧?下面,我们将说明Unix文件系统以及mount的工作过程,然后再比较详细地讨论. mount的使用和有关选项.如果您已 ...
- 鸿蒙内核源码分析(根文件系统) | 先挂到`/`上的文件系统 | 百篇博客分析OpenHarmony源码 | v66.01
百篇博客系列篇.本篇为: v66.xx 鸿蒙内核源码分析(根文件系统) | 先挂到/上的文件系统 | 51.c.h.o 文件系统相关篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说一 ...
- ext3是对ext2文件系统的一个扩展高性能日志文件系统
嵌入式开发者所做的最重要的决定之一就是部署哪种文件系统.有些文件系统性能比较高有些文件系统空间利用率比较高,还有一些文件系统设备故障或者意外断电后恢复数据比较方便. linux文件系统概念 分区 分区 ...
- Linux 文件系统类型 文件系统结构 与Windows文件系统的比较
摘自:http://blog.csdn.net/gelivable007/article/details/7249365 Linux 文件系统类型 磁盘文件系统.包括硬盘.CD-ROM.DVD.USB ...
- 鸿蒙内核源码分析(文件系统篇) | 用图书管理说文件系统 | 百篇博客分析OpenHarmony源码 | v63.01
百篇博客系列篇.本篇为: v63.xx 鸿蒙内核源码分析(文件系统篇) | 用图书管理说文件系统 | 51.c.h.o 文件系统相关篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说一 ...
随机推荐
- 一个 JAR 文件可以用于
用于发布和使用类库 作为应用程序和扩展的构建单元 作为组件.applet 或者插件程序的部署单位 用于打包与组件相关联的辅助资源 package Com.Table; import java.util ...
- ps4 如何导出切片 单个图片
快捷键C,进行切片 按住ctrl+alt+shift+s存储为WEB格式的,在对话框中按ctrl键选中要导出的切片,右边栏中有JPG还有GIF等格式的,下面选仅选图像,即可,如果你没有设置的话,电脑有 ...
- ORACLE 几个我忍了他很多年的问题
① DataGuard环境,主库创建的临时文件,不在备库上创建 ② 创建11G R2 Rac环境时,在RHEL 6.0及以后版本上,最后执行root.sh命令时,以及重新启动OS后启动ohasd,都需 ...
- spring中基于aop使用ehcache
我就是对着这个博客看的 http://www.cnblogs.com/ctxsdhy/p/6421016.html
- C# 校验给定的ip地址是否合法
函数用于检测ip地址格式是否合法,包括ip的组成格式,每隔段是否不超过255等,但这个函数不能验证这个ip地址是否可以ping通. /// <summary> /// 验证IP地址是否合法 ...
- Caffe 学习:Eltwise层
Eltwise层的操作有三个: 1. PROD(product):按元素乘积 2. SUM:按元素求和(默认操作) 3. MAX:保存元素大者
- Linux学习笔记(一):文件操作命令
命令 含义 cd / 切换到根目录 cd .. 上级目录 cd ./bin 到同级的bin目录中 cd bin 到同级的bin目录中 cd - usr文件夹 cd ~ 回到root用户的主文件夹 pw ...
- GCT之数学公式(代数部分)
一.代数部分: 1.复数 2.一元二次方程 3.数列 4.排列组合
- Greenplum-cc-web监控软件安装
一环境列表 操作系统 centos6.5 64 Greenplum版本: greenplum-db-4.3.5.3-build-2-RHEL5-x86_64.tar Greenplum集群环境搭建: ...
- Sql server连接数据库报错相关
情况一:此版本的 SQL Server 不支持用户实例登录标志. 解决方法: 方法1:在连接属性的设置里边,点高级,将User Instance 设置为false,默认的true(我在中没有找到相应的 ...