linux文件系统 - 初始化(三)

https://www.cnblogs.com/alantu2018/p/8447309.html

执行init程序

一、目的

内核加载完initrd文件后,为挂载磁盘文件系统做好了必要的准备工作,包括挂载了sysfs、proc文件系统,加载了磁盘驱动程序驱动程序等。接下来,内核跳转到用户空间的init程序,由init完成创建磁盘设备文件、加载磁盘文件系统、从rootfs切换到磁盘根文件系统等工作。

由于在不同的linux发行版中,init的实现方式差异很大,不能将所有的发行版都分析一遍,因此本文选取ubuntu12.04发行版来描述如何从rootfs切换到磁盘根文件系统。

二、创建磁盘设备文件

init程序使用udev工具动态的创建磁盘设备文件。udev的工作原理是根据sysfs中的设备信息,在/dev目录下创建相应的设备文件,因此需要提前准备好sysfs文件系统。

首先,创建必要的挂载点目录/dev、/root、/sys、/proc等;然后,将VFS中的sysfs挂载到rootfs的/sys目录下,将tmpfs挂载到/dev目录下(/dev的文件系统类型为tmpfs);最后,为了输出打印信息,创建了/dev/console、/dev/null两个特殊的设备文件。

这些必要信息准备好后,就可以启动udev后台进程,由udev根据sysfs动态的创建磁盘设备文件。Udev启动代码在scripts/init-top/udev中。
在这里插入图片描述
在这里插入图片描述

三、挂载磁盘文件系统

磁盘文件系统的挂载一般有两种方式:本地方式和网络方式。根据BOOT变量的值,init选择执行本地加载或者网络加载,如果是本地加载则执行/scripts/local脚本;如果是网络加载则执行/scripts/nfs脚本。个人pc一般都是本地加载,数据中心的服务器一般是nfs加载。

最后,由init程序调用/scripts/local脚本挂载磁盘文件系统。
在这里插入图片描述

四、切换根文件系统

成功挂载磁盘文件系统后,需要将rootfs下的/sys、/proc、/dev等重要的目录都迁移到磁盘文件系统下。

最后,通过调用/sbin/run-init程序将内核的根文件系统从rootfs切换到磁盘文件系统的根目录。

在这里插入图片描述

五、最终VFS视图

到此为止,内核文件系统初始化过程就全部完成了,下面给出最终的VFS视图(由于文件系统过大,因此只给出其中关键的拓扑结构):

在这里插入图片描述

六、总结

init程序的主要工作就是加载磁盘文件系统,将rootfs下重要的目录迁移到磁盘文件系统下,最后将内核根目录从rootfs切换到磁盘文件系统的根目录。

Linux根文件系统介绍

根文件系统首先是一种文件系统,但是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。

我们首先从主机上所安装的Linux操作系统中了解一些根文件系统的信息。比如在笔者工作的Linux桌面系统中可以得到下面的结果:

# mount

/dev/hda2 on / type ext3 (rw)

none on /proc type proc (rw)

/dev/hda1 on /boot type ext3 (rw)

none on /dev/pts type devpts (rw,gid=5,mode=620)

none on /dev/shm type tmpfs (rw)

# df

Filesystem 1K-blocks Used Available Use% Mounted on

/dev/hda2 16216016 5667* 9724600 37% /

/dev/hda1 101089 9321 8*9 10% /boot

none 63028 0 63028 0% /dev/shm

从上面的mount命令我们可以看到,在桌面Linux中,根文件系统”/”被mount到/dev/hda2设备上,文件系统类型为ext3,属性为rw即可读写。从df命令则可以得到更多根文件系统使用空间的相关信息。

根文件系统一直以来都是所有类Unix操作系统的一个重要组成部分,也可以认为是嵌入式Linux系统区别于其他一些传统嵌入式操作系统的重要特征,它给Linux带来了许多强大和灵活的功能,同时也带来了一些复杂性。我们需要清楚的了解根文件系统的基本结构,以及细心的选择所需要的系统库、内核模块和应用程序等,并配置好各种初始化脚本文件,以及选择合适的文件系统类型并把它放到实际的存储设备的合适位置。

根文件系统的基本目录结构

Linux的根文件系统以树型结构组织,包含内核和系统管理所需要的各种文件和程序,一般说来根目录”/”下的顶层目录都有一些比较固定命名和用途。

下面列出了一个Linux根文件系统中的比较常见的目录结构:

/bin 存放二进制可执行命令的目录

/dev 存放设备文件的目录

/etc 存放系统管理和配置文件的目录

/home 用户主目录,比如用户user的主目录就是/home/user,可以用~user表示

/lib 存放动态链接共享库的目录

/sbin存放系统管理员使用的管理程序的目录

/tmp 公用的临时文件存储点

/root 系统管理员的主目录

/mnt 系统提供这个目录是让用户临时挂载其他的文件系统。

/proc 虚拟文件系统,可直接访问这个目录来获取系统信息。

/var 某些大文件的溢出区

/usr 最庞大的目录,要用到的应用程序和文件几乎都在这个目录。

