Linux系统启动过程详解

启动过程是指计算机从开机自检到操作系统完全加载的一系列动作。深入理解启动过程对于有效解决启动问题、提升系统性能以及高效管理系统的启动组件至关重要。例如,可以帮助我们识别和处理在启动过程中可能出现的诸如硬件故障、配置错误等问题。例如帮助我们个性化定制启动配置,包括选择开机启动的具体程序或服务,从而直接影响整体系统性能。

启动过程概述

  1. 硬件初始化
    在启动过程中,计算机的固件(如BIOSUEFI)开始接管并设置所有必要的硬件组件,包括CPU、内存、存储设备及周边设备。这一关键阶段确保了这些组件为操作系统的使用做好充分准备。

  2. 加载操作系统
    硬件初始化完成后,就开始加载操作系统,这一步骤通常包括将内核及其关键服务载入内存中。

  3. 启动系统服务
    随着操作系统的启动,它会激活一系列系统服务和驱动程序,这些核心程序确保了计算机的平稳运行,使得诸如管理网络连接、处理输入/输出操作以及维护安全措施等工作得以顺利进行。

  4. 用户交互
    最后,向用户展示登录界面或桌面环境,赋予用户对计算机及其各种应用程序的完全访问权限。

深入理解启动过程

下图展示了启动过程的各个阶段,后文将对图中的各个阶段作详解。
启动过程图示

开机自检(POST:Power-On Self-Test)

当开启计算机电源时,会发生一个至关重要的过程,即开机自检(POST)。这个诊断测试序列由系统固件(BIOSUEFI)执行,作为启动过程中的关键步骤。其主要目的是在将控制权交给操作系统之前,验证所有基本硬件组件是否正常工作。

