启动管理-启动流程-启动过程(有流程图)
文章目录
- 前言
- 1. 启动过程流程图
- 2. 对启动过程的解读
- 2.1 从BIOS--->内核解压并自检
- 2.2 从找到intramfs-->挂载真正的根目录
- 2.2.1 查看initramfs文件
- 2.3 从/sbin/init到/etc/init/rcS.conf
- 2.4 从/etc/inittab到进入系统
- 3. 总结
- 4. 补充 /etc/rc.d/rc.sysinit初始化
前言
- Linux的启动过程还是非常复杂的。学习启动过程可以加深对Linux有整体认识,从而对Linux的体系更加了解。字不如图,图不如视频。所以通过图的方式,来学习Linux启动过程。
1. 启动过程流程图
2. 对启动过程的解读
2.1 从BIOS—>内核解压并自检
- 当我们开机之后,主板上的BIOS芯片就会进行自检,自检完成之后,会加载MBR(主引导记录),主引导记录当中保存是启动引导程序, 在Linux当中,Linux的启动引导程序叫grub,grub保存在MBR里,是系统启动的主要引导程序,在MBR当中,通过这个引导程序来进行下一步的启动过程,这个时候会进行选择,有一个分支,如果服务器只有一个Linux,那么启动引导程序grub就会直接加载Linux内核,然后进行下一步的启动。如果计算机里不仅有Linux还有Windows,或者有两个不同版本的Linux,这个时候会进入多系统启动的状态,有一个列表,在里面去选。 这时会出现类似Windows的界面会让你选,虚拟机在启动的时候会有倒数五秒,在倒数五秒的时候按一下任意键盘,会出现选择界面,默认只有一个Linux系统,要是有多个可以在这里去选,到底启动哪一个,那么选定哪个操作系统就会加载这个操作系统所对应的内核,选的是Linux,就会加载Linux内核,选的是Windows,就加载Windows内核。如果有多个系统就会多一个选择界面。最终都会加载需要启动操作系统的内核。然后启动就会到下一步。内核是压缩的内核,内核本身就不大,如果不压缩会占用比较大的启动空间,所以把它做了一个压缩。所以会先在内存当中进行压缩进行解压缩,解压缩之后,内核会在做一次自检,bios会进行一次自检,内核在进行一次自检,如果是Linux,一般Linux信任的是内核自检,会把内核的自检过程记录在dmesg命令(输入可以看到启动自检过程的信息)当中,启动这个过程之后,内核加载之后,就需要内核去加载驱动。
2.2 从找到intramfs–>挂载真正的根目录
- 前言: 装虚拟机的时候是这样的,安装完Linux,所有的硬件内核直接就驱动了,然后就直接可以使用了。Windows:装完计算机,需要给每一个硬件安装驱动,然后才能使用,说明Windows装的单纯的操作系统。不附带任何驱动程序,如果想使用驱动,需要手工安装,当然Windows当中会集成一些简单的驱动,到那时绝大多数的驱动还是需要手动安装的,但是Linux不是,Linux的真实机安装和虚拟机安装是完全一样的。
- 内核只要安装完,所有的驱动都装在内核当中,内核通过服务器的硬件,来判断到底需要哪个驱动,会自动加载(练习用的虚拟机和真实机完全一样,都不需要手工安装驱动,只需要把内核装那,会自动帮你检测驱动。)这样有一个问题,如果把所有硬件的驱动都放在内核里,那么内核就会变得无比庞大。 解决方案是: 把常见得驱动放在内核里。把不常见的驱动,作为函数模块。把驱动写成一个程序,保存在硬盘里,一般放在硬盘的/lib/这个目录当中,是函数库的保存位置。 把他放进去,然后当我需要的时候内核直接去这里去读,把他拿出来就可以了。这样保证了我的内核不会太大。绝大多数的硬件驱动都不需要手工安装,Linux会自动进行识别。只有一种情况下,需要手工安装驱动,比如Linux内核当中没有包含这个硬件的驱动,比如说硬件太新了。当这个硬件发行的时候,内核早都出现了。所以有可能进行手工安装。但是大多数的程序,尤其是服务器上的硬件,都不需要手工安装驱动。也就是说内核解压自检完成之后,应该去/lib/下去读取这个驱动。读出来就可以加载了。
- 硬盘接口的驱动在硬盘里,内核需要去硬盘读取驱动,可是内核没有硬盘接口的驱动,进不去,这个问题该如何解决??? 我们的硬盘如果是IDE接口,IDE接口的驱动是直接在内存当中,就可以认识IDE硬盘,然后去找到/lib/目录然后拿出。但是我们现在绝大多数的计算机,我们的硬盘都是SATA接口的,或者SCSI接口(淘汰了)。SATA接口的硬盘,内核认为驱动不是必须的,所以他是作为模块放在/lib这个目录当中。这就是产生的问题: 我的内核必须要去/lib/当中读取出来SATA的这个驱动,才能识别硬盘,但是我既然没有识别硬盘,怎么去加载他的驱动那???SATA接口的这个驱动,是放在硬盘的/lib/目录下的,但是如果我没有这个驱动,是无法读取这个硬盘的,我也当然就无法打开/lib这个目录。
- 举个形象的栗子来说明这个问题: 如果进自己家的门,通过钥匙才能打开,但是那钥匙(相当于驱动,驱动就放在/lib/目录下),但是钥匙没有在身上(相当于内核没有驱动),而是把锁在了房间里面。请问如何进这个屋里???解决方法: 如果真要开房间就要找开锁公司,但是对Linux内核,也是用类似的办法。他在我们的启动分区当中,有一个initamfs文件系统,这个文件系统模拟了一个跟硬盘基本相似的这个结构,然后那内核先加载他,通过它把基本的常见驱动,加载到内核里,也就是说SATA的这个驱动,没有直接再从/lib/下去调,而是从这个假的文件系统里面去调,内核加载了它之后,才建立仿真目录,然后才能去加载真正的硬盘分区,才能读取剩余的其他驱动。 也就是说有一个假的根目录,这个根目录当中保存了硬盘上必须的这些驱动。把这个加载到内核里,内核就可以去调用真正的硬盘。相当于找开锁公司,配了把假钥匙,拿这个假钥匙就能打开门,能取出真钥匙,才能读取后续的命令。
- 这时还会有疑问: Initramfs文件是放在/boot目录下,那/boot/不也在硬盘上吗?内核居然没法加载/lib/,当然也无法加载/boot??? /boot这个分区不是由内核直接加载的,而是由启动引导程序事先就已经读取出来的。 /boot目录整个就是启动分区,所以启动引导程序默认是可以识别boot分区的,所以不存在驱动这样的一个过程。
2.2.1 查看initramfs文件
开始实验:
- (1)打开这个initramfs内存文件系统,看一下里面有什么
小提示:
- cpio命令在rpm包安装的时候使用过,
cpio –ivcdu < 文件
就可以读取里面的内容,会把这个文件解压缩。bin、dev、etc、lib目录,绝大多数的驱动都在这,跟真正的根目录有些相似,也就是说是利用这个文件,模拟一个跟根差不多的目录,主要的目的是为了加载这个文件当中,lib下的这些驱动。 - 上面的查看initramfs文件的过程是手工进行解压的过程,在真正启动的时候,这个解压过程应该在内存当中直接进行的,建立仿真目录,里面有硬件的驱动。然后就可以读取真正的硬盘上的驱动了,就可以读取真正的系统的硬盘了。然后就可以读取里面真正的根目录了。 到这个时候,这个仿真根目录的作用使命就结束了。
2.3 从/sbin/init到/etc/init/rcS.conf
读出来真正的系统硬盘空间。系统启动的第一个进程,通过它才可以进行后续的启动进程。然后调用了/etc/init/rcS.conf文件。
/etc/init/rcS.conf
文件主要有两个功能:
- 第一个功能: 先调用
/etc/rc.d/rc.sysinit
这个文件,主要作用是进行Linux系统的初始化。 (没有这个文件的存在,系统是无法正常启动的,其实它只要正常加载,正常初始化,这时系统的基本功能就已经全部具备了。完成系统的基本启动。) - 第二个功能是:然后再调用/etc/inittab,确定系统默认级别。 就是定义进入字符界面还是进入图形界面。(定义了运行级别之后那,需要把运行级别传到
/etc/init/rc.conf
这个配置文件,通过这个配置文件调用/etc/rc.d/rc
,其实归根结底是调用/etc/rc[0-6].d
这个目录。如果是字符界面,那就调用/etc/rc3.d
这个目录下所有的程序,如果是图形界面,那就调用/etc/rc5.d
当中的所有程序。)
小总结:
- (1)读出来之后继续调用
/sbin/init
这个文件,这个命令。init是系统启动的第一个进程,是所有其余进程的父进程,在centos 5.x当中,他的作用会远比现在还要大,现在作用稍微消弱了。但还是系统启动的第一个进程。 - (2)也就是说
/etc/init/rcS.conf
有两个功能,第一进行系统的初始化,系统初始化完成之后,操作系统的基本功能就具备了。但是这只是它的最基本功能,要想正常使用,需要确定系统是进入的字符界面还是图形界面,如果进入的是不同的界面,还需要启动对应的附加程序才可以完成整个系统的启动。
2.4 从/etc/inittab到进入系统
从/etc/inittab经过调用,运行级别参数传入/etc/rc.d/rc这个脚本之后,由这个脚本我呢见按照不同的级别启动/etc/rc[0-6].d/目录中的相应的程序。如果级别为3,进入cd /etc/rc3.d/ 字符界面的级别下,目录下都是执行文件。而且这些执行文件很特殊,很有规律,要么以K开头,要么以S开头的,K开头的对字符界面没有太大的作用,所以默认把他关了。S开头的一次启动,如果把这些程序都启动了,我的系统就进入了对应的字符界面级别。这些都是程序,全部都是命令,他们都是软连接(快捷方式);
/etc/rc3.d/K??开头的文件 (??是数字),会按照数字顺寻依次关闭
/etc/rc3.d/S??开头的文件 (??是数字),会按照数字顺序依次启动
- (1)查看/etc/rc3.d文件
- 在登录界面之前还会调用,/etc/rc.d/rc.local(服务管理涉及过)文件,只要把这个命令写到这个文件里,在开机的时候都会执行一遍。为什么再开机是都会执行一遍那???按照启动顺序,在登录之前,会把这个文件当中所有的命令都会执行一遍,所以可以把服务的启动命令写在这里。然后登录进入系统。注意: 如果是图形界面,/etc/rc.d/rc.local这一步执行完之后,还要进行一系列操作,这里主要指的是启动了图形界面的Xserver和图形界面的Xclient程序,依次启动之后才可以起。
3. 总结
(1) 从BIOS自检,到加载内核,到加载驱动,到加载运行级别,一系列的启动过程,完成的启动过程。
(2) 重点理解加载驱动的过程,initramfs文件的功能(内核通过它获取常见的驱动,同时包括SATA硬盘接口的驱动,然后才能进入硬盘,读取真正的根目录)
(3) 如果启动级别是5,进入的图形界面,那么/etc/rc.d/rc.local
这一步执行完之后,还要进行一系列操作,这里主要指的是启动了图形界面的Xserver和图形界面的Xclient程序,依次启动之后才可以启动图形界面。
(4) 图形界面对服务器来讲用处不大,不建议去使用图形界面。
4. 补充 /etc/rc.d/rc.sysinit初始化
/etc/rc.d/rc.sysinit初始化了哪些东西那???
- 获得网络环境
- 挂载设备
- 开机启动画面Plymouth
- 判断是否启用SELinux
- 显示开机过程中的欢迎画面
- 初始化硬件
- 用户自定义模块的加载
- 配置内核的参数
- 设置主机名
- 同步存储器
- 设备映射器及相关的初始化
- 初始化软件磁盘阵列(RAID)
- 初始化LVM的文件系统功能
- 检验磁盘文件系统(fsck)
- 设置磁盘配额(quota)
- 重新以可读写模式挂载系统磁盘
- 更新quota(非必要)
- 启动系统虚拟随机数生成器
- 配置机器(非必要)
- 清除开机过程当中的临时文件
- 创建ICE目录
- 启动交换分区(swap)
- 将开机信息写入/var/log/dmesg文件中
启动管理-启动流程-启动过程(有流程图)相关推荐
- 计算机管理器win,进入windows启动管理器,win启动管理器
众所周知,系统中的服务管理器是一个非常常用的功能,通常在进行设置一些操作的时候才会用到,然而有使用windows10系统的用户表示不知道如何打开服务管理器,为此表示非常苦恼,那么在windows10系 ...
- 不要在学习启动管理器和元编程上浪费时间
为什么说不要浪费时间在启动管理器上 启动管理器是指引导操作系统启动的一段程序.常见的启动管理器有windows boot manager和grub,这两个都是x86 PC体系里的,macOS和Andr ...
- 【Android 插件化】Hook 插件化框架总结 ( 插件包管理 | Hook Activity 启动流程 | Hook 插件包资源加载 ) ★★★
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- Android程序包管理(1)--PKMS启动过程
一.PKMS启动过程 1.重要文件目录介绍 1.目录: /system/ect/permissions/xxx.xml:加载系统feature /system/ect/permissions/plat ...
- Linux内核启动及文件系统加载过程
当u-boot开始执行bootcmd命令,就进入linux内核启动阶段 与 u-boot 类似,普通 Linux 内核的启动过程也可以分为两个阶段,但针对压缩了的内核如 uImage 就要包括内核自解 ...
- android app启动流程分析,Android应用开发之Android 7.0 Launcher3的启动和加载流程分析...
本文将带你了解Android应用开发Android 7.0 Launcher3的启动和加载流程分析,希望本文对大家学Android有所帮助. Android 7.0 Launcher3的启动和加载流程 ...
- Android 7.0 Launcher3的启动和加载流程分析----转载
Android 7.0 Launcher3的启动和加载流程分析,Launcher的本质就是一个普通应用,它比普通应用多配置了Category的Android:name="android ...
- 启动jboss_3种启动JBoss BPM流程的基本方法
启动jboss 这一集提示和技巧将帮助您了解根据需要启动流程实例的最佳方法. 规划项目可能包括流程项目,但是您是否考虑过可以启动流程的各种方式? 也许您的JBoss BPM Suite在您的体系结构中 ...
- Nginx学习之十一-Nginx启动框架处理流程
Nginx启动过程流程图 下面首先给出Nginx启动过程的流程图: ngx_cycle_t结构体 Nginx的启动初始化在src/core/nginx.c的main函数中完成,当然main函数是整个N ...
最新文章
- PrestaShop 网站漏洞修复如何修复
- [置顶] 程序员的奋斗史(十五)——谈性格
- [转]WebPack 常用功能介绍
- 深入理解多线程(三)—— Java的对象头
- 初步认识Volatile-MESI优化带来的可见性问题
- Leetcode 172 Factorial Trailing Zeroes
- 每天进步一点点《ML - K-means》
- Python中几个操作列表的内置函数filter(),map(),reduce(),lambda
- 最强战队出炉,2020腾讯广告算法大赛圆满落幕
- 小程序 报request:fail invalid url 不校验合法域名已勾选
- Invisible Perturbations: Physical Adversarial Examples Exploiting the Rolling Shutter Effect 论文解读
- 【面试题】一个号称BAT算法题
- arm平台下的反汇编pdf_stm32逆向与安全科普,bin文件逆向反汇编
- 回调函数Callback
- Python selenium练习:华为保修查询
- Excel VLOOKUP() 函数实现自动填充内容
- 数据处理任务量级巨大?构建预置容器镜像的Amazon EKS解决方案了解一下!
- (转)Android兼容8.0后APP图标变为原生小机器人图标
- 对于“卡片复用”引来的一场尴尬。。。
- Ubuntu16.04安装卸载Kinetic