对于经常使用Linux系统的读者来说,这些目录大部分应该很熟悉了。不过有几个目录对初学者来说容易混淆,如/bin,/sbin,/usr/bin和/usr/sbin。这里简单介绍一下它们的区别:/bin目录一般存放对于用户和系统来说都是必须的二进制文件,而/sbin目录要存放的是只针对系统管理的二进制文件,该目录的文件将不会被普通用户使用。相反,那些不是必要的用户二进制文件存放在/usr/bin下面,那些不是非常必要的系统管理工具放在/usr/sbin下。此外,对于一些本地的库也非常类似,对于那些要求启动系统和运行的必须命令要存放在/lib目录下,而对于其他不是必须的库存放在/usr/lib目录就可以。

对于嵌入式Linux系统的根文件系统来说,一般可能没有上面所列出的那么复杂,比如嵌入式系统通常都不是针对多用户的,所以/home这个目录在一般嵌入式Linux中可能就很少用到,而/boot这个目录则取决于你所使用的BootLoader是否能够重新获得内核映象从你的根文件系统在内核启动之前。一般说来,只有/bin,/dev,/etc,/lib,/proc,/var,/usr这些需要的,而其他都是可选的。

简单的来说,根文件系统包括虚拟根文件系统和真实根文件系统。在Kernel启动的初始阶段,首先去创建虚拟的根文件系统,接下来再去调用do_mount来加载真正的文件系统,并将根文件系统切换到真正的文件系统,也即真实的文件系统。

一.什么是根文件系统
在传统的Windows机器上目录结构中,可能会包括C:或者D:盘,而他们一般就称之为特定逻辑磁盘的根目录。从文件系统的层面来说,每一个分区都包含了一个根目录区,也即系统中存在多个根目录。

但是,在Linux系统中,目录结构与Windows上有较大的不同。系统中只有一个根目录,路径是“/”,而其它的分区只是挂载在根目录中的一个文件夹,如“/proc”和“system”等,这里的“/”就是Linux中的根目录。

对应根目录也就存在一个根目录文件系统的概念,我们可以将某一个分区挂载为根目录文件系统,如6410公版中就将mtdblk2挂载为根目录文件系统。程序中可以通过U-Boot给Kernel指定参数或者编译选项来指定,如目前的开发板中就通过如下的编译选项来制定根目录文件系统:

CONFIG_CMDLINE="console=ttyS0,115200 mem=108M rdinit=/linuxrc root=/dev/mtdblock2"

简单的来说,根目录文件系统就是一种目录结构,包括了Linux启动的时候所必须的一些目录结构和重要文件。

根文件系统有两种,一种是虚拟根文件系统,另外一种是真实的根文件系统。一般情况下,会首先在虚拟的根文件系统中做一部分工作,然后切换到真实的根文件系统下面。

笼统的来说,虚拟的根文件系统包括三种类型,即Initramfs、cpio-initrd和image-initrd。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/641986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes中拉取Harbor私有镜像

1、首先&#xff0c;确保已经安装了Docker并配置好了与Harbor的连接。可以使用docker login <harbor地址>命令登录到Harbor仓库。 创建一个Secret对象来存储Harbor的认证信息。可以通过运行以下命令生成该Secret对象&#xff1a; kubectl create secret docker-registry…

three.js从入门到精通系列教程002 - three.js正交相机OrthographicCamera

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>three.js从入门到精通系列教程002 - three.js正交相机OrthographicCamera</title><script src"ThreeJS/three.js"></script><script src&qu…

如果查看iPhone的GPU

摘要 了解你的显卡对于在电脑上玩现代图形要求高的游戏非常重要。本文介绍了如何轻松查看你的显卡型号以及为什么显卡在玩电脑游戏时如此关键。 引言 随着电脑游戏的发展&#xff0c;现代游戏对硬件性能的要求越来越高。十年前发布的显卡已经无法满足当前游戏的需求。因此&…

项目管理经验总结

需求优先级管理 需求插入&#xff1a; 如果有紧急需求&#xff0c;或高优先级需求优先其它开发资源&#xff0c;如果现有的人力资源都被占用&#xff0c;可以挂起旧需求、插入新需求。 需求阶段 要点&#xff1a; 确保需求无缺失、无漏洞、无歧义、大小合适。确保开发/测试对需…

什么叫特征分解?

特征分解&#xff08;Eigenvalue Decomposition&#xff09;是将一个方阵分解为特征向量和特征值的过程。对于一个 nn 的方阵A&#xff0c;其特征向量&#xff08;Eigenvector&#xff09;v 和特征值&#xff08;Eigenvalue&#xff09; λ 满足以下关系&#xff1a; 这可以写…

【Linux】:线程池(逐行解析代码)

线程池 一.概念二.模拟实现一个线程池 一.概念 一种线程使用模式。线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线程&#xff0c;等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅…

Distributed Transactions at Scale in Amazon DynamoDB——论文泛读

ATC 2023 Paper 论文阅读笔记整理 问题 NoSQL云数据库服务因其简单的键值操作、高可用性、高可扩展性和可预测的性能而广受欢迎。尽管NoSQL数据库很实用&#xff0c;但它们通常不支持事务。 键值存储等NoSQL数据库是关系数据库的一种替代方案&#xff0c;它强调可扩展性和性…

