参考:
http://www.ruanyifeng.com/blog/2013/08/linux_boot_process.html
http://blog.51cto.com/mrxiong2017/2084767
http://www.cnblogs.com/changxr/p/8023341.html
一、概述
第一步:开机自检,加载BIOS
第二步:读取MBR
第三步:Boot Loader grub引导菜单
第四步:加载kernel内核
第五步:运行init进程
第六步:init进程执行rc.sysinit
第七步:init进程执行不同运行级别的脚本程序
第八步:init进程执行执行/etc/rc.d/rc.local
第九步:执行/bin/login程序,启动mingetty,进入登录状态
图解:
二、详解
第一步:开机自检,加载BIOS
BIOS(Basic Input/Output System),基本输入输出系统,该系统存储于主板的ROM芯片上,计算机在开机时,会最先读取该系统,然后会有一个加电自检过程,这个过程其实就是检查CPU和内存,计算机最基本的组成单元(控制器、运算器和存储器),还会检查其他硬件,若没有异常就开始加载BIOS程序到内存当中。BIOS主要的一个功能就是存储了磁盘的启动顺序,BIOS会按照启动顺序去查找第一个磁盘头的MBR信息,并加载和执行MBR中的Bootloader程序,若第一个磁盘不存在MBR,则会继续查找第二个磁盘(PS:启动顺序可以在BIOS的界面中进行设置),一旦BootLoader程序被检测并加载内存中,BIOS就将控制权交接给了BootLoader程序。
第二步:读取MBR
BIOS自检,首先会在一个Boot Sequence程序中搜索可以让系统启动的引导设备(比如我们有时在BIOS中设置为从硬盘启动,或者从CD-ROM启动等等)
这时如果BIOS找不到可以引导的设备及相关程序后,便会启动失败,如果顺序的找到了相关设备硬盘,那么BIOS将把控制权交给启动设备中的MBR(Master Boot Record)主引导记录
MBR(Master Boot Record),主引导记录,MBR存储于磁盘的头部,大小为512bytes,其中,446bytes用于存储BootLoader程序,64bytes用于存储分区表信息,最后2bytes用于MBR的有效性检查。
第三步:Boot Loader grub引导菜单
GRUB(Grand Unified Bootloader),多系统启动程序,其执行过程可分为三个步骤:
Stage1:这个其实就是MBR,它的主要工作就是查找并加载第二段Bootloader程序(stage2),但系统在没启动时,MBR根本找不到文件系统,也就找不到stage2所存放的位置,因此,就有了stage1_5
Stage1_5:该步骤就是为了识别文件系统
Stage2:GRUB程序会根据/boot/grub/grub.conf文件查找Kernel的信息,然后开始加载Kernel程序,当Kernel程序被检测并在加载到内存中,GRUB就将控制权交接给了Kernel程序。
实际上这个步骤/boot还没被挂载,GRUB直接识别grub所在磁盘的文件系统,所以实际上应该是/grub/grub.conf文件,该配置文件的信息如下:
grub.conf:
#boot=/dev/sda
default=0 #设定默认启动的title的编号,从0开始
timeout=5 #等待用户选择的超时时间
splashimage=(hd0,0)/boot/grub/splash.xpm.gz #GRUB的背景图片
hiddenmenu #隐藏菜单
title CentOS (2.6.18-194.el5PAE) #内核标题
root (hd0,0) #内核文件所在的设备
kernel /vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/ #内核文件路径以及传递给内核的参数
initrd /initrd-2.6.18-194.el5PAE.img #ramdisk文件路径
第四步:加载kernel内核
操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。
[root@HikvisionOS boot]# ll /boot
总用量 151696
-rw-r--r--. 1 root root 137701 9月 8 2017 config-3.10.0-514.26.2.el7.x86_64
-rw-r--r-- 1 root root 147859 9月 26 23:15 config-3.10.0-862.14.4.el7.x86_64
drwx------ 3 root root 16384 1月 1 1970 efi
drwxr-xr-x. 2 root root 26 2月 7 2018 grub
drwx------. 5 root root 4096 10月 16 11:33 grub2
-rw-r--r--. 1 root root 45305074 2月 7 2018 initramfs-0-rescue-2216fbd88166481a85c5fe5e50457dcc.img
-rw-------. 1 root root 17239102 2月 7 2018 initramfs-3.10.0-327.el7.x86_64.img
-rw------- 1 root root 20460923 10月 16 11:33 initramfs-3.10.0-514.26.2.el7.x86_64.img
-rw------- 1 root root 13184139 10月 16 11:31 initramfs-3.10.0-514.26.2.el7.x86_64kdump.img
-rw------- 1 root root 20762979 10月 16 11:33 initramfs-3.10.0-862.14.4.el7.x86_64.img
-rw------- 1 root root 13135074 10月 18 10:00 initramfs-3.10.0-862.14.4.el7.x86_64kdump.img
-rw-r--r--. 1 root root 607007 2月 7 2018 initrd-plymouth.img
-rw-r--r--. 1 root root 277955 9月 8 2017 symvers-3.10.0-514.26.2.el7.x86_64.gz
-rw-r--r-- 1 root root 305158 9月 26 23:17 symvers-3.10.0-862.14.4.el7.x86_64.gz
-rw-------. 1 root root 3114352 9月 8 2017 System.map-3.10.0-514.26.2.el7.x86_64
-rw------- 1 root root 3414754 9月 26 23:15 System.map-3.10.0-862.14.4.el7.x86_64
-rwxr-xr-x. 1 root root 5395584 2月 7 2018 vmlinuz-0-rescue-2216fbd88166481a85c5fe5e50457dcc
-rwxr-xr-x. 1 root root 5395584 9月 8 2017 vmlinuz-3.10.0-514.26.2.el7.x86_64
-rwxr-xr-x 1 root root 6398144 9月 26 23:15 vmlinuz-3.10.0-862.14.4.el7.x86_64
第五步:运行init进程
init 进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动。init 程序首先是需要读取配置文件/etc/inittab(定义了系统默认运行级别),根据/etc/inittab设定的动作进行脚本的执行,第一个被执行的脚本为/etc/rc.d/rc.sysinit,执行完后,根据配置的启动级别,执行对应目录底下的脚本,最后执行/etc/rc.d/rc.local这个脚本,至此,系统启动完成。
第六步:init进程执行rc.sysinit
这个是真正的OS初始化脚本,简单讲下这个脚本的任务(可以去看看实际脚本,看看都做了什么):
1、激活udev和selinux;2、根据/etc/sysctl.conf文件,来设定内核参数;3、设定系统时钟;4、装载硬盘映射;5、启用交换分区;6、设置主机名;7、根文件系统检测,并以读写方式重新挂载根文件系统;8、激活RAID和LVM设备;9、启用磁盘配额;10、根据/etc/fstab,检查并挂载其他文件系统;11、清理过期的锁和PID文件
第七步:init进程执行不同运行级别的脚本程序
其实/etc/inittab文件最主要的作用就是设定Linux的运行等级,其设定形式是“:id:5:initdefault:”,这就表明Linux需要运行在等级5上。Linux的运行等级设定如下:
0:-halt 关机 1:-single user mode 单用户模式 2:-Multi-user,without NFS无网络支持的多用户模式 类似于下面的run level3 3:-Full multi-user mode 有网络支持的多用户模式 4:-unused 保留,未使用 5:-X11 有网络支持有X-Window支持的多用户模式 6:- reboot 重新引导系统,即重启 |
在不同的运行级别下,/etc/rc.d/rc这个脚本会分别执行不同目录下的脚本
Run level 0 – /etc/rc.d/rc0.d/ Run level 1 – /etc/rc.d/rc1.d/ Run level 2 – /etc/rc.d/rc2.d/ Run level 3 – /etc/rc.d/rc3.d/ Run level 4 – /etc/rc.d/rc4.d/ Run level 5 – /etc/rc.d/rc5.d/ Run level 6 – /etc/rc.d/rc6.d/ |
第八步:init进程执行/etc/rc.d/rc.local
你如果打开了此文件,里面有一句话,读过之后,你就会对此命令的作用一目了然:
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don’t
# want to do the full Sys V style init stuff.
rc.local就是在一切初始化工作后,Linux留给用户进行个性化的地方。你可以把你想设置和启动的东西放到这里。
第九步:执行/bin/login程序,启动mingetty,进入登录状态