Linux系统启动过程详解

news2024/12/23 18:14:13

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

启动过程概述

  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.coloradmin.cn/o/1590262.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言之九九乘法表||素数||最小公倍数

一、九九乘法表 (1)思路 1、九九乘法表中存在三个变量,以 x1 ; x2 ; y 为例(这里也可以使用两个变量,用x1和x2来表示y,方法一样) 2、想好了变量之后,我们要想怎样将他实现呢&#x…

Robotstudio2024中从备份文件恢复和创建工作站的具体方法演示

Robotstudio2024中从备份文件恢复和创建工作站的具体方法演示 如下图所示,打开Robotstudio2024软件,有需要的可以从以下链接获取: ABB机器人编程仿真软件RobotStudio 2024.1-链接baiduyun 点击“新建”—工作站—创建, 如下图所示,点击“ABB模型库”,选择自己使用的机器…

二刷大数据(一)- Hadoop

目录 大数据4V Hadoop概念Hadoop大版本区别HDFS产生背景架构文件块大小写文件流程读数据流程NameNode & SecondNameNodeDataNode工作机制 YARNMapReduce为什么不适合实时核心思想切片与MapTask原理MapTask机制MapReduceApplicationMasterApplicationMaster shuffle机制Redu…

jenkins+sonar配置

安装插件 Sonar Scanner 用于扫描项目 配置sonar scanner jenkins集成sonar 1、sonar生成token 生成完保存好,刷新后无法查看 2、jenkins配置全局凭据 3、jenkins配置系统设置

扭蛋机小程序:线上扭蛋机模式发展空间有多大?

潮玩行业近几年的发展非常快,推动了扭蛋机市场的发展,越来越多的人加入到了扭蛋机赛道中,市场迎来了新的发展期。如今,我国的二次元文化的发展不断成熟,扭蛋机主打的二次元商品迎来了更多的商业机会。 一、互联网扭蛋机…

改变LoRA的初始化方式,北大新方法PiSSA显著提升微调效果

ChatGPT狂飙160天,世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 随着大模型的参数量日益增长,微调整个模型的开销逐渐变得难以接受。 为此&#x…

RestTemplate—微服务远程调用—案例解析

简介:总结来说,微服务之间的调用方式有多种,选择哪种方式取决于具体的业务需求、技术栈和架构设计。RESTful API和HTTP客户端是常见的选择,而Feign和Ribbon等辅助库可以简化调用过程。RPC和消息队列适用于特定的场景,如…

FPGA - 以太网UDP通信(三)

一,引言 前文链接:FPGA - 以太网UDP通信(一) FPGA - 以太网UDP通信(二) 在以上文章中介绍了以太网简介,以太网UDP通信硬件结构,以及PHY芯片RGMII接口-GMII接口转换逻辑&#xff0c…

Node.js从基础到高级运用】二十三、Node.js中自动重启服务器

引言 在Node.js开发过程中,我们经常需要修改代码后重启服务器来应用这些更改。手动重启不仅效率低下,而且会打断开发流程。幸运的是,有一些工具可以帮助我们自动化这个过程。本文将介绍如何使用nodemon来实现Node.js服务器的自动重启。 什么是…

清楚明了的凸松弛最优潮流!基于混合整数二阶锥规划的主动配电网最优潮流研究程序代码!

前言 最优潮流(optimal power flow,OPF)问题,是电力系统中最常见、最基础的一类优化问题。在满足基尔霍夫定律、线路容量约束以及运行安全约束等电力网络物理约束的前提下,OPF问题旨在寻找一个最优的潮流稳态工作点,使得在该工作…

【LAMMPS学习】八、基础知识(2.5)恒压器

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

WebSocket一篇讲清楚

文章目录 WebSocket简介WebSocket与HTTP的区别WebSocket的工作原理WebSocket的应用场景WebSocket的使用WebSocket 属性WebSocket 事件WebSocket 方法 WebSocket的心跳机制WebSocket 的安全性和跨域问题如何处理?有哪些好用的客户端WebSocket第三方库总结 WebSocket简…

代码随想录图论

1. 所有可能的路径 class Solution:def allPathsSourceTarget(self, graph: List[List[int]]) -> List[List[int]]:def dfs(graph, result, path, root): #result 返回结果, path记录路径, root记录遍历到了第几个节点if root len(graph) - 1: #如果遍历到最后…

C#Winform使用扩展方法自定义富文本框(RichTextBox)字体颜色

实现效果 调用方法 rtxtLog.AppendTextColorful(richTextBox1,DateTime.Now.ToString(), Color.Red); 完整代码如下 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using Sys…

Java 基于微信小程序的汽车4S店客户管理小程序,附源码

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…

SpringCloud框架 服务拆分和远程调用

数据库隔离避免耦合度过高,不同模块将自己的业务暴露为接口,供其他微服务调用 微服务远程调用技术Rest 在后端实现发送http请求 1.在启动类/配置类里注册RestTemplate启动对象 2.注入Bean对象使用

【力扣】17.04.消失的数字

这道题的题目意思就是从0-n中的数字中找出缺失的那一个,n是数组的长度,因此我的想法就是先将数组进行排序,往sort()里面一扔,完了以后看前一个与后一个之差中哪个不是等于1的,就求出来即可。 法…

去除pycharm运行pytest的默认参数--no-header --no-summary -q

进入pycharm设置(Settings),找到高级设置(Advanced Settings)—>Python–>Pytest:不添加"–no-header --no-summary -q"(Pytest:do not add “–no-header --no-summary -q”)

R语言计算:t分布及t检验

t分布理论基础 t分布也称Student’s t-distribution,主要出现在小样本统计推断中,特别是当样本量较小且总体标准差未知时,用于估计正态分布的均值。其定义基于正态分布和 X 2 X^{2} X2分布(卡方分布)。如果随机变量X服…

pytorch-多分类实战之手写数字识别

目录 1. 网络设计2. 代码实现2.1 网络代码2.2 train 3. 完整代码 1. 网络设计 输入是手写数字图片28x28,输出是10个分类0~9,有两个隐藏层,如下图所示: 2. 代码实现 2.1 网络代码 第一层将784降维到200,第二次使用…