博捷芯划片机在半导体芯片切割领域的领先实力

在当今高速发展的半导体行业中&#xff0c;芯片切割作为制造过程中的核心技术环节&#xff0c;对设备的性能和精度要求日益提升。在这方面&#xff0c;国内知名划片机企业博捷芯凭借其卓越的技术实力和持续的创新精神&#xff0c;成功研发出具备完全自主知识产权的半导体切割划…

FFmpeg教程:libswscale对图像进行简单处理

我们在FFmpeg简单总结对FFmpeg 组成模块&#xff0c;编码进行了简单介绍。 FFmpeg组成部分&#xff1a; libavcodec&#xff1a; 提供了音视频编解码器的库。 libavformat&#xff1a; 处理多媒体容器格式的库&#xff0c;包括封装和解封装。 libavutil&#xff1a; 包含一些公…

MySQL 8.3 发布,具体有哪些新增和删减?

MySQL 8.3 主要更新&#xff1a;用于标记事务分组的 GTID、JSON EXPLAIN 格式增强、一些功能删除等。 MySQL 是一款广泛使用的开源的关系型数据库管理系统&#xff0c;已推出其最新版本 MySQL 8.3。它带来了新功能和一些删除&#xff0c;有望简化数据库操作。让我们来看看有哪些…

基本的 Socket 模型

什么是Socket Socket 的中文名叫作插口&#xff0c;咋一看还挺迷惑的。事实上&#xff0c;双方要进行网络通信前&#xff0c;各自得创建一个 Socket&#xff0c;这相当于客户端和服务器都开了一个“口子”&#xff0c;双方读取和发送数据的时候&#xff0c;都通过这个“口子”…

用通俗易懂的方式讲解:太棒了!构建大模型 Advanced RAG(检索增强生成)的速查表和实战技巧最全总结来了!

新的一年开始了&#xff0c;也许您正打算通过构建自己的第一个RAG系统进入RAG领域。或者&#xff0c;您可能已经构建了基本的RAG系统&#xff0c;现在希望将它们改进为更高级的系统&#xff0c;以更好地处理用户的查询和数据结构。 无论哪种情况&#xff0c;了解从何处或如何开…

c++类与对象(五):友元、内部类、临时对象、匿名对象

上次重新再次补全了构造函数的内容&#xff0c;以及static成员&#xff1a;C类与对象&#xff08;四&#xff09;&#xff1a;再谈构造函数&#xff08;详解初始化列表&#xff09;、Static成员 今天就来进行类与对象最后一部分的内容 文章目录 1.友元1.1友元函数1.2友元类 2.内…

JVM系列-4.类加载器

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术、JVM原理&#x1f525;如果感觉博主的文…

LeetCode670.最大交换

我真的怀疑他是不是难度等级评错了&#xff0c;因为感觉没到中级&#xff0c;总之先看题吧 给定一个非负整数&#xff0c;你至多可以交换一次数字中的任意两位。返回你能得到的最大值。 示例 1 : 输入: 2736 输出: 7236 解释: 交换数字2和数字7。示例 2 : 输入: 9973 输出:…

常用的三维尺寸公差分析软件有哪些?各有什么特点?

公差分析软件主要用于产品设计和制造过程中&#xff0c;帮助工程师们评估和控制产品的尺寸和公差。以下是一些常用的公差分析软件&#xff1a; 1.DTAS3D是一种用于三维尺寸公差分析的软件系统。 DTAS软件可以帮助工程师和设计师对零件和装配体的尺寸公差进行分析&#xff0c;…

Python os模块

简介 Python的os模块是一个标准库模块&#xff0c;用于提供与操作系统相关的功能&#xff08;相当于接口&#xff09;。os模块允许Python程序与文件系统、目录结构、进程管理等操作系统级别的功能进行交互。 主要功能 文件和目录操作 创建、删除、重命名文件和目录&#xf…

centos7安装pip

centos7 没有python-pip包就执行命令 yum -y install epel-release 执行成功之后&#xff0c;再次执行 yum install python-pip 对安装好的pip进行升级 pip install --upgrade pip 至此&#xff0c;pip工具就安装好了。 所有的问题都是最后一刻解决&#xff0c;如果没有解决…

智慧工业园区建设方案-智慧化工园区物联网管理系统平台---豌豆云

将化工园区海量信息互联、互通、互融&#xff0c;结合化工园区建设管理经验&#xff0c;通过“动态感知、主动监测、政企联动、综合管理”。 将事件管理从事后处置变为事前防控&#xff0c;保障生产安全&#xff0c;提升环保水平&#xff0c;结合可视化大屏&#xff0c;帮助管…

静态路由实验

一&#xff1a;实验内容 二&#xff1a;实验分析 &#xff08;一&#xff09;&#xff1a;实验要求 1、R6为ISP&#xff0c;接口IP地址均为公有地址&#xff1b;该设备只能配置IP地址&#xff0c;之后不能再对其进行其他任何配置&#xff1b; 2、R1-R5为局域网&#xff0c…