linux学习之linux系统启动流程(MBR+BIOS)
LINUX系统启动流程
centos6的启动流程
POST --> BootSequence (BIOS)
–> Bootloader(MBR)
–> kernel(ramdisk)
–> rootfs(只读)
–> init(systemd)
1.BIOS(Basic Input and Output System)
:
上电后电脑内部硬件集成了一部分二进制程序用来POST(Power-On-Self-Test)开机自检,主要检查电脑中CPU、内存、硬盘接口等硬件是否正常;查找硬盘、USB或者网络中是否有引导系统启动的程序。
3.grub bootload
启动顺序:grub stage1
:读取MBRgrub stage1.5
:读取加载内核所需的文件系统grub stage2
:加载vmlinuz内核和initramfs初始化文件系统。
众所周知,每个系统的都需要内核程序来对整个系统进行调度,Linux系统中采用了微内核模式,即内核和各自的模块(包括文件系统)分开,使得Linux中的内核是十分小的,小到连文件系统都没有,但是内核又需要文件系统才能加载硬盘中的各类硬件的驱动程序,这如何处理?于是就又了一个叫做initramfs的压缩包协助内核实现内核启动。
4.以硬盘为例,运行bootload引导启动程序后也是需要文件系统才能加载内核(vmlinuz)模块和initramfs文件的加载硬盘的的前446字节读取MBR(stage ),但是446字节明显不足以存放文件系统驱动,其实这446字节的二进制程序是引导bootload到第2个扇区至28个扇区中查找文件系统的,启动的硬盘在做成启动盘时会在第一个扇区存放MBR和为分区预留空间,然后在后27个扇区中存放各类小型的文件系统供bootload读取。(stage 1.5)
5.读取了文件系统后就开始加载vmlinuz
和initramfs
了(stage2),那么initramfs又是如何加载磁盘中的文件系统呢?其实initramfs解压后会发现解压出来的目录与系统的根系统的目录十分相似,其实就是一个微型的操作系统,内置了可以读取硬盘文件的驱动程序,initramfs以只读方式挂载了硬盘,并通过读取/etc/fstab获取整个磁盘的挂载情况,如果分区挂载没有问题,initramfs则将内核控制权转交给真正的内核并启动/sbin/init初始化程序开始引导后续程序。
6.读取/etc/inittab
中的启动运行级别如id:3:initdefault,表示启动后运行的runlevel是3
7./etc/rc.d/rc.sysinit
: 系统初始化脚本
(1) 设置主机名
(2) 设置欢迎信息
(3) **udev和selinux
(4) 挂载/etc/fstab文件中定义的文件系统
(5) 检测根文件系统,并以读写方式重新挂载根文件系统
(6) 设置系统时钟
(7) **swap设备
(8) 根据/etc/sysctl.conf文件设置内核参数
(9) **lvm及software raid设备
(10) 加载额外设备的驱动程序
(11) 清理操作
8.到/etc/rc*.d/
中读取启动的默认启动的运行程序
9.到/etc/init.d/rc.local
文件中读取加载自定义的启动脚本
10.启动终端服务,开启用户验证等需要的模块。
附上更为完整的图解地址:http://s4.51cto.com/wyfs02/M02/87/20/wKiom1fVBELjXsvaAAUkuL83t2Q304.jpg
centos7
在引导程序阶段与centos6一致,不同的是centos7的初始化程序用systemd取代了init
,而后执行initrd.target所有单元,包括挂载/etc/fstab
从initramfs根文件系统切换到磁盘根目录
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需要的服务
通过使用命令systemd-analyze plot>plot.svg
生成一个以图表显示的centos7的启动顺序和各个进程消耗的时间