本文导航
编译自: https://opensource.com/article/17/2/linux-boot-and-startup
理解操作系统开机引导和启动过程对于配置操作系统和解决相关启动问题是至关重要的。该文章陈述了 GRUB2 引导装载程序[1]开机引导装载内核的过程和 systemd 初始化系统[2]执行开机启动操作系统的过程。 事实上,操作系统的启动分为两个阶段:引导boot和启动startup。引导阶段开始于打开电源开关,结束于内核初始化完成和 systemd 进程成功运行。启动阶段接管了剩余工作,直到操作系统进入可操作状态。 总体来说,Linux 的开机引导和启动过程是相当容易理解,下文将分节对于不同步骤进行详细说明。
注意,本文以 GRUB2 和 systemd 为载体讲述操作系统的开机引导和启动过程,是因为这二者是目前主流的 linux 发行版本所使用的引导装载程序和初始化软件。当然另外一些过去使用的相关软件仍然在一些 Linux 发行版本中使用。 引导过程引导过程能以两种方式之一初始化。其一,如果系统处于关机状态,那么打开电源按钮将开启系统引导过程。其二,如果操作系统已经运行在一个本地用户(该用户可以是 root 或其他非特权用户),那么用户可以借助图形界面或命令行界面通过编程方式发起一个重启操作,从而触发系统引导过程。重启包括了一个关机和重新开始的操作。
|
| SystemV 运行级别 | systemd 目标态 | systemd 目标态别名 | 描述 |
|---|---|---|---|
| halt.target | 停止系统运行但不切断电源。 | ||
| 0 | poweroff.target | runlevel0.target | 停止系统运行并切断电源. |
| S | emergency.target | 单用户模式,没有服务进程运行,文件系统也没挂载。这是一个最基本的运行级别,仅在主控制台上提供一个 shell 用于用户与系统进行交互。 | |
| 1 | rescue.target | runlevel1.target | 挂载了文件系统,仅运行了最基本的服务进程的基本系统,并在主控制台启动了一个 shell 访问入口用于诊断。 |
| 2 | runlevel2.target | 多用户,没有挂载 NFS 文件系统,但是所有的非图形界面的服务进程已经运行。 | |
| 3 | multi-user.target | runlevel3.target | 所有服务都已运行,但只支持命令行接口访问。 |
| 4 | runlevel4.target | 未使用。 | |
| 5 | graphical.target | runlevel5.target | 多用户,且支持图形界面接口。 |
| 6 | reboot.target | runlevel6.target | 重启。 |
| default.target | 这个目标态target是总是 multi-user.target 或 graphical.target 的一个符号链接的别名。systemd 总是通过 default.target 启动系统。default.target 绝不应该指向 halt.target、 poweroff.target 或 reboot.target。 |
表 1 老版本 systemV 的 运行级别与 systemd 与目标态target或目标态别名的比较
每个目标态target有一个在其配置文件中描述的依赖集,systemd 需要首先启动其所需依赖,这些依赖服务是 Linux 主机运行在特定的功能级别所要求的服务。当配置文件中所有的依赖服务都加载并运行后,即说明系统运行于该目标级别。
systemd 也会查看老式的 systemV init 目录中是否存在相关启动文件,若存在,则 systemd 根据这些配置文件的内容启动对应的服务。在 Fedora 系统中,过时的网络服务就是通过该方式启动的一个实例。
如下图 1 是直接从 bootup 的 man 页面拷贝而来。它展示了在 systemd 启动过程中一般的事件序列和确保成功的启动的基本的顺序要求。
sysinit.target 和 basic.target 目标态可以被视作启动过程中的状态检查点。尽管 systemd 的设计初衷是并行启动系统服务,但是部分服务或功能目标态是其它服务或目标态的启动的前提。系统将暂停于检查点直到其所要求的服务和目标态都满足为止。
sysinit.target 状态的到达是以其所依赖的所有资源模块都正常启动为前提的,所有其它的单元,如文件系统挂载、交换文件设置、设备管理器的启动、随机数生成器种子设置、低级别系统服务初始化、加解密服务启动(如果一个或者多个文件系统加密的话)等都必须完成,但是在 sysinit.target 中这些服务与模块是可以并行启动的。
sysinit.target 启动所有的低级别服务和系统初具功能所需的单元,这些都是进入下一阶段 basic.target 的必要前提。

