Linux 启动流程学习

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 启动流程学习相关的知识,希望对你有一定的参考价值。

Linux 启动流程学习

开机自检(加载Bios

无论什么机器,在开机后都要进行通电自检(硬件),如果硬件有问题,则无法继续下去。
(例如当内存条松动时或者损坏,就会发出嘀嘀嘀警报声)。接着开始加载BIOS(Basic Input Output System
BIOS是一个写入到主板上的一个软件程序。BIOS会去分析计算机里面有哪些存储设备,
从默认的第一启动项开始启动。

MBR与boot loader

接下来BIOS将程序启动的下一步交给了MBR,他会去读取第一个扇区的MBR位置。
由于不同的操作系统的文件系统格式不相同,因此我们必须要一个引导装载程序来处理文件加载的问题,
也就是BootLoader,而这个BootLoader就安装在启动设备的第一个扇区,也就是MBR(主引导分区)

step1:boot loader

boot loader 有如下功能:
    提供菜单:用户可以选择不同的启动选项
    加载内核文件:直接指向可启动的程序区段来开始操作系统
    转交其他loader:将引导装载功能转交给其他loader负责

boot loader程序 有多个版本

    在linux中有 早期的LILO 和现在使用较多的 grub
    在windows中有 ntloader

step1.5:/dev/sda1

/dev/sda1 通常是开机后的/boot 操作系统起来之后作用很小 可能我们很少注意到这个分区
技术分享图片
但其实这个分区是开机时的根目录 里面存放着很多重要的开机所需要的文件 grub vmlinuz 内核等
根目录会在开机之后再次挂载 也就是开机之后我们能看到的/dev/sda2分区
技术分享图片
这个分区有一个比较有意思的情况 这时我们没有加载文件系统加载模块 也就是不能够挂载 那么我们为什么能够访问到 /boot分区呢
hexdump -C -n 5120 /dev/sda 这条命令可以看到里面有grub信息 表明了他的挂载载不需要模块的帮助
(ps:这里说挂载不太准确 ,说成 可以直接访问更贴切)
技术分享图片

step2: initramfs-.*.img

包含有各种可执行程序和驱动程序,这些驱动程序中包括 即将加载的真正的文件系统的存储介质的驱动

技术分享图片
技术分享图片
技术分享图片
到了这一步 有了ext4模块就可以加载文件系统了

/boot下有一个grub. conf配置文件
技术分享图片

技术分享图片

default 0 表示默认启动第一个选项  也就是可以有多个内核可供选择
timeout 表示等待多长时间以后系统自动选择默认选项启动
splashiamge 是定义了一个开机启动时的背景图 可以自定义
title 分隔开了每一个内核:
    root (hd0,0) 表示当前根为 第一个磁盘的第一个分区
    kernel 表示当前内核 rhgb表示系统默认启动以图形化界面开启 quiet  只显示重要信息 安静模式
    initrd 表示启动系统映像文件名称

这里还有一个执行顺序问题需要注意:

    是先执行initrd 有了文件系统加载模块 再去交给kernel的 因为你可以看到在配置文件里有了
    /dev的产生 如果没有文件系统的加载 是无法挂载和有这个名称的

关于 initrd 和 initramfs 的区别
技术分享图片

Kernel

关于kernel我了解的较少 ,只是知道他的作用就是加载一些硬件驱动程序,最终释放虚拟文件系统
,并挂载实际的目录文件系统,从而开始后续的正常启动流程。

init

init程序的类型:
    SysV:init CentOS5 之前 
        配置文件:/etc/inittab
    Upstart:init, CentOS6 
        配置文件:/etc/inittab /etc/init/*.conf
    Systemd: systemd CentOS 7
        配置文件:/usr/lib/systemd/system
            /etc/systemd/system

以CentOS 5为例:
技术分享图片

/etc/initab 
每一行的定义方式:
    id:runlevel:action:process
        action : 
            wait :切换至次级别运行一次
            respawn:此进程终止 就重新启动
            initdefault:设定默认运行级别 
            sysinit:设定系统初始化方式 

技术分享图片
技术分享图片
技术分享图片
切换到对应的运行等级时如果为K开头的进程 就关闭掉对应的服务 如果为S开头的 就开启对应的服务

启动流程总结

step1:加载BIOS的硬件信息和自检 根据设置启动所选设备
step2:读取并执行所选设备内MBR里的boot loader
step3:根据boot loader加载kernel kernel 检测硬件预加载驱动程序
step4:kernel调用init init会取得run-level信息
step5:执行/etc/rc.d/rc.sysinit文件来准备软件执行的操作环境
step6:执行run-lebvel的各个服务启动
step7:执行/etc/rc.d/rc.local文件
step8:执行终端机模拟程序来启动login进程 最后等待用户登录

以上是关于Linux 启动流程学习的主要内容,如果未能解决你的问题,请参考以下文章

linux0.11与linux2.6.0两个版本内核启动流程——学习笔记

linux打开终端如何启动scala,如何在终端下运行Scala代码片段?

Linux 启动流程学习

Linux学习笔记之内核启动流程与模块机制

云计算学习days10---Linux启动流程服务管理systemctljournalctl

Python学习之路——Linux基础之系统启动流程