Linux系统启动流程总结

引言

Linux系统的启动过程由很多阶段组成,但无论x86桌面系统还是嵌入式系统,开机的设计思想和流程都是大同小异,万变不离其宗,理解开机启动流程对于linux系统深层次的学习是很有必要的。

Linux系统启动流程大概分为以下几步:

POST==>BIOS==>BootLoader(MBR)==>Kernel(硬件探测、加载驱动、挂载根文件系统、/sbin/init)==>init(/etc/inittab:设定默认级别、系统初始化脚本、启动及关闭对应级别的服务、启动终端)

Linux系统启动纵深图:

Linux系统启动流程总结

 

Linux系统启动导图:

Linux系统启动流程总结



详细分析上面的流程

第1步:加载BIOS,读取MBR

Linux系统启动流程总结

1.开电之后,CPU就到出厂时指定的内存地址空间(是由内存和CMOS组成)去加载BIOS程序(存储在CMOS里面),BIOS是由一系列的汇编指令组成,用于进行硬件检测(把检测到的结果存储到内存的低地址空间里,是由于BIOS 的寻址能力有限),BIOS首先会探测有几块内存以及其他设备是不是都基本正常,有任何问题就会报警,就无法往下启动,接着去扫描ISA总线和PCI总线去查找各关联到的设备,并且能指挥各硬件完成中断注册和IO端口注册。BIOS主要由两部分组成:上电自检代码和运行服务。在上电自检完成后,上电自检代码从内存被清除,但是运行服务被保留并且对目标操作系统仍然有效。

POST 打开电源按钮,CPU会把位于CMOS中的BIOS程序加载到内存里面执行,硬件自检后,BIOS 会将控制权交给下一段启动程序。这时,BIOS需要知道,下一阶段的启动程序具体存放在哪一个设备。也就是说,BIOS需要有一个外部存储设备的排序,排在前面的设备就是优先转交控制权的设备。这种排序叫做”启动顺序”(Boot Sequence)。因此BIOS会探测并识别主板上的所有硬件,然后按照BIOS程序里面设定的启动顺序(1.光驱 2.硬盘 3.FLASH/ROM ),它会挨个去这些设备里面找启动设备,一旦找到就停止寻找,如:第一个先从光驱找到,但是没有找到光盘,那么找第二个硬盘,找到硬盘也不一定能启动,要看硬盘是否包含MBR,如果有MBR那就从硬盘启动,如果没有就继续向下寻找,如果一直没有找到可启动的设备,那么本次启动宣告失败.

第2步:加载Bootloader

2.在上一步中,BIOS找到硬盘的MBR(位于硬盘的0磁道0扇区 大小为512字节,该区域不能被分配给任何分区),然后在MBR中寻找BootLoader(目前比较常用有LILO GRUBLILO已经不常用,BootLoaderMBR所占446字节,所以必须短小精悍,还有64字节是分区表信息,每个分区表16字节,剩下2字节定义了一个magic数字(0xaa55)。这个magic数字用来校验检查MBR是否有效),然后把BootLoader加载到内存中开始执行,BootLoader主要功能就是从硬盘找到内核文件,把内核文件加载到内存执行。

Linux系统启动流程总结

通过Bootloader这段小程序,我们就可以初始化硬件设备、建立内存空间的映射图,为加载操作系统的内核做好准备。


第3步:加载内核Kernel

3.Bootloader会帮助我们加载内核,内核就会开始检测硬件与加载驱动程序。没错,内核会以自己的功能重新检测一遍硬件,而不一定会使用 BIOS 检测到的硬件信息。也就是说,内核此时才开始接管 BIOS 后的工作。Kernel 实际上是一个用来操作计算机的程序,它是计算机操作系统的内核,主要的任务是管理计算机的硬件资源,充当软件和硬件的接口。操作系统上的任何操作都要通过 kernel 传达给硬件。

内核在这一步骤里面做的事情:

①探测硬件
②加载驱动
③挂载根文件系统
④执行第一个程序/sbin/init

·   BIOS检查硬件,而内核是会初始化硬件设备,那么首先会探测硬件(第1步),知道是什么硬件了就该加载硬件驱动程序(第2步),不然是没办法指挥着硬件工作的,关键是内核去哪里找驱动程序(驱动程序是硬盘上,是内核模块.ko存在的)而此时根文件系统还没有挂载上,怎么办? 那可以②③对调,先挂载根文件系统,然后再加载驱动,那此时又有问题了,我不加载驱动程序又如何驱动着硬盘工作呢?这个陷入了是先有蛋还是有先鸡的问题了,这该如何解决?

·  ②这时候 这个文件/boot/initrd-2.6.18-308.el5.img(该文件是一个.gz的压缩文件) 就派上用场了,这个文件也是被GRUB加载内存当中,构建成一个虚拟的根文件系统,这个文件里面包含有硬件驱动程序。

·  ③至此内核利用虚拟的根文件系统的ext3.ko内核模块,驱动了硬盘,然后挂载了真正的根文件系统,那么此时虚拟的根文件系统是否还有作用,它还可以挂载/proc文件系统等操作。


·  ④此阶段中最后一个步骤 由内核来启动第一个程序/sbin/init,启动好之后剩下的工作就有init进程来完成了。


第4步:启动初始化进程init