图 1:systemd 的启动流程
在 sysinit.target 的条件满足以后,systemd 接下来启动 basic.target,启动其所要求的所有单元。 basic.target 通过启动下一目标态所需的单元而提供了更多的功能,这包括各种可执行文件的目录路径、通信 sockets,以及定时器等。
最后,用户级目标态(multi-user.target 或 graphical.target) 可以初始化了,应该注意的是 multi-user.target 必须在满足图形化目标态 graphical.target 的依赖项之前先达成。
图 1 中,以 * 开头的目标态是通用的启动状态。当到达其中的某一目标态,则说明系统已经启动完成了。如果 multi-user.target 是默认的目标态,则成功启动的系统将以命令行登录界面呈现于用户。如果 graphical.target 是默认的目标态,则成功启动的系统将以图形登录界面呈现于用户,界面的具体样式将根据系统所配置的显示管理器[8]而定。
最近我需要改变一台使用 GRUB2 的 Linux 电脑的默认引导内核。我发现一些 GRUB2 的命令在我的系统上不能用,也可能是我使用方法不正确。至今,我仍然不知道是何原因导致,此问题需要进一步探究。
grub2-set-default 命令没能在配置文件 /etc/default/grub 中成功地设置默认内核索引,以至于期望的替代内核并没有被引导启动。故在该配置文件中我手动更改 GRUB_DEFAULT=saved 为 GRUB_DEFAULT=2,2 是我需要引导的安装好的内核文件的索引。然后我执行命令 grub2-mkconfig > /boot/grub2/grub.cfg 创建了新的 GRUB 配置文件,该方法如预期的规避了问题,并成功引导了替代的内核。
GRUB2、systemd 初始化系统是大多数现代 Linux 发行版引导和启动的关键组件。尽管在实际中,systemd 的使用还存在一些争议,但是 GRUB2 与 systemd 可以密切地配合先加载内核,然后启动一个业务系统所需要的系统服务。
尽管 GRUB2 和 systemd 都比其前任要更加复杂,但是它们更加容易学习和管理。在 man 页面有大量关于 systemd 的帮助说明,freedesktop.org 也在线收录了完整的此帮助说明[9]。下面有更多相关信息链接。
GNU GRUB[10] (Wikipedia)
GNU GRUB Manual[11] (GNU.org)
Master Boot Record[12] (Wikipedia)
Multiboot specification[13] (Wikipedia)
systemd[14] (Wikipedia)
systemd bootup process[15] (Freedesktop.org)
systemd index of man pages[16] (Freedesktop.org)
作者简介:
David Both 居住在美国北卡罗纳州的首府罗利,是一个 Linux 开源贡献者。他已经从事 IT 行业 40 余年,在 IBM 教授 OS/2 20余年。1981 年,他在 IBM 开发了第一个关于最初的 IBM 个人电脑的培训课程。他也曾在 Red Hat 教授 RHCE 课程,也曾供职于 MCI worldcom,Cico 以及北卡罗纳州等。他已经为 Linux 开源社区工作近 20 年。
via: https://opensource.com/article/17/2/linux-boot-and-startup
作者:David Both[17] 译者: penghuster 校对:wxy
本文由 LCTT 原创编译,Linux中国 荣誉推出
[1]: GRUB2 引导装载程序 - https://en.wikipedia.org/wiki/GNU_GRUB
[2]: systemd 初始化系统 - https://en.wikipedia.org/wiki/Systemd
[3]: 中断 - https://en.wikipedia.org/wiki/BIOS_interrupt_call
[4]: 多重引导规范 - https://en.wikipedia.org/wiki/Multiboot_Specification
[5]: 传统的常规 MBR - https://en.wikipedia.org/wiki/Master_boot_record
[6]: systemd - https://en.wikipedia.org/wiki/Systemd
[7]: init - https://en.wikipedia.org/wiki/Init#SysV-style
[8]: 显示管理器 - https://opensource.com/article/16/12/yearbook-best-couple-2016-display-manager-and-window-manager
[9]: 帮助说明 - https://www.freedesktop.org/software/systemd/man/index.html
[10]: GNU GRUB - https://en.wikipedia.org/wiki/GNU_GRUB
[11]: GNU GRUB Manual - https://www.gnu.org/software/grub/manual/grub.html
[12]: Master Boot Record - https://en.wikipedia.org/wiki/Master_boot_record
[13]: Multiboot specification - https://en.wikipedia.org/wiki/Multiboot_Specification
[14]: systemd - https://en.wikipedia.org/wiki/Systemd
[15]: systemd bootup process - https://www.freedesktop.org/software/systemd/man/bootup.html
[16]: systemd index of man pages - https://www.freedesktop.org/software/systemd/man/index.html
[17]: David Both - https://opensource.com/users/dboth