5. Linux启动流程
概括描述linux系统从开机到登陆界面的启动过程
1.开机BIOS自检
2.MBR引导
3.grub引导菜单
4.加载内核
5.启动init进程
6.读取inittab文件执行rc.sysinit、rc等脚本
7.启动mingetty进入系统登录界面
下面将对这些内容详细介绍。
5.1 POST开机自检
电脑主机打开电源的时候,随后会听到滴的一声响,系统启动,开始了开机自检POST-power on self。
Test自检开始这个过程中,主要是检测计算机硬件设备,比如CPU内存、主板、显卡等设备是否有故障存在。如果有硬件故障的话,对于严重故障(致命性故障)则停机。
5.2 加载BIOS并读取设置
计算机加电自检完成后,第一个读取的地方就是就是BIOS(Basic Input Output System,基础输入输出系统)。BIOS里面记录了主机板的芯片集与相关设置,如CPU与接口设备的通信频率、启动设备的搜索顺序、硬盘的大小与类型、系统时间、外部总线、各种接口设备的I/O地址、已经与CPU通信的IRQ中断信息,所以启动如果要顺利启动首先要读取BIOS设置。
5.3 读取MRB
按BIOS设定的系统启动流程,检测通过则根据引导次序(Boot Sequence)开始在第一台设备上支持启动程序。我们的启动设备主要包括硬盘、usb、sd等。我们一般用的是硬盘,然后进行读取第一个设备就是硬盘;第一个要读去的就是该硬盘的主引导记录MBR(Master Boot Record),然后系统可以根据启动区安装的引导加载程序Boot Loader开始执行核心识别的工作。
硬盘上第0柱面0磁道1扇区被称为MBR,也就是Master Boot Record,即主引导记录它的大小是512字节里面存放了预启动信息、分区表信息及分区标志等。分为两部分第一部分为(PRE-BOOT)引导区,占了446个字节第二部分为分区表(PARTITION PABLE),共66个字节记录硬盘的分区信息(其中前64字节是分区表信息后2个字节是分区结束的标志)。
预引导区的作用之一是找到标记为活动(ACTIVE)的分区,并将活动分区的引导区读入内存。
系统找到BIOS所指定的硬盘的MBR后,就会将其复制到0x7c00地址所在的物理内存中。其实被复制到物理内存的内容就是Boot Loader,而具体到Linux系统那就是grub了。
5.4 Boot Loader加载Grub程序。
Boot Loader就是在操作系统内核运行之前运行的一小段程序。通过这小段程序我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备。
5.5 内核初始化
根据Grub内的定义grub读取完毕后,就把下面的工作交给内核了。kernel主要是完成系统硬件探测及硬件驱动的初始化,并且以读写的方式挂载根文件系统。
kernel初始化所要工作的内容做下简单总结:探测硬件->加载驱动initrd)->挂载根文件系统->rootfs(/sbin/init)
5.6 init进程依据inittab文件来设定运行级别
内核被加载后,内核空间的任务开始向用户空间转移。内核空间通过一个间接的initrd(微型linux)向用户空间的/sbin/init过渡,所以gurb开始引导内核转向initrd。
initrd会读取/etc/inittab文件并依据此文件来进行初始化工作。
5.7 init进程执行rc.sysinit
在设定了运行等级后linux系统执行的第一个用户层文件就是/etc/rc.d/rc.sysinit脚本程序。它做的工作非常多,包括设定PATH、设定网络配置(/etc/sysconfig/network)、启动swap分区、设定/proc等等。线程init的最终完成状态是能够使得一般的用户程序可以正常地被执行,从而真正完成可供应用程序运行的系统环境。
5.8 启动内核模块
具体是依据/etc/modules.conf或/etc/modules.d目录下的文件来装载内核模块。
5.9 执行不同运行级别的脚本程序
根据运行级别的不同系统会运行rc0.d到rc6.d中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。
5.10 执行/bin/login程序启动mingetty,进入登录状态
系统已经进入到了等待用户输入username和password的时候了,可以用自己的账号登入系统了。到此为止linux系统启动全部完成。
下图是对上面所有步骤的总结:
本文由『后端精进之路』原创,首发于博客 http://teckee.github.io/ , 转载请注明出处
搜索『后端精进之路』关注公众号,立刻获取最新文章和价值2000元的BATJ精品面试课程。