CentOS系统启动流程图
(1) 加载 BIOS
计算机电源加电质检,首先加载基本输入输出系统(Basic Input Output System,BIOS),BIOS 中包含硬件 CPU、内存、硬盘等相关信息,包含设备启动顺序信息、硬盘信息、内存信息、时钟信息、即插即用(Plug-and-Play,PNP)特性等。加载完 BIOS信息,计算机将根据顺序进行启动。
(2) 读取 MBR
读取完 BIOS 信息,计算机将会查找 BIOS 所指定的硬盘 MBR 引导扇区,将其内容复制到 0x7c00 地址所在的物理内存中。被复制到物理内存的内容是 Boot Loader,然后进行引导。
(3) GRUB 引导
GRUB 启动引导器是计算机启动过程中运行的第一个软件程序,当计算机读取内存中的 GRUB 配置信息后,会根据其配置信息来启动硬盘中不同的操作系统。
(4) 加载 Kernel
计算机读取内存映像,并进行解压缩操作,屏幕一般会输出“Uncompressing Linux”的提示,当解压缩内核完成后,屏幕输出“OK, booting the kernel”。系统将解压后的内核放置在内存之中,并调用 start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成 Linux 核心环境的建立。
(5) 读取 Inittab 运行等级
内核加载完毕,会启动 Linux 操作系统第一个守护进程 init,然后通过该进程读/etc/inittab 文件,/etc/inittab 文件的作用是设定 Linux 的运行等级。
init是Linux系统操作中不可缺少的程序之一。所谓的init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。
内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init。如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败。
init一共分为7个级别,这7个级别的所代表的含义如下
-
- 0:停机或者关机(千万不能将initdefault设置为0)
- 1:单用户模式,只root用户进行维护
- 2:多用户模式,不能使用NFS(Net File System)
- 3:完全多用户模式(标准的运行级别)
- 4:系统未使用,保留一般不用
- 5:图形化(即图形界面)
- 6:重启(千万不要把initdefault设置为6)
To view current default target, run:systemctl get-default
To set a default target, run:systemctl set-default TARGET.target
runlevel:查看启动级别
(6) 加载 rc.sysinit
读取完运行级别,Linux 系统执行的第一个用户层文件/etc/rc.d/rc.sysinit,该文件功能包括:设定 PATH 运行变量、设定网络配置、启动 swap 分区、设定/proc、系统函数、配置Selinux 等。
(7) 加载内核模块
读取/etc/modules.conf 文件及/etc/modules.d 目录下的文件来加载系统内核模块。该模块文件,可以后期添加或者修改及删除。
(8) 启动运行级别程序
根据之前读取的运行级别,操作系统会运行 rc0.d 到 rc6.d 中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。其中以 S 开头表示系统即将启动的程序,如果以 K 开头,则代表停止该服务。S 和 K 后紧跟的数字为启动顺序编号。如图所示:
运行级别服务
(9) 读取 rc.local 文件
操作系统启动完相应服务之后,会读取执行/etc/rc.d/rc.local 文件,可以将需要开机启动的任务加入到该文件末尾,系统会逐行去执行并启动相应命令,如图所示:
开机运行服务
(10) 执行/bin/login 程序
执行/bin/login 程序,启动到系统登录界面,操作系统等待用户输入用户名和密码,即可登录到 Shell 终端,至此Linux操作系统完整流程启动完毕。