问题描述
当修改内核参数、系统启动参数、错误操作后,我们经常会遇到一些问题:
1)当修改系统启动配置后,进行操作系统重启。然而此时操作系统没有如期启动,而是在屏幕上显示 grub> 提示符。如果不了解 GRUB 在系统启动流程中是如何工作的,就无法处理这种系统启动问题。
2)当升级操作系统内核后,进行操作系统重启以加载新内核。然而此时操作系统没有如期启动,而是在屏幕上显示 (initramfs) 提示。如果不了解在系统启动流程中内核是如何加载的,就无法处理该启动问题。
3)如果不了解系统启动流程,就不知道:如何在 BIOS 下从 GPT 中引导启动;如何从LVM中引导启动;引导加载程序(如 GRUB、LILO 等)参数含义以及如何配置;如何使用GRUB实现多操作系统的引导盘。
所以,熟知系统启动流程,对于理解原理、调整配置、排查问题、实现功能是非常有帮助的。
该笔记将记录:从 BIOS 上电开始 到 Linux systemd 运行 的整个过程,以及相关问题解决方案。
注意事项
本部分将描述系统启动流程。我们基于GNU/Linux环境,从启动按钮按下的那刻开始,到显示器终端提示用户登录结束。
本部分涉及极少的硬件知识。由于硬件不是我们的兴趣所在,因此我们在硬件方面投入的研究较少,自然也不是我们的专长(当然这不是在说硬件技术无聊)。对于硬件方面,我们只需熟悉它们的组成部分、工作原理即可(因为硬件的特性影响驱动及软件的实现,在软件中会看到硬件的相关概念)。
本部分笔记以理论知识为主。重点讲述系统启动流程,参与系统启动的组件,组建的详细信息,组件之间的协作。
本部分笔记存在完整性问题。由于知识体系之庞大,无法单次完成,需要要日积月累,不断完善,在此为内容完整性深表歉意。
本部分笔记存在准确性问题。此外由于我们知识有限,部分内容可能有失准确,我们会及时更正。
本部分笔记存在连贯性问题。由于篇幅有限且内容较多,所以本文负责概述流程,相关细节可参考附属章节。
解决方案
从程序执行角度观察
我们读过很多介绍系统启动流程的文章,多数基于1.BIOS => 2.MBR => 3.BOOTLOADER => 4.KERNEL => 5.INIT流程展开介绍。
通过该流程可以概览系统启动过程,但是却存在问题:
1)主引导记录(MBR)与引导加载程序(BOOTLOADER)的分界不明显。参与系统启动的是在 MBR 中的引导代码,而引导代码属于 Bootloader,引导代码是通过命令安装到 MBR 中。导致在讲述第二步的主引导记录时,需要涉及第三步的引导加载程序的引导代码,引发笔记结构混乱问题。
为了规避这些问题,我们决定从新角度来解释系统启动流程。鉴于我们跳过硬件原理介绍,那么对于我们来说 系统启动过程 就是 程序执行过程,所以我们可以从程序文件执行的角度来观察系统启动流程。有哪些镜像(程序文件)参与系统启动?它们保存在什么位置?它们的加载顺序是怎样的?它们负责完成哪些任务?
从程序执行角度看,系统启动可以分为如下步骤:1.BIOS => 2.GRUB => 3.KERNEL => 4.INIT
相关链接
How Computers Boot Up
The Kernel Boot Process
参考文献
6 Stages of Linux Boot Process (Startup Sequence)
Stages of Linux booting process – explanation, step by step tutorial
RH124 Chapter 13
OSDev.org/Boot Sequence
章节列表
「BIOS」- 基本输入输出系统
「Linux Boot Process and Shutdown」- Kernel and Initramfs
「UEFI」- Unified Extensible Firmware Interface
「GRUB」- 引导加载程序
「Linux Boot Process and Shutdown」- Init,systemd,runlevel,初始化进程
「Linux Boot Process and Shutdown」- System startup/Hardware initilazation (BIOS/System start)
「Linux Boot Process and Shutdown」- Boot loader Stage 2(GRUB Boot loader)