文件系统的挂载(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 鸿蒙内核源码分析(文件概念篇) | 为什么说一 ...
随机推荐
- update-alternatives常用命令(转自http://blog.csdn.net/baggio1006/article/details/6338623)
Linux 发展到今天,可用的软件已经非常多了.这样自然会有一些软件的功能大致上相同.例如,同样是编辑器,就有 nvi.vim.emacs.nano,而且我说的这些还只是一部分.大多数情况下,这样的功 ...
- 在js中 把 json对象转化为String对象的方法
方法1: 使用js的扩展方法 ** * json对象转字符串形式 */ function json2str(o) { var arr = []; var fmt = function(s) { if ...
- 联想服务器RD450 配置RAID5
实验环境: 1.服务器型号 ThinkServer RD450 2.四块1TB普通SATA硬盘 实验目的: 配置RAID 5 ,搭建公司文件共享服务器使用. 标注:本教程四块硬盘全做RAID 5,如果 ...
- python模块之psutil详解
一.psutil模块: 1.psutil是一个跨平台库(http://pythonhosted.org/psutil/)能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息 ...
- CorelDRAW X7绘制可爱的卡通动漫多啦A梦
今天小编为大家分享CorelDRAW X7绘制可爱的卡通动漫多啦A梦方法,教程绘制出来的哆啦A梦非常可爱,适合新手来学习,推荐过来,来看看吧! 1.新建文件 新建A4大小横向画布,双击“矩形工具”绘制 ...
- 在Eclipse中查看Javadoc文档
当我们需要查看JDK中类的API介绍时,通常采用的方式是直接查看离线文档或者某些网站提供的在线文档.如下图: 而本文档最终达到的效果是,不需要切换出eclipse,直接在eclipse中查看JDK的J ...
- npm 安装碰到SSL问题
经过仔细排查和google,原来是ssl 的问题: 解决办法: npm config set strict-ssl false
- nginx 配置虚拟主机的三种方法
nginx,一个server标签就是一个虚拟主机. 1.基于域名的虚拟主机,通过域名来区分虚拟主机——应用:外部网站 2.基于端口的虚拟主机,通过端口来区分虚拟主机——应用:公司内部网站,外部网站的管 ...
- 【hadoop】 hadoop 单机伪分布式安装
准备: 虚拟机(CentOS 6.9) JDK1.8 hadoop2.8.0 一.JDK安装及配置 rpm -ivh jdkxxxx 安装 配置环境变量 vim /etc/profile export ...
- nuget包循环引用问题
1.项目中有类库YesWay.Nlog.RabbitMQ,依赖项如下YesWay.Nlog.RabbitMQ=>YesWay.Service.Discovery=>YesWay.Log 2 ...