一、BIOS 加电自检
BIOS 的工作:
1检测连接硬件比如显卡内存磁盘等等检测的目的是以后把这些设备信息提供给操作系统
2寻找启动介质每一种BIOS都会有开机启动菜单可以在菜单里设置以哪个设备启动系统
比如:光驱硬盘网络等等这个菜单可以设置多个选项依照设置次序在设备上寻找启动信息
3找到了启动介质接着BIOS就会在介质上找启动扇区找到内核启动系统
1)先试着寻找第一个扇区也就是主引导记录MBR(Master Boot Record)
2)如果第一个扇区上没有没有存在操作系统再去寻找标记为BOOT的分区
    不论是MBR还是BOOT分区存储操作系统的空间都只有446字节;如果没有在上面提到的位置找到操作系统的内核那么BIOS就无法继续启动工作
    而我们的内核往往会大于446个字节存放在磁盘的其他位置上既然446装不下内核又为了能顺利的找到放在其他位置上的内核人们想出了一个办法就在446字节里写了一个小程序BIOS试着启动操作系统时就会执行这个小程序然后再由小程序来载入其他位置的内核这个小程序就是启动载入器(boot loader)
二、Boot Loader
    Linuxboot loader(上文提到的小程序) grub,它存在于 /boot/grub中。
1GRUB有几个重要的文件,STAGE1STAGE15STAGE2
    STAGE1:它只有512字节,通常放在MBR中,它的作用很简单,就是在系统启动时用于装载STAGE2并将控制权交给它。
    STAGE2GRUB的核心,所有的功能都是由它实现。
    STAGE15:介于STAGE1STAGE2之间,是它们的桥梁,因为STAGE2较大,通常都是放在一个文件系统当中的,但是STAGE1并不能识别文件系统格式,所以才需要STAGE15来引导位于某个文件系统当中的STAGE2。根据文件系统格式的不同,STAGE15也需要相应的文件,如:e2fs_stage1_5fat_stage1_5,分别用于识别extfat的文件系统格式。它存放于1-63的柱面之间
    引导顺序如下:STAGE1->;STAGE15->;STAGE2
2主要的配置文件时 grubconf

/boot未独立分区:/boot/grub/grubconf

/boot独立分区:/boot/grubconf

三、内核启动
    内核启动后会向bios查询电脑的所有硬件信息然后自己接手下来管理这些设备以便提供给linux使用。
    内核会试着驱动这些设备这些设备的驱动一部分包含在内核中叫做静态驱动一部分以模块的方式(动态)存放文件系统中

    由于此时还未挂载任何文件系统因此还不能使用文件系统中的模块这里只能驱动在内核中存在的硬件驱动程序的对应设备想驱动内核中未包含的硬件驱动就需要加载文件系统
    内核会尝试挂载根文件系统根文件系统至少包含 /etc /bin /sbin /lib /dev 5大目录他们5个缺一不可都会导致系统无法启动
    根文件系统挂载是以只读方式挂载的因为这时linux还在启动阶段并不稳定避免破坏系统资料
四、启动INIT服务
    顺利的挂载了根文件系统后就会启动init服务内核会按 /sbin/init /etc/init /bin/init 顺序寻找init程序如果找不到则内核报错这里存在一个参数 init=/bin/sh 如果启动时指定了则最后执行/bin/sh而不会产生内核报错也被称为快速启动因为它忽略了很多启动初始化工作
    启动init的目的就是为了初始化系统环境启动了init就证明了内核已经顺利启动接下来就由init服务来建立linux使用环境
1.读取 /etc/inittab 文件根据这个文件的信息来进行初始化工作
2.执行三个脚本 /etc/rc.d/rc.sysinit /etc/rc.d/rc /etc/rc.d/rc.local
1rc.sysinit 主要的功能用来建立系统的基本环境
    启动udev selinux子系统udev在系统启动时检测并加载/dev中的设备文件selinux负责增强系统的安全性
    设定核心参数 sysctl -p 加载 /etc/sysctl.conf
    设定系统时间将硬件时间设定为系统时间
    加载键盘和交换分区 swapon -a -e
    设置主机名挂载文件系统将根重新挂载为可读写的
    加载动态驱动模块
    USB设备与RAID & LVM
    卸载 /initrd/ 目录

(2)rc 脚本设置启动级别linux中有许多不同的启动级别不同的启动级别会制定不同的服务根据指定rc的参数会对应执行 /etc/rc.d/rc[0-6].d/ 中的连接脚本文件 以S开头的则启动
3rc.local 前两个脚本都是系统至关重要的脚本如果我们想在启动过程中放置一些其他程序应该使用rc.local脚本中 因为S99local存在于rc[2-5].d
    三个RC脚本执行完毕后就会建立虚拟主控制台 执行 /bin/login 就提供了用户登陆界面了
    如果是图形 L5级别的话会启动X window登录界面所有的启动就都已经完毕用户环境初始化输入用户名和密码系统验证然后会执行
/etc/profile 

~/.bash_profile
~/.bashrc

~/.profile

***linux系统启动流程图***

linux系统启动流程_系统启动