第一步 —— 固件firmware(CMOS/BIOS)
计算机此时会加载BIOS信息,获取CPU的相关信息、设备的启动顺序、硬盘、内存等信息,并且进行POST加电自检。
第二步 —— 读取MBR数据
硬盘上第0磁道第一个扇区被称为MBR,也就是Master Boot Record,即主引导记录,它的大小是512字节,存放了预启动信息、分区表信息。
固件加电自检完成后会进入MBR读取数据。
第三步 —— 自举程序BootLoader(GRUB)
Boot Loader 就是操作系统内核运行之前运行的一小段程序,在固件启动完成之后,所有的后续动作,都是由Boot Loader 完成(无论是linux、windows都是有个Boot Loader)。通过这段小程序,让系统的软硬件环境进入一个合适的状态,为后面调用操作系统内核做准备。
第四步 —— 载入内核 Kernel
在进入GRUB步骤是,GRUB会根据/boot/grub.conf配置文件中所设置的信息,从/boot所在的分区上获得系统内核映像,然后,把内核映像加载到内存中并把控制权交给Linux内核。Linux内核获得控制权后,将会按照以下步骤继续引导系统:
(1)内核映像首先会检测系统中的硬件设备,包括内存、CPU、硬盘等,对这些设备进行初始化并配置。
(2)内核映像是经过压缩的,接下来它要对自身进行解压,同时加载必要的设备驱动。
(3)初始化与文件系统相关的虚拟设备,如LVM或者软件RAID等。
(4)装载根文件系统(/),把根文件系统挂载到根目录下。
(5)完成引导后,Linux内核会在其进程空间内加载init程序,并把控制器交给init进程,由init进程继续完成接下来的系统引导工作。
第五步 —— 启动进程init
init进程是Linux系统所有进程的起点,内核在完成内核引导后,便会加载init进程,其进程号是1。init进程会初始化操作系统,并启动特定的运行级别(Runlevel)下的自动运行程序。用户可以通过更改相关的配置文件或使用图形化配置工具“服务配置”,自定义需要在系统启动时自动运行的服务。
init进程是第一个可以存在的进程,它的PID恒为1,但它必须向一个更高级的功能负责:PID为0的内核调度器(kernel scheduler),从而获得CPU时间。
init进程对应的执行文件为/sbin/init,它是系统中所有进程的控制着,所有的进程都是由它所衍生。如果init进程出现问题,系统中的其他进程也会随之受到影响。
第六步 —— 读取执行配置文件/etc/inittab
如上图所示,在inittab中,所有条目采取以下格式:
id: run-levels : action : process
id :标识符,一般为两位字母或数字
run-levels : 指定运行级别,可以指定多个
action : 指定运行状态
process :指定要运行的脚本命令
action常用取值:
initdefault :指定系统缺省启动的运行级别
sysinit :系统启动执行process中指定的命令
wait :执行process中指定的命令,并等其结束在运行其他命令
once :执行process中指定的命令,不等待其结束
ctrlaltdel :按下Ctrl+Alt+Del 时执行process指定的命令
powerfail :当出现电源错误时执行process指定的命令,不等待其结束
powerokwait :当电源恢复时执行process指定的命令
respawn :一旦process指定的命令中止,便重新运行
第七步 —— 执行rc.sysinit
启动脚本/etc/rc.d/rc.sysinit , 完成系统服务程序启动,如系统环境变量设置,设置系统时钟、加载字体、检查加载文件系统、生成系统启动信息日志文件等等。
流程图