[Linux]Boot the System

Boot the System

1 Linux 启动过程概述

当打开计算机时,会看到一系列不同的消息滚动,最后出现登录窗口。实际上,从按下电源键到登录界面呈现之前,系统进行了大量的工作。本文将详细介绍这一过程。

Linux的启动过程可以分为四个简单阶段:

1. BIOS(basic input/output system)

BIOS负责初始化硬件,并通过开机自检(POST)确保所有硬件正常运行。其主要任务是加载引导装载程序(bootloader)。开机时,BIOS首先进行硬件检测,并准备就绪后将控制权交给引导装载程序。

2. 引导装载程序(bootloader)

引导装载程序负责将内核加载到内存中,并使用一组内核参数启动内核。最常见的引导装载程序之一是GRUB,它是Linux的标准通用引导装载程序。GRUB允许用户选择加载哪个操作系统或内核版本。

3. 内核

一旦内核被加载到内存中,它会立即开始初始化设备和内存。内核的主要职责是启动init进程。内核不仅管理硬件资源,还为用户空间应用程序提供系统调用接口。

4. Init进程

Init进程是系统启动后的第一个进程,负责启动和停止系统上的关键服务进程。在Linux发行版中有三种主要的init实现方式,后面详细探讨它们。

2 BIOS

Linux启动流程的第一步是通过BIOS执行系统完整性检查。BIOS是一种固件,广泛应用于现今主流的IBM PC兼容计算机中。使用BIOS固件可以更改硬盘的启动顺序、检查系统时间、查看机器的MAC地址等。BIOS的主要目标是找到系统的引导装载程序。

当BIOS启动硬盘后,它会搜索引导块以确定如何启动系统。根据硬盘分区方式的不同,BIOS会查找主引导记录(MBR)或GPT。MBR位于硬盘的第一个扇区,即前512字节内,其中包含加载磁盘上另一个程序的代码,而这个程序实际上负责加载引导装载程序。

如果硬盘使用GPT方式进行分区,则引导装载程序的位置会有所不同。

UEFI

除了BIOS之外,另一种启动系统的方式是通过UEFI(统一可扩展固件接口)。UEFI旨在成为BIOS的继任者,现今大多数硬件都内置了UEFI固件。Macintosh设备多年来一直使用EFI进行启动,Windows也几乎完全转向UEFI启动。GPT格式设计用于与EFI配合使用。使用GPT格式的硬盘并不一定需要EFI,其第一个扇区保留了一个“保护性MBR”,以便在基于BIOS的机器上也能启动。

UEFI将所有启动信息存储在一个.EFI文件中,该文件存放在硬件上的一个名为EFI系统分区的特殊分区中,此分区包含了bootloader。相比于传统的BIOS固件,UEFI带来了许多改进。Linux系统在大多数情况下使用的仍然是BIOS。

3 bootloader

引导装载程序的主要职责包括:

  • 引导进入操作系统,也支持启动非Linux操作系统。
  • 选择要使用的内核。
  • 指定内核参数。

Linux中最常用的引导装载程序是GRUB。当然,还有其他多种引导装载程序可供选择,如LILO、efilinux、coreboot、SYSLINUX等。

了解引导装载程序的主要目标是加载内核后,接下来的问题就是它如何找到内核。这需要查看内核参数来确定。可以通过在启动时按下’e’键进入GRUB菜单来查看这些参数:

  • initrd:指定初始RAM磁盘的位置。
  • BOOT_IMAGE:指示内核映像的位置。
  • root:指出根文件系统的所在位置,内核在此位置查找init进程。通常以UUID或设备名称(如/dev/sda1)表示。
  • ro:此参数为标准设置,以只读模式挂载文件系统。
  • quiet:添加此参数是为了避免在启动过程中显示后台运行的消息。
  • splash:允许显示启动画面。

4 内核

Initrd与Initramfs

当讨论内核启动时,存在一个“先有鸡还是先有蛋”的问题。内核管理系统的硬件,但在启动期间,并非所有驱动都对内核可用。因此,我们需要一个临时的根文件系统,其中仅包含内核访问其余硬件所需的必要模块。在过去,这项任务由initrd(初始RAM磁盘)承担。内核会挂载initrd,加载必要的启动驱动,然后在加载完所需的一切后,用实际的根文件系统替换initrd。如今,我们使用一种名为initramfs的机制。这是一种内置在内核中的临时根文件系统,用于加载真实根文件系统所需的所有驱动,从而不再需要定位initrd文件。

挂载根文件系统

现在,内核拥有创建根设备和挂载根分区所需的所有模块。然而,根分区最初是以只读模式挂载的,以便fsck可以安全运行并检查系统完整性。完成这些步骤后,再以读写模式重新挂载根文件系统。随后,内核定位init程序并执行它。

5 Init

Linux中有三种主要的init实现方式:

System V Init(简称SysV)

这是传统的init系统,基于启动脚本顺序地启动和停止进程。系统的状态由运行级别(runlevels)表示,每个运行级别以不同的方式启动或停止机器。

Upstart

Upstart是较旧版本Ubuntu上使用的init系统。它引入了作业(jobs)和事件(events)的概念,通过响应特定事件来启动执行某些动作的作业。

Systemd

Systemd是新的init标准,目标导向型设计。简而言之,你有一个想要达成的目标,而Systemd试图满足该目标的所有依赖项以完成目标。


[Linux]Boot the System
https://erlsrnby04.github.io/2025/03/22/Linux-Boot-the-System/
作者
ErlsrnBy04
发布于
2025年3月22日
许可协议