启动过程是指计算机从开机自检到操作系统完全加载的一系列动作。深入理解启动过程对于有效解决启动问题、提升系统性能以及高效管理系统的启动组件至关重要。例如,可以帮助我们识别和处理在启动过程中可能出现的诸如硬件故障、配置错误等问题。例如帮助我们个性化定制启动配置,包括选择开机启动的具体程序或服务,从而直接影响整体系统性能。
启动过程概述
-
硬件初始化
在启动过程中,计算机的固件(如BIOS
或UEFI
)开始接管并设置所有必要的硬件组件,包括CPU、内存、存储设备及周边设备。这一关键阶段确保了这些组件为操作系统的使用做好充分准备。 -
加载操作系统
硬件初始化完成后,就开始加载操作系统,这一步骤通常包括将内核及其关键服务载入内存中。 -
启动系统服务
随着操作系统的启动,它会激活一系列系统服务和驱动程序,这些核心程序确保了计算机的平稳运行,使得诸如管理网络连接、处理输入/输出操作以及维护安全措施等工作得以顺利进行。 -
用户交互
最后,向用户展示登录界面或桌面环境,赋予用户对计算机及其各种应用程序的完全访问权限。
深入理解启动过程
下图展示了启动过程的各个阶段,后文将对图中的各个阶段作详解。
开机自检(POST:Power-On Self-Test)
当开启计算机电源时,会发生一个至关重要的过程,即开机自检(POST
)。这个诊断测试序列由系统固件(BIOS
或UEFI
)执行,作为启动过程中的关键步骤。其主要目的是在将控制权交给操作系统之前,验证所有基本硬件组件是否正常工作。
POST各阶段及其功能
-
初始化
当计算机开启时,系统固件(BIOS
或UEFI
)开始接管控制权。固件首先初始化关键硬件组件,如CPU、RAM、芯片组以及其他必需设备。 -
开机自检
初始化之后立即开始POST
序列,通过向各硬件组件发送测试信号和命令来检查其状态,包括CPU、RAM、存储设备、显卡、外设(键盘、鼠标)以及其他已连接的硬件,以确保它们能正确响应并在可接受的参数范围内运行。POST
过程中的任何失败都会有错误消息显示或者发出可听见的蜂鸣声,指出哪个组件未能通过测试。。- CPU 通过验证其运行频率和执行简单测试来检查
- RAM 通过写入和读取数据来验证其完整性
- 存储设备会被检查是否在位,并进行基本功能检测
- 外设可能会通过检查它们是否能响应命令来进行测试
-
错误处理
如果在POST
过程中检测到错误,系统通常会停止运行并显示错误消息,或者可能发出一系列蜂鸣声(称为蜂鸣代码,长短音组合)。这些错误消息和蜂鸣代码对于诊断硬件问题非常有用,通过查阅服务器手册,一般就可识别故障组件或区域。 -
自检完成并交接
如果POST
序列完成且未检测到任何严重错误,固件就会接着初始化其他系统组件,并搜索启动设备以加载操作系统。
理解BIOS/UEFI
BIOS 和 UEFI 是两种关键的固件接口,负责初始化硬件组件、运行系统诊断以及支持计算机上操作系统的启动。它们在系统启动过程中扮演着核心角色。
BIOS
BIOS
多年来一直是主导性的固件接口,存储在主板上的芯片中,其关键作用是在启动阶段激活和监控硬件。一旦计算机开机,BIOS
就会接管并执行开机自检,自检完成后。BIOS
会按照在BIOS
设置中设置好的启动顺序寻找启动设备,这个启动顺序通常包括硬盘、光驱、USB以及网络接口等常见设备。
找到启动设备后,BIOS
会进一步查找该存储设备上的主引导记录(MBR
)或全局唯一标识分区表(GPT
),这些记录包含初始引导加载器代码。然后,BIOS
将控制权准确地传递给指定的引导加载器,例如用于 Linux 操作系统的 GRUB
。
UEFI(统一可扩展固件接口)
UEFI
是一种更现代且更具灵活性的 BIOS
替代品,提供了比 BIOS
更多的高级功能。UEFI
同样驻留在主板上,负责初始化硬件和启动操作系统。与 BIOS
类似,UEFI
开始时同样进行硬件初始化和系统检查,但 UEFI
支持更多现代硬件标准,相比传统 BIOS
启动时间更短。
UEFI
包含一个更为复杂的引导管理器,相比于 BIOS
系统中使用的引导加载器,它可以理解不同的文件系统,使得系统能够从使用新型文件系统(如 GPT
)格式化的驱动器启动。它利用 EFI
引导分区来存储引导加载器及其相关信息。UEFI 引入了安全启动(Secure Boot
)这一特性,可以在启动过程中验证引导加载器和操作系统内核的数字签名,防止在启动时加载未经授权或恶意的代码。
BIOS 和 UEFI 的区别
BIOS
使用的是主引导记录(MBR
)方法,而UEFI
使用的是全局唯一标识分区表(GPT
)方法。UEFI
更加灵活,支持更大的存储容量,更现代的硬件,并实现更快的启动速度。UEFI
引入的安全启动增强了系统安全性,通过验证引导加载器和操作系统组件的真实性来保护系统。
主引导记录(MBR)
主引导记录(MBR
)在磁盘存储结构中起着至关重要的作用,与基于BIOS
的系统紧密相关,是启动过程初期的催化剂。
MBR结构
MBR
位于存储设备的第一个扇区(通常是硬盘或SSD的前512字节),固定位置在逻辑块地址(LBA)0处。MBR
大小为512字节,由三个部分组成:
- 初始446字节的空间用于存放引导代码;
- 随后的64字节用于存放分区表信息;
- 最后的2字节为校验值或结束标志,用于确认MBR的有效性。
分区表是一个小型数据库,保存有关磁盘分区的信息。此表最多可以存储四个主分区或三个主分区和一个扩展分区的信息。分区表中的每一个条目都包括: - 每个分区的起始和结束地址;
- 分区类型(例如
FAT
、NTFS
、Linux文件系统等); - 可启动标志,指示哪个分区是活动的/可启动分区;
MBR的功能
MBR引导代码的主要功能是定位并加载活动/可启动分区的引导加载器。它通过读取分区表来识别带有可启动标志的分区,并从该分区执行引导加载器代码。随后,引导加载器(如GRUB
)接手,显示启动菜单来让用户选择要加载的操作系统,选择完成后加载所选操作系统的内核并初始化启动进程。
MBR的局限性
MBR的局限在于仅支持四个主分区或三个主分区加一个扩展分区(扩展分区内部还可包含多个逻辑分区),这限制了磁盘上可用分区的数量。MBR采用32位寻址方式,因此最大只能支持2TB的磁盘空间。由于这一限制,大于2TB的大容量磁盘无法在MBR下得到充分利用。此外,MBR缺乏内置的安全特性,容易受到感染主引导扇区病毒或覆盖引导加载器恶意代码的威胁。
GUID分区表(GPT)
GUID分区表(GPT
)是一种应用于现代存储设备的分区方案,与UEFI系统密切相关。由于其众多优点和功能,特别是在与UEFI固件结合使用时,GPT取代了较早的主引导记录(MBR
)分区方案。
GPT结构
GPT作为一种分区方案,定义了存储设备上分区的布局。与受限于磁盘大小和分区数量的MBR不同,GPT提供了更高的灵活性和可扩展性。GPT磁盘中的每个分区都由一个全局唯一标识符(GUID)唯一标识,理论上允许每块磁盘拥有高达128个分区(但实际上的数量限制可能会因操作系统和系统固件的不同而有所差异)。
GPT磁盘包含了保护型MBR,以便与可能不识别GPT分区的传统系统保持兼容。这个保护型MBR告诉旧系统该磁盘正在使用中,防止它们误改或重写GPT分区。GPT在磁盘的开头和结尾都存储了分区条目表,这种冗余设计增强了数据完整性,并提供了有关分区布局的备份信息。
GPT功能
UEFI需要一个特定的分区,即UEFI系统分区(ESP
),它是GPT方案的一个主要组成部分。ESP包含了引导加载器、固件可执行文件以及启动过程所需的其他文件。UEFI固件利用存储在GPT中的信息来定位UEFI引导加载器。引导加载器存储在ESP中,并在固件的启动配置数据中明确指定。UEFI固件能够理解并直接从GPT头中读取分区信息,利用这些信息来识别可启动分区,并从ESP加载UEFI引导加载器。
GPT与UEFI共同协作,支持安全启动功能。安全启动利用来自GPT的信息验证引导加载器和操作系统组件的数字签名,确保启动过程的安全性。GPT支持超过2TB的磁盘,解决了MBR分区方案在此方面的局限性。它能够有效地管理大容量磁盘上的分区,并为未来的存储需求提供了可扩展性。
GRUB
GRUB
(全称Grand Unified Boot Loader)是一款广泛应用于Linux的启动加载器,负责管理计算机的启动过程。GRUB特别针对类Unix操作系统,尤其是Linux进行了设计。GRUB的主要功能是定位操作系统内核并将其加载到内存中。同时,它还负责管理在启动过程中协助内核工作的初始RAM磁盘(initrd或initramfs)。
GRUB的配置文件是grub.cfg
或menu.lst
,用户可以在其中定义启动选项、指定内核参数以及自定义启动菜单的外观。这样,用户就能修改启动设置或在操作系统启动时添加特定参数。
在安装Linux发行版的过程中,GRUB通常会被安装在硬盘的主引导记录(MBR)或UEFI系统使用的EFI系统分区上。这样一来,GRUB就能在启动时接管并显示其菜单界面,让用户可以选择启动哪一个操作系统。
初始RAM磁盘(Initrd)镜像
初始RAM磁盘(initrd
),也称为初始RAM文件系统(initramfs
),是启动过程中计算机主操作系统接管之前加载到内存中的临时文件系统,是现代Linux启动过程中的一个重要组成部分。initrd 的主要目的在于提供一组最小化的工具、驱动程序和实用程序,这些是挂载根文件系统所必需的。它包含了内核访问实际根文件系统所需的存储控制器、文件系统和其他硬件组件的基本驱动程序。
在启动过程中,引导加载器(如GRUB)将Linux内核加载到内存中。内核随后解压自身,并且如果配置为使用 initrd,则会将 initrd 镜像作为一个临时根文件系统加载到预设的内存位置。initrd 就绪后,内核会执行 initrd 内的代码。这段代码执行诸如加载必要的驱动程序、初始化硬件以及执行必要的检查等任务,以准备将系统过渡到实际根文件系统。
在内核完成初始化并检测到硬件后,initrd 的主要任务就基本完成了。它将控制权交回主内核,主内核随后卸载 initrd 并挂载实际的根文件系统(由引导加载器或内核参数指定)。传统系统使用的是initrd,但现代系统常常使用 initramfs。initramfs是一个cpio归档包,在启动时解压进RAM中。initramfs更加灵活,允许采取更模块化的方式包含必要的文件和驱动程序。
内核
内核是操作系统的核心,负责管理硬件资源,提供抽象层,并控制硬件与软件之间的交互。在 initrd 镜像完成其任务后,内核开始接管,初始化系统硬件,利用 initrd 提供的信息挂载启动参数中指定的实际根文件系统(例如ext4、XFS),并启动用户空间初始化过程。
根文件系统(RootFS)
根文件系统(RootFS
)是操作系统启动过程中的关键组件,它是文件系统的顶级目录层次结构,包含了基本的系统文件和目录。在启动过程中,内核对其进行挂载,所有其他文件系统则作为根文件系统的子目录进行挂载。
诸如GRUB
这样的引导加载器,会在配置中指定根文件系统所在位置。这一信息对于内核了解去哪里找到启动操作系统所需的核心文件和目录至关重要。根文件系统可以有不同的类型,比如ext4、XFS或者其他支持的文件系统,选择何种文件系统类型取决于系统管理员的偏好和需求。
在某些情况下,尤其是在复杂的存储场景(例如RAID或LVM配置)中,会使用 initramfs。initramfs为内核提供了初始化和挂载根文件系统所需的必要模块和工具,之后内核切换至实际的根文件系统。
根文件系统包含诸如/bin
、/etc
、/sbin
和/lib
等关键目录,这些目录分别包含了系统运行所需的基本二进制文件、配置文件、系统库和脚本。根文件系统通常是一个持久化的文件系统,存储在硬盘驱动器或固态硬盘等存储设备上,以确保重启前后操作系统有一个一致的运行环境。
操作系统的稳定性和功能性依赖于根文件系统的成功初始化和挂载,根文件系统为整个操作系统环境提供了基础。
初始化进程(Init 进程)
init
进程,是包括许多Linux发行版在内的类Unix操作系统启动过程中不可或缺的一部分,其首要职责是通过启动各种系统服务和用户空间进程,使系统初始化并进入可运行状态。内核加载并初始化完成后,会将控制权转交给 init 进程。内核命令行参数或配置文件中指定了应该转移控制权的目标进程。
传统的Unix系统使用具有不同运行级别的 init 进程,每个运行级别代表了不同的系统状态。然而,现代Linux系统(例如基于RHEL的系统如CentOS)已经转向使用systemd
,它作为 init 的替代品引入了一种更为灵活和高效的系统初始化管理方法。在类似RHEL的现代Linux系统中,systemd
已成为默认的初始化系统。它实现了并行初始化,从而缩短了启动时间,提高了系统响应速度。systemd
从位于/etc/systemd/system
和/usr/lib/systemd/system
等目录下的单元文件中读取其配置信息。
无论init
还是systemd
,都负责启动系统服务和守护进程,这些服务为操作系统提供了必不可少的功能,例如网络、日志记录以及与硬件相关的服务等。
系统守护进程(Daemons)
系统守护进程,又称为后台进程或服务,在包括基于RHEL在内的类Unix操作系统启动过程和持续运行中发挥着重要的作用。守护进程是一种独立于用户交互运行的后台进程。守护进程执行特定的任务,例如管理硬件、处理系统事件或提供网络服务等。
在启动过程中,init或systemd进程负责启动系统守护进程。这些守护进程按照 init 下的特定运行级别或 systemd 单元文件中定义的方式进行启动配置。守护进程初始化过程可能涉及读取配置文件、建立通信通道以及分配资源等操作。
常见的守护进程包括:
- 网络服务:如用于安全访问的 sshd、用于web服务的 httpd、用于动态获取IP地址的 dhcpd 等。
- 日志服务:如rsyslogd或syslog-ng。
- 时间同步服务:如ntpd或chronyd。
- 打印服务:如通用Unix打印系统cupsd。
- 硬件管理:如用于设备管理的udev,用于高级配置和电源接口事件的acpid。
init或systemd管理守护进程之间的依赖关系,以确保依赖特定资源或服务的守护进程能够按正确的顺序启动。systemd 利用现代多核系统的优势,引入了并行初始化的概念,这意味着可以同时启动多个守护进程和服务,从而缩短启动时间。
系统守护进程初始化完毕后,就意味着大功告成了,此系时统已准备好处理用户交互如登录等操作。