对于linux系统的初学者来说,理解并掌握linux系统启动流程能够使你够深入的理解linux系统,还可以通过系统的启动过程来分析问题解决问题。
启动过程:
POST上电自检–>加载BIOS–>加载主引导记录–>BootLoader启动–>加载内核–>运行开机自启程序–>系统启动

linux开机加电后,系统开始开机自检,该过程主要对计算机各种硬件设备进行检测,如CPU、内存、主板、硬盘、CMOS芯片等。
如果出现致命故障则停机,并且由于初始化过程还没完成,所以不会出现任何提示信号;
如果出现一般故障则会发出声音等提示信号,等待故障清除;若未出现故障,加电自检完成。
当打开计算机电源,计算机会首先加载基本输入输出系统(Basic Input Output System )。BIOS程序一般被存放在主板ROM(只读存储芯片)之中、即使在关机或掉电以后该程序也不会丢失。
BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PNP特性等等。在此之后,计算机就知道应该去读取哪个硬件设备了。
主引导记录(MBR,Master Boot Record)是计算机开机以后访问硬盘时所必须要读取的第一个扇区,位于硬盘的第0柱面第0磁道第一扇区,大小为512字节。
**MBR 中最主要的功能就是存储、启动、加载启动引导程序。**诸如LILO、GRUB这些引导程序(BootLoader)都是直接安装在MBR中。

BootLoader是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。
在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。
GRUB把内核加载到内存后展开并运行, 此时GRUB的任务已经完成,接下来内核将会接管并完成,同时把initrd加载到内存中并运行。
initrd文件其实是一个虚拟的根文件系统,里面有bin、lib、lib64、sys、var、etc、sysroot、 dev、proc、tmp等根目录,它的功能就是将内核与真正的根建立联系,内核通过它加载根文件系统的驱动程序,然后以读写方式挂载根文件系统,至此, 内核加载完成。
内核加载进内存运行并以读写方式挂载完根文件系统后,执行第一个用户进程init,init首先运行/etc/init/rcS.conf脚本,对系统做初始化设置。init进程的一大任务,就是去运行这些开机启动的程序。
Linux预置七种运行级别(0-6),Linux允许为不同的场合,分配不同的开机启动程序。
在该过程中主要执行以下操作:
系统初始化完成后,init给出用户登录提示符(login)或者图形化登录界面,用户输入用户和密码登陆后,系统会为用户分配一个用户uid和组gid,这两个ID是用户的身份标识,用于检测用户运行程序时的身份验证。
登录成功后,整个系统启动流程运行完毕!
Linux的启动其实是一个矛盾的过程,系统要启动就必须先运行程序,而程序的运行又需要系统的启动,所以早期科学家们想到了一个巧妙的办法,即将一段小程序直接装载进内存(只读内存)里,这样计算机一通电程序内存里的程序就可以正常运行了。
本文参考以下文章并根据自己理解所写: