第一步 硬件启动阶段
这一阶段流程:打开电源;POST自检;BIOS逐一排查设备启动顺序;如果是硬盘启动,读取硬盘的MBR的BootLoader。(这里默认MBR分区,暂不考虑GPT分区)
这里主要有三个需要了解的地方:BIOS启动顺序、MBR和BootLoader。
(1)BIOS启动顺序,一般含有光驱、U盘、硬盘A、硬盘B。按次序查找各引导设备,第一个有引导程序的设备即为本次启动用到设备。
(2)MBR(Main Boot Record),是硬盘的0柱面,0磁道、1扇区(第一个扇区),称为主引导扇区,也称为主引导记录。它由三部分组成(BootLoader)、硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA)。
注:硬盘默认一个扇区大小为512字节。
第一部分:主引导程序(BootLoader)占446个字节,负责从活动分区中装载,并运行系统引导程序。
第二部分:硬盘分区DPT占64个字节,有4个分区表项,每个分区表项占16个字节,硬盘中分区有多少以及每一个分区的大小都记录在其中。
第三部分:硬盘有效标志,占2个字节,固定位55AA。如果这个标志位0xAA55,就认为这个是MBR。
(3)BootLoader
不同的系统有不同的主引导程序(BootLoader)。Windows使用的是NTLDR(NT Loader,Windows NT系列操作系统)、Bootmgr(Boot Manager,Windows Vista,7,8,10),Linux一般使用的是grub(也叫grub legacy)和grub2。
第二步 GRUB2引导阶段
从这一步开始,CentOS6和CentOS7的启动流程区别开始展现出来。CentOS7的主引导程序使用的是grub2。
这一步流程:显示加载两个镜像,再加载MOD模块文件,把grub2程序加载执行,接着解析配置文件/boot/grub2/grub.cfg,根据配置文件加载内核镜像到内存,之后构建虚拟根文件系统,最后转到内核。
在这里grub.cfg配置文件已经比较复杂了,但并不用担心,到了CentOS7种一般是使用命令进行配置,而不直接去修改配置文件。不过我们可以看到grub.cfg配置开头:
# It is automatically generated by grub2-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
说明了由/etc/grub.d目录下文件和/etc/default/grub文件组成。
一般修改好配置后,都需要使用命令 grub2-mkconfig -o /boot/grub2/grub.cfg,将配置文件重新生成。
第三步 内核引导阶段
这一步流程:通过内存中的虚拟根文件系统,加载驱动,然后切换到真正的根文件系统,并执行/sbin/init程序。
第四步 systemd初始化阶段(又叫系统初始化阶段)
CentOS7中,初始化进程变为了systemd。执行默认target配置文件/etc/systemd/system/default.target(这是一个软链接,与默认运行级别有关)。然后执行sysinit.target(/usr/lib/systemd/system/sysinit.target)初始化系统和basic.target(/usr/lib/systemd/system/basic.target)来准备操作系统。接着启动multi-user.target(/usr/lib/systemd/system/multi-user.target)下的本机与服务器服务,并检查/etc/rc.d/rc.local文件是否有用户自定义脚本需要启动。最后执行multi-user下的getty.target及登录服务,检查default.target是否有其他的服务需要启动。
注意:/etc/systemd/system/default.target指向了/lib/systemd/system/目录下的graphical.target或multi-user.target。而graphical.target依赖multi-user.target,multi-user.target依赖basic.target,basic.target依赖sysinit.target,所以倒过来执行。
System概述:systemd即为system daemon,是Linux下的一种init软件,开发目标是提供更优秀的框架以表示系统服务间的依赖关系,并依此实现系统初始化时服务的并行启动,同时达到降低Shell系统开销的效果,最终代替现在常用的System V与BSD风格的init程序。
与多数发行版使用的System V风格的init相比,systemd采用了一下新技术:① 采用Socket激活式与总线激活式服务,以提高相互依赖的各服务的并行运行性能;② 用Cgroup代替PID来追踪进程,即使是两次fork之后生成的守护进程也不会脱离systemd的控制。
unit对象:unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件主要包含了系统服务、监听socket、保存的系统快照以及其他init相关的信息。(也就是CentOS6中的服务器启动脚本)
- /etc/systemd/system/default.target
这是一个软链接,和默认运行级别有关
[root@k8s-master ~]# ll /etc/systemd/system/default.target
lrwxrwxrwx. 1 root root 37 Mar 7 2019 /etc/systemd/system/default.target -> /lib/systemd/system/multi-user.target
我们可以到这个目录下看看
[root@k8s-master system]# cd /lib/systemd/system/
[root@k8s-master system]# ls *.target
basic.target default.target hibernate.target kexec.target network.target reboot.target runlevel0.target shutdown.target suspend.target
bluetooth.target emergency.target hybrid-sleep.target local-fs-pre.target nfs-client.target remote-cryptsetup.target runlevel1.target sigpwr.target swap.target
cloud-config.target final.target initrd-fs.target local-fs.target nss-lookup.target remote-fs-pre.target runlevel2.target sleep.target sysinit.target
cloud-init.target getty-pre.target initrd-root-fs.target machines.target nss-user-lookup.target remote-fs.target runlevel3.target slices.target system-update.target
cryptsetup-pre.target getty.target initrd-switch-root.target multi-user.target paths.target rescue.target runlevel4.target smartcard.target timers.target
cryptsetup.target graphical.target initrd.target network-online.target poweroff.target rpcbind.target runlevel5.target sockets.target time-sync.target
ctrl-alt-del.target halt.target iprutils.target network-pre.target printer.target rpc_pipefs.target runlevel6.target sound.target umount.target
可以看得到runlevel开头的target文件,对应着CentOS6的启动级别,不过一样是软链接,指向了同目录下的其他文件。
[root@k8s-master system]# ll runlevel*.target
lrwxrwxrwx 1 root root 15 Mar 25 17:04 runlevel0.target -> poweroff.target
lrwxrwxrwx 1 root root 13 Mar 25 17:04 runlevel1.target -> rescue.target
lrwxrwxrwx 1 root root 17 Mar 25 17:04 runlevel2.target -> multi-user.target
lrwxrwxrwx 1 root root 17 Mar 25 17:04 runlevel3.target -> multi-user.target
lrwxrwxrwx 1 root root 17 Mar 25 17:04 runlevel4.target -> multi-user.target
lrwxrwxrwx 1 root root 16 Mar 25 17:04 runlevel5.target -> graphical.target
lrwxrwxrwx 1 root root 13 Mar 25 17:04 runlevel6.target -> reboot.target
- /usr/lib/systemd/system/
这个目录存储每个服务的脚本,类似CentOS6的/etc/init.d/。
- /run/systemd/system/
系统执行过程中产生的脚本。
总结:
- UEFI或BIOS初始化,运行POST开机自检
- 选择启动设备,Boot Sequence系统启动次序一般含有:光盘、U盘、硬盘A、硬盘B。按次数查找各引导设备,第一个有引导程序的设备即为本次启动用到设备。
- 引导装载程序,加载/boot分区文件系统驱动
- 加载装载程序的配置文件:/etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg
- 加载initramfs驱动模块和内核vmlinuz,initramfs是基于内存的文件系统
- 内核初始化,centos7使用systemd代替init
- 执行initrd.target所有单元,包括挂载/etc/fstab
- 从initrd.target跟文件系统切换到磁盘根目录
- systemd执行默认target配置,配置文件/etc/systemd/system/default.target
- systemd执行sysinit.target初始化系统以及basic.target准备操作系统
- systemd启动multi-user.target下的本机与服务器服务
- systemd执行multi-user.target下的/etc/rc.d/rc.local
- systemd执行multi-user.target下的getty.target及登录服务
- systemd执行graphical需要的服务
更简洁的表述:① 加电自检;② BIOS启动引导阶段;③ grub2菜单;④ kernel加载系统内核信息;⑤ 运行systemd进程;⑥ 运行mingetty进程。
补充:CentOS7运行级别,共7个级别
init level | 级别 | 目标单元 |
0 | 系统关机级别,系统默认的运行级别不能设置为0,否则不能正常启动。init 0 进行关机。 | poweroff.target |
1 | 单用户模式级别。root 权限,用于系统维护(或修复系统,或重置系统密码信息),禁止远程登录。该运行级别是没有网络的。 | rescue.target |
2 | 多用户模式级别。该级别下没有NFS和网络的支持。 | multi-user.target |
3 | 完整的多用户文本模式级别。登录后进入到控制台命令行模式。 | multi-user.target |
4 | 预留级别。该级别系统未使用。 | multi-user.target |
5 | 图形化模式级别。登录后进入图形GUI模式。 | graphical.target |
6 | 系统重启级别。默认运行级别不能设置为6,否则系统不能正常启动。init 6 系统会重启。 | reboot.target |
参考链接:
https://zhuanlan.zhihu.com/p/579714305
https://blog.csdn.net/weixin_42688499/article/details/127905081
https://blog.csdn.net/qq_40880022/article/details/119839142
https://www.cnblogs.com/diantong/p/10745372.html