POST各阶段及其功能

  1. 初始化
    当计算机开启时,系统固件(BIOSUEFI)开始接管控制权。固件首先初始化关键硬件组件,如CPU、RAM、芯片组以及其他必需设备。

  2. 开机自检
    初始化之后立即开始POST序列,通过向各硬件组件发送测试信号和命令来检查其状态,包括CPU、RAM、存储设备、显卡、外设(键盘、鼠标)以及其他已连接的硬件,以确保它们能正确响应并在可接受的参数范围内运行。POST过程中的任何失败都会有错误消息显示或者发出可听见的蜂鸣声,指出哪个组件未能通过测试。。

    • CPU 通过验证其运行频率和执行简单测试来检查
    • RAM 通过写入和读取数据来验证其完整性
    • 存储设备会被检查是否在位,并进行基本功能检测
    • 外设可能会通过检查它们是否能响应命令来进行测试
  3. 错误处理
    如果在POST过程中检测到错误,系统通常会停止运行并显示错误消息,或者可能发出一系列蜂鸣声(称为蜂鸣代码,长短音组合)。这些错误消息和蜂鸣代码对于诊断硬件问题非常有用,通过查阅服务器手册,一般就可识别故障组件或区域。

  4. 自检完成并交接
    如果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的有效性。
    MBR结构
    分区表是一个小型数据库,保存有关磁盘分区的信息。此表最多可以存储四个主分区或三个主分区和一个扩展分区的信息。分区表中的每一个条目都包括:
  • 每个分区的起始和结束地址;
  • 分区类型(例如FATNTFS、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方案图

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.cfgmenu.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 利用现代多核系统的优势,引入了并行初始化的概念,这意味着可以同时启动多个守护进程和服务,从而缩短启动时间。


系统守护进程初始化完毕后,就意味着大功告成了,此系时统已准备好处理用户交互如登录等操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/620790.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机组成原理【CO】Ch4 指令系统

文章目录 考纲第四章 指令系统4.1 指令格式4.2 指令的寻址方式4.3 程序的机器级代码表示4.4 CISC和RISC的基本概念 【※】扩展码指令计算【※】指令系统【指令格式】【※】指令的寻址方式【※】指令的机器级代码表示x86汇编指令(重点关注 intel 格式)MIP…

Jmeter参数化的 4 种方式用法总结

参数化就是用变量代替数据的过程,总结参数化的4种方式: 1、用户自定义变量 用户自定义变更有两种方法: (1)在测试计划面板中的用户定义的变量设置 说明:在此用户定义的变量对所有测试计划都会生效 &…

如何通过Linux pciehp sysfs接口控制PCIe Slot电源状态?-3

pciehp sysfs接口电源控制与NVME驱动卸载的区别 从NVMe SSD设计本身而言,当通过pciehp sysfs接口对PCIe插槽执行Power Off操作时,由于NVMe SSD作为PCIe设备,其电源供应是直接依赖于所连接的PCIe插槽提供的。当插槽电源被关闭时,会…

#382. 工资计算系统(继承和派生)

水个文 代码如下&#xff1a; #include <cstdio> #include <cstdlib> #include <iostream> using namespace std;const double RATIO 0.01; const double SALARY_PER_YEAR 35; const double BASE_SALARY 1000;// class Employer{ public:int workAge, sa…

【多线程】单例模式 | 饿汉模式 | 懒汉模式 | 指令重排序问题

文章目录 单例模式一、单例模式1.饿汉模式2.懒汉模式&#xff08;单线程&#xff09;3.懒汉模式&#xff08;多线程&#xff09;改进 4.指令重排序1.概念2.question:3.解决方法4总结&#xff1a; 单例模式 一、单例模式 单例&#xff0c;就是单个实例 在有些场景中&#xff0c…

蓝色系UX/UI设计求职面试作品集模版figmasketchPPT可编辑源文件

页面数量: 20P 页面尺寸:1920*1080PX 交付格式&#xff1a;figma、sketch、PPT 赠送文件&#xff1a;24款高质量样机&#xff08;PSD格式&#xff09; 该作品集虽然只有20页&#xff0c;但可根据需求复制作品集里已有的页面作为模版来扩展您的设计项目 该作品集模版可编辑可修…

设计模式在芯片验证中的应用——策略

1. 策略模式 策略模式是一种行为设计模式&#xff0c; 它能让你定义一系列算法&#xff0c; 并将每种算法分别放入独立的类中&#xff0c; 以使算法的对象能够相互替换。 在RTL设计中可能包含了复杂的多个访问仲裁逻辑&#xff0c;使用了多种算法来确定访问内存优先级顺序&am…

【CMake】CMake从入门到实战系列(九)——CMake中的字符串处理指令和运算符

文章目录 一、字符串处理指令string基本语法参数含义 二、字符串运算符字符串比较字符串连接字符串替换字符串长度字符串截取字符串转换大小写字符串正则表达式匹配和替换字符串查找子字符串字符串中查找正则表达式匹配的内容字符串附加 三 、示例 一、字符串处理指令string 在…

【Git教程】(十)版本库之间的依赖 —— 项目与子模块之间的依赖、与子树之间的依赖 ~

Git教程 版本库之间的依赖 1️⃣ 与子模块之间的依赖2️⃣ 与子树之间的依赖&#x1f33e; 总结 在 Git 中&#xff0c;版本库是发行单位&#xff0c;代表的是一个版本&#xff0c;而分支或标签则只能被创建在版本库这个整体中。如果一个项目中包含了若干个子项目&#xff0c;…

【Java】图片处理工具ImageMagick简介及其在Java中的应用

ImageMagick是一款强大的图像处理软件&#xff0c;它可以用于创建、编辑、合并和转换图像。它支持超过200种图像格式&#xff0c;并且提供了丰富的功能&#xff0c;包括图像缩放、旋转、裁剪、加水印、添加特效等。ImageMagick还支持批量处理图像&#xff0c;可以通过命令行或者…

PUBG绝地求生加速器用哪个好 最新带来绝地求生好用的加速器推荐

PUBG绝地求生加速器用哪个好 最新带来绝地求生好用的加速器推荐 绝地求生作为一款非常流行的游戏&#xff0c;吸引了全球亿万玩家的关注。相信大部分玩家都曾经在游戏中遇到过卡顿掉帧以及无法连接服务器的情况&#xff0c;&#xff0c;这对于游戏体验来说是非常不好的。今天…

上位机图像处理和嵌入式模块部署(用树莓派4b开发固件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 嵌入式开发的领域其实很广&#xff0c;有上位机、驱动和bsp移植。较早之前&#xff0c;由于自己曾经在芯片公司上班&#xff0c;所以对uboot、linu…