大致分为几步:
探测硬件 (BIOS) –>加载驱动–>挂载根文件系统–>切换至根文件系统(rootfs)–>运行第一个程序
/sbin/init
初始化系统环境。
开机自检
POST(Power-On Self Test)开机自检——加载BIOS
linux开机加电后,系统开始开机自 检,该过程主要对计算机各种硬件设备进行检测,如CPU、内存、主板、硬盘、CMOS芯片等,如果出现致命故障则停机,并且由于初始化过程还没完成,所以 不会出现任何提示信号;如果出现一般故障则会发出声音等提示信号,等待故障清除;若未出现故障,加电自检完成。
加载Linux内核
主引导记录
主引导记录(MBR,Master Boot Record)是计算机开机以后访问硬盘时所必须要读取的第一个扇区,位于硬盘的第0柱面第0磁道第一扇区,大小为512字节。
MBR 中最主要的功能就是 存储 启动加载程序。诸如LILO、GRUB这些引导程序(BootLoader)都是直接安装在MBR中。
MBR 分为:
-
BootLoader 占用446字节,存储有操作系统相关信息如操作系统名称、内核位置等,目的是加载内核到内存中运行。
-
分区表(Partition Table)占用64字节,每个主分区占用16字节(这就是为什么一块硬盘只能有四个主分区)
-
分区表有效性标记(结束标记)占用2字节
-
结构图
CPU加载MBR
系统(此处不知道叫系统是否合适)通过BIOS程序找到硬盘的MBR后,将其复制到0x7c00地址所在的物理内存中,并跳转到此处继续执行。
BootLoader启动
BootLoader就是在操作系统内核运行之前,运行GRUB(一种Linux BootLoader程序,此外还有LILO、spfdisk、HD。大多为GRUB)。系统读取内存中的GRUB配置信息
加载内核
Linux内核有两阶段启动
-
初始化
initrd
initrd
(BootLoader initialized RAM disk)是由BootLoader初始化的内存盘,GRUB加载内核同时,也将初始ramdisk映像initrd
加载到 高端内存 中。首次启动时,Linux内核会将initrd作为临时根文件系统,在initrd上运行。内核执行一个sh脚本,指导内核加载实际根系统设备所需的模块。所需驱动程序加载完后,会创建一个根设备,然后将跟文件系统rootfs以只读形式挂载。此后,内核将释放ramdisk,同时运行/sbin/init
,并将控制权转移到init进程。 -
初始化系统
启动初始化进程
init
(位于目录下的/sbin/init
) ,init则为第一个用户进程, 这个阶段内核将控制权转交给init进程。init进程会首先读取/etc/inittab
文件来执行相应的脚本进行系统初始化,如设置键盘、字体、网络。/sbin/init
实际是个指向/lib/systemd/systemd
链接文件。且
sytemd
(init)进程的pid
为 1。
Linux的内核镜像在 /boot
目录下,系统读取 /boot
下的内核文件,如我的Ubuntu20.04文件如下:
确定运行级别
init
进程运行一些开机自启动程序。许多程序需要开机启动。它们在Windows叫做"服务"(service),在Linux就叫做"守护进程"(daemon)。
七种运行级别(0-6)
等级0表示:表示关机
等级1表示:单用户模式
等级2表示:无网络连接的多用户命令行模式
等级3表示:有网络连接的多用户命令行模式
等级4表示:不可用
等级5表示:带图形界面的多用户模式
等级6表示:重新启动
“rc”,表示run command(运行程序),最后的d表示directory(目录)
当Linux启动时,会寻找这些目录中的服务脚本,并根据脚本的run level确定不同的启动级别
参考
Linux 的启动流程 - 阮一峰的网络日志 (ruanyifeng.com)
linux中init.d文件夹的说明 - crazyCodeLove - 博客园 (cnblogs.com)
未完…