4.在内核加载完毕以后,此时内核会主动调用第一个进程,那就是 /sbin/init,它的作用就是初始化系统环境。使用pstree命令会发现init的进程编号(PID)是1,也就是说init是第一个运行的程序,其他所有进程都从它衍生,都是它的子进程,init 程序首先是需要读取配置文件 /etc/inittab

Linux系统启动流程总结

运行级别

许多程序需要开机启动。它们在Windows叫做"服务"service),在Linux就叫做"守护进程"daemon)。

init进程的一大任务,就是去运行这些开机启动的程序。

但是,不同的场合需要启动不同的程序,比如用作服务器时,需要启动Apache,用作桌面就不需要。

Linux允许为不同的场合,分配不同的开机启动程序,这就叫做"运行级别"runlevel)。也就是说,启动时根据"运行级别",确定要运行哪些程序。

Linux系统有7个运行级别(runlevel)

运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动

运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆

运行级别2:多用户状态(没有NFS)

运行级别3:完全的多用户状态(NFS),登陆后进入控制台命令行模式

运行级别4:系统未使用,保留

运行级别5X11控制台,登陆后进入图形GUI模式

运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动



系统初始化

init的配置文件中有这么一行: si::sysinit:/etc/rc.d/rc.sysinit 它调用执行了/etc/rc.d/rc.sysinit,而rc.sysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。

它主要完成的工作有:激活交换分区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务。

l5:5:wait:/etc/rc.d/rc 5

这一行表示以5为参数运行/etc/rc.d/rc/etc/rc.d/rc是一个Shell脚本,它接受5作为参数,去执行/etc/rc.d/rc5.d/目录下的所有的rc启动脚本,/etc/rc.d/rc5.d/目录中的这些启动脚本实际上都是一些连接文件,而不是真正的rc启动脚本,真正的rc启动脚本实际上都是放在/etc/rc.d/init.d/目录下。

而这些rc启动脚本有着类似的用法,它们一般能接受startstoprestartstatus等参数。

/etc/rc.d/rc5.d/中的rc启动脚本通常是KS开头的连接文件,对于以以S开头的启动脚本,将以start参数来运行。

而如果发现存在相应的脚本也存在K打头的连接,而且已经处于运行态了(/var/lock/subsys/下的文件作为标志),则将首先以stop为参数停止这些已经启动了的守护进程,然后再重新运行。

这样做是为了保证是当init改变运行级别时,所有相关的守护进程都将重启。

至于在每个运行级中将运行哪些守护进程,用户可以通过chkconfigsetup中的"System Services"来自行设定。

建立终端

rc执行完毕后,返回init。这时基本系统环境已经设置好了,各种守护进程也已经启动了。

init接下来会打开6个终端,以便用户登录系统。在inittab中的以下6行就是定义了6个终端:

1:2345:respawn:/sbin/mingetty tty1

2:2345:respawn:/sbin/mingetty tty2

3:2345:respawn:/sbin/mingetty tty3

4:2345:respawn:/sbin/mingetty tty4

5:2345:respawn:/sbin/mingetty tty5

6:2345:respawn:/sbin/mingetty tty6

从上面可以看出在2345的运行级别中都将以respawn方式运行mingetty程序,mingetty程序能打开终端、设置模式。

同时它会显示一个文本登录界面,这个界面就是我们经常看到的登录界面,在这个登录界面中会提示用户输入用户名,而用户输入的用户将作为参数传给login程序来验证用户的身份。

 

第5步:用户登录系统

一般来说,用户的登录方式有三种:

·       1)命令行登录

·       2ssh登录

·       3)图形界面登录

Linux系统启动流程总结

对于运行级别为5的图形方式用户来说,他们的登录是通过一个图形化的登录界面。登录成功后可以直接进入KDEGnome等窗口管理器。

而本文主要讲的还是文本方式登录的情况:当我们看到mingetty的登录界面时,我们就可以输入用户名和密码来登录系统了。

Linux的账号验证程序是loginlogin会接收mingetty传来的用户名作为用户名参数。

然后login会对用户名进行分析:如果用户名不是root,且存在/etc/nologin文件,login将输出nologin文件的内容,然后退出。

这通常用来系统维护时防止非root用户登录。只有/etc/securetty中登记了的终端才允许root用户登录,如果不存在这个文件,则root可以在任何终端上登录。

/etc/usertty文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。

总结

结合一开始给出的流程图,Linux 的启动流程可以概括为以下几个主要步骤:

  1. 加载 BIOS 的硬件信息与硬件自检,并依据设置取得第一个可启动的设备;

  2. 读取并执行第一个启动设备内的MBR boot loader

  3. 依据 boot loader 的设置加载内核,内核会开始检测硬件与加载驱动程序;

  4. 在内核 Kernel 加载完毕后,Kernel 会主动调用 init 进程,而 init 会取得 run-level 信息;

  5. init 执行 rc.sysinit 初始化系统的操作环境(网络、时区等);

  6. init 启动 run-level 的各个服务;

  7. 用户登录

至此,Linux系统的启动流程大功告成。

 

参考:http://mp.weixin.qq.com/s?__biz=MzA3OTgyMDcwNg==&mid=400442155&idx=1&sn=4f1210007479aa6f023e013fcd644fb3&scene=0#rd

http://wuchong.me/blog/2014/07/14/linux-boot-process/

http://huaqianlee.me/2015/08/21/Linux/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Linux%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8B/

http://www.runoob.com/linux/linux-system-boot.html


anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/270.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注