文章目录

  • 前言
  • 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初始化了哪些东西那???

  1. 获得网络环境
  2. 挂载设备
  3. 开机启动画面Plymouth
  4. 判断是否启用SELinux
  5. 显示开机过程中的欢迎画面
  6. 初始化硬件
  7. 用户自定义模块的加载
  8. 配置内核的参数
  9. 设置主机名
  10. 同步存储器
  11. 设备映射器及相关的初始化
  12. 初始化软件磁盘阵列(RAID)
  13. 初始化LVM的文件系统功能
  14. 检验磁盘文件系统(fsck)
  15. 设置磁盘配额(quota)
  16. 重新以可读写模式挂载系统磁盘
  17. 更新quota(非必要)
  18. 启动系统虚拟随机数生成器
  19. 配置机器(非必要)
  20. 清除开机过程当中的临时文件
  21. 创建ICE目录
  22. 启动交换分区(swap)
  23. 将开机信息写入/var/log/dmesg文件中

启动管理-启动流程-启动过程(有流程图)相关推荐

  1. 计算机管理器win,进入windows启动管理器,win启动管理器

    众所周知,系统中的服务管理器是一个非常常用的功能,通常在进行设置一些操作的时候才会用到,然而有使用windows10系统的用户表示不知道如何打开服务管理器,为此表示非常苦恼,那么在windows10系 ...

  2. 不要在学习启动管理器和元编程上浪费时间

    为什么说不要浪费时间在启动管理器上 启动管理器是指引导操作系统启动的一段程序.常见的启动管理器有windows boot manager和grub,这两个都是x86 PC体系里的,macOS和Andr ...

  3. 【Android 插件化】Hook 插件化框架总结 ( 插件包管理 | Hook Activity 启动流程 | Hook 插件包资源加载 ) ★★★

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  4. Android程序包管理(1)--PKMS启动过程

    一.PKMS启动过程 1.重要文件目录介绍 1.目录: /system/ect/permissions/xxx.xml:加载系统feature /system/ect/permissions/plat ...

  5. Linux内核启动及文件系统加载过程

    当u-boot开始执行bootcmd命令,就进入linux内核启动阶段 与 u-boot 类似,普通 Linux 内核的启动过程也可以分为两个阶段,但针对压缩了的内核如 uImage 就要包括内核自解 ...

  6. android app启动流程分析,Android应用开发之Android 7.0 Launcher3的启动和加载流程分析...

    本文将带你了解Android应用开发Android 7.0 Launcher3的启动和加载流程分析,希望本文对大家学Android有所帮助. Android 7.0 Launcher3的启动和加载流程 ...

  7. Android 7.0 Launcher3的启动和加载流程分析----转载

     Android 7.0 Launcher3的启动和加载流程分析,Launcher的本质就是一个普通应用,它比普通应用多配置了Category的Android:name="android ...

  8. 启动jboss_3种启动JBoss BPM流程的基本方法

    启动jboss 这一集提示和技巧将帮助您了解根据需要启动流程实例的最佳方法. 规划项目可能包括流程项目,但是您是否考虑过可以启动流程的各种方式? 也许您的JBoss BPM Suite在您的体系结构中 ...

  9. Nginx学习之十一-Nginx启动框架处理流程

    Nginx启动过程流程图 下面首先给出Nginx启动过程的流程图: ngx_cycle_t结构体 Nginx的启动初始化在src/core/nginx.c的main函数中完成,当然main函数是整个N ...

最新文章

  1. PrestaShop 网站漏洞修复如何修复
  2. [置顶] 程序员的奋斗史(十五)——谈性格
  3. [转]WebPack 常用功能介绍
  4. 深入理解多线程(三)—— Java的对象头
  5. 初步认识Volatile-MESI优化带来的可见性问题
  6. Leetcode 172 Factorial Trailing Zeroes
  7. 每天进步一点点《ML - K-means》
  8. Python中几个操作列表的内置函数filter(),map(),reduce(),lambda
  9. 最强战队出炉,2020腾讯广告算法大赛圆满落幕
  10. 小程序 报request:fail invalid url 不校验合法域名已勾选
  11. Invisible Perturbations: Physical Adversarial Examples Exploiting the Rolling Shutter Effect 论文解读
  12. 【面试题】一个号称BAT算法题
  13. arm平台下的反汇编pdf_stm32逆向与安全科普,bin文件逆向反汇编
  14. 回调函数Callback
  15. Python selenium练习:华为保修查询
  16. Excel VLOOKUP() 函数实现自动填充内容
  17. 数据处理任务量级巨大?构建预置容器镜像的Amazon EKS解决方案了解一下!
  18. (转)Android兼容8.0后APP图标变为原生小机器人图标
  19. 对于“卡片复用”引来的一场尴尬。。。
  20. Ubuntu16.04安装卸载Kinetic

热门文章

  1. 外企office电话英语
  2. Vue+element实现图片的上传与显示
  3. ++a与a++、--a与a--
  4. AR(增强现实)开发资源汇总
  5. 多次散射 matlab,一种利用外推获得具有多次散射目标远场rcs的方法
  6. Android Studio打造一个小说阅读App
  7. 11. 文件操作与模块
  8. 软件测试面试注意事项汇总
  9. 【fpga里Verilog语言的小知识点】
  10. chrome扩展-打造个性化的web页面