【Linux】系统启动过程

news2024/11/18 11:18:00

草稿

文章目录

  • 〇、概述
  • 一、固件加载:BIOS / UEFI
    • 1.1 BIOS 和 UEFI
    • 1.2 UEFI 启动过程
      • 1.21
    • 1.2
    • 1.3
  • 二、启动管理器阶段
  • 三、内核阶段
  • 四、init阶段
  • 五、登录阶段

〇、概述

Linux系统的启动过程是一个复杂而有趣的话题,它涉及到计算机的硬件、软件、操作系统和用户之间的交互。本文将尝试用通俗易懂的语言,详细介绍Linux系统的启动过程,希望能对Linux系统的学习和使用有所帮助。

Linux系统的启动过程可以分为以下几个阶段:

  • BIOS阶段
  • 启动管理器阶段
  • 内核阶段
  • init阶段
  • 运行级别阶段
  • 登录阶段

下面我们逐一介绍每个阶段的内容和作用。

一、固件加载:BIOS / UEFI

1.1 BIOS 和 UEFI

BIOS(Basic Input/Output System,基本输入输出系统)是一段存储在主板上(ROM)的固件(firmware),它是计算机加电后执行的第一个程序,负责进行硬件自检(POST,Power-On Self Test),检查CPU、内存、硬盘等设备是否正常工作,以及设置系统的基本参数,如日期、时间、启动顺序等。

不过BIOS已经是一个“古老”的启动方式了,10多年前开始,计算机就开始逐渐使用UEFI(统一扩展固件接口)方式进行启动。

  • UEFI是一种现代的固件标准,用于取代传统BIOS。UEFI不仅可以初始化硬件和引导操作系统,还提供了更多功能,如图形化用户界面、支持网络协议、安全引导等。
  • 特点: UEFI支持更大的硬盘容量、更快的引导速度,而且具有更现代化的图形界面。它还能够执行磁盘分区和文件系统检查。
  • 引导方式: UEFI使用GUID Partition Table(GPT)作为磁盘分区方式,可以容纳更多分区和更大的硬盘。(前面的文章详细讲过相关概念)

虽然如此,人们现在依然习惯把UEFI的设置界面成为BIOS,常见的一句话是“xxx笔记本如何进入BIOS”。如果你有什么特别的需求,使用了MBR分区方案,在BIOS设置界面可以设置成为UEFI的Legacy模式,它允许引导使用MBR分区方案的操作系统。本文后面的BIOS实际上都指的是UEFI。

使用UEFI启动的电脑,磁盘会专门有一个EFI分区,卷标为:ESP(EFI System Partition),这个分区所在的磁盘和位置没有特别要求,比如我的电脑:
在这里插入图片描述

这个分区会被格式化为FAT32文件系统,以便操作系统和引导加载程序可以在其上读取和写入文件。

每次安装一个新的操作系统时,该操作系统会将其引导文件安装到EFI系统分区中。这意味着每个安装的操作系统都会在EFI系统分区内创建一个文件夹,其中包含引导加载程序和引导配置文件。不同的操作系统会在分区内的不同文件夹中存储这些文件,以避免冲突。我的电脑:
在这里插入图片描述

1.2 UEFI 启动过程

在这里插入图片描述

(未经授权,不得使用)

1.21

1.2

引导文件是操作系统引导过程中的关键组成部分,它们包含了操作系统的启动所需的信息和指令。这些文件告诉计算机如何加载操作系统内核以及如何初始化硬件和其他必要的步骤。引导文件的内容和用途因操作系统和引导方式而异,以下是一般情况下引导文件的内容和作用:

  1. 引导加载程序(Boot Loader): 引导加载程序是引导过程的第一阶段,它负责加载操作系统内核到内存中。它通常位于引导分区(如UEFI系统分区、Linux的/boot分区)中。在Windows中,常见的引导加载程序是Windows Boot Manager,而在Linux中,常见的引导加载程序是GRUB(GRand Unified Bootloader)。

  2. 配置文件: 引导加载程序通常会读取一个配置文件,该文件包含引导选项和操作系统的相关信息。这些信息可能包括操作系统的位置、内核文件名、启动参数等。配置文件的内容可以根据不同的操作系统和需求进行定制。

  3. 内核文件(Kernel): 内核文件是操作系统的核心,它包含了操作系统的基本功能和驱动程序。引导加载程序负责将内核文件加载到内存中,并启动它以初始化操作系统。

  4. 初始化 RAM 磁盘(Initramfs、Initrd): 这是一个临时的文件系统,包含了操作系统启动时所需的驱动程序和工具。在启动过程中,内核会加载Initramfs或Initrd,以便在加载真正的根文件系统之前初始化硬件和完成一些必要的任务。

  5. 根文件系统: 根文件系统是操作系统的根目录,包含了操作系统的文件和目录结构。在引导过程的后期阶段,内核将切换到根文件系统,并将控制权移交给操作系统。

UEFI(统一扩展固件接口)是一种现代的引导方式,它使用特定的引导文件和数据结构来启动操作系统。UEFI引导的过程相对复杂,涉及到以下主要步骤:

  1. Firmware初始化: UEFI固件负责初始化硬件,如内存、处理器、设备等。

  2. 加载UEFI引导程序: UEFI固件会在UEFI系统分区中查找UEFI引导程序。这个引导程序被称为EFI可执行文件(EFI executable),通常是一个UEFI应用程序,它包含了引导选项和操作系统的信息。

  3. 加载操作系统内核: UEFI引导程序会加载操作系统内核文件,以及其他必要的文件,如引导配置文件、Initramfs等。

  4. 初始化操作系统: 操作系统内核启动后,它会初始化硬件、加载驱动程序,并最终切换到根文件系统以开始用户空间的初始化。

总之,引导文件是操作系统引导过程中的关键组成部分,它们包含了启动操作系统所需的信息和指令。UEFI使用特定的引导文件和数据结构来启动操作系统,这个过程涉及多个步骤,从固件初始化到操作系统的最终启动。

1.3

启动顺序(Boot Sequence)是BIOS中的一个重要设置,它决定了BIOS从哪个设备中读取启动信息,比如硬盘、光盘、U盘等。通常情况下,BIOS会按照启动顺序依次尝试从不同的设备中读取启动信息,如果成功,则继续执行下一步,如果失败,则尝试下一个设备,直到找到合适的设备或者报错。
在这里插入图片描述

当BIOS完成自检和设置后,它会根据启动顺序从指定的设备中读取主引导记录(MBR,Master Boot Record),MBR是一个512字节的数据,位于硬盘的第一个扇区(sector),它包含了启动管理器(Boot Loader)的位置信息和分区表(Partition Table),分区表记录了硬盘上各个分区(partition)的位置和大小。MBR中前446字节存储了启动管理器的代码,后64字节存储了分区表,最后2字节存储了一个标识符(0xAA55),用于验证MBR是否有效。

当BIOS读取到MBR后,它会把控制权交给MBR中的启动管理器代码,进入下一个阶段。

二、启动管理器阶段

启动管理器(Boot Loader)是一个小程序,它可以让用户选择要启动的操作系统,比如Linux或Windows。Linux中常用的启动管理器有GRUB(GRand Unified Bootloader)和LILO(LInux LOader)。GRUB是目前最流行的启动管理器,它支持多种文件系统和操作系统,具有图形化界面和命令行模式,可以动态加载内核和配置文件。LILO是一个较早的启动管理器,它只能识别少数几种文件系统和操作系统,没有图形化界面和命令行模式,需要每次修改配置文件后重新安装才能生效。

当BIOS把控制权交给启动管理器后,启动管理器会根据用户的选择或默认配置,加载相应的操作系统内核(kernel),内核是操作系统的核心部分,它负责管理硬件资源,提供系统服务,执行用户程序等功能。启动管理器还会向内核传递一些参数(kernel parameters),用于控制内核的行为和功能。例如:

  • root=/dev/sda1:指定根文件系统所在的设备
  • ro:以只读模式挂载根文件系统
  • quiet:不显示内核启动过程中的信息
  • splash:显示图形化的启动画面

当启动管理器加载完内核后,它会把控制权交给内核,进入下一个阶段。

三、内核阶段

内核(kernel)是操作系统的核心部分,它负责管理硬件资源,提供系统服务,执行用户程序等功能。内核是一个可执行的二进制文件,通常存储在/boot目录下,文件名为vmlinuz或bzImage。内核启动时,会进行以下几个步骤:

  • 解压缩:内核文件是经过压缩的,为了节省空间和提高速度,启动管理器会把内核文件加载到内存中,然后解压缩到另一块内存区域。
  • 设置:内核会设置自己的环境,包括初始化寄存器、栈、中断、分页等。
  • 检测:内核会检测系统的硬件配置,如CPU、内存、显卡、键盘、鼠标等,并加载相应的驱动模块(module),驱动模块是一些可插拔的内核组件,用于支持不同的硬件设备和功能。
  • 挂载:内核会根据启动管理器传递的参数,挂载根文件系统(root file system),根文件系统是Linux系统中最重要的文件系统,它包含了系统的基本文件和目录,如/bin、/etc、/lib等。根文件系统可以是一个物理分区,也可以是一个逻辑卷(LVM)或者一个软件磁盘阵列(RAID)。如果根文件系统需要特殊的处理,如加密或压缩,那么内核还需要挂载一个临时的根文件系统(initramfs),用于加载必要的工具和驱动模块。
  • 启动:内核会在根文件系统中寻找第一个进程(process),进程是程序的执行实例,它占用一定的内存空间和CPU时间。Linux系统中第一个进程通常是init(/sbin/init或/systemd),它是系统所有进程的祖先,它负责初始化系统的各项设置,启动各种服务和程序。当内核找到init后,它会把控制权交给init,进入下一个阶段。

四、init阶段

init(/sbin/init或/systemd)是Linux系统中第一个进程(进程号为1),它是系统所有进程的祖先,它负责初始化系统的各项设置,启动各种服务和程序。init有两种主要的实现方式:

  • SysV init:这是一种传统的init方式,它根据运行级别(runlevel),执行不同的初始化脚本(script),初始化脚本是一些用于控制服务和程序启动和停止的命令行程序,它们通常存储在/etc/init.d目录下,并链接到不同的运行级别目录(/etc/rc.d/rcN.d或/etc/rcN.d),其中N表示运行级别的数字。SysV init使用inittab文件(/etc/inittab)来配置运行级别和初始化脚本。
  • systemd:这是一种新型的init方式,它使用单元(unit)来管理服务和程序,单元是一些用于描述服务和程序属性和依赖关系的配置文件,它们通常存储在/usr/lib/systemd/system或/etc/systemd/system目录下。systemd使用target来代替运行级别,target是一组相关联的单元,用于定义系统的工作状态。systemd使用systemctl命令来控制单元和target。

当init完成系统的初始化后,它会根据运行级别或target,进入相应的工作模式,进入下一个阶段。

Linux系统有7个运行级别,分别是:

  • 运行级别0:系统停机状态,不能正常启动
  • 运行级别1:单用户工作状态,只有root用户可以登录,用于系统维护和修复
  • 运行级别2:多用户状态,没有网络服务和图形界面
  • 运行级别3:完全的多用户状态,有网络服务和命令行界面
  • 运行级别4:系统未使用,保留
  • 运行级别5:图形化多用户状态,有网络服务和图形界面
  • 运行级别6:系统重启状态

当init进入相应的运行级别后,它会执行该运行级别目录下的初始化脚本或启动相应的target,以启动或停止各种服务和程序。例如:

  • 在运行级别3下,init会执行/etc/rc.d/rc3.d目录下的初始化脚本,或者启动multi-user.target,以启动网络服务、登录服务、日志服务等。
  • 在运行级别5下,init会执行/etc/rc.d/rc5.d目录下的初始化脚本,或者启动graphical.target,以启动图形界面、显示管理器、桌面环境等。

当init完成运行级别或target的切换后,它会打开终端或图形界面,让用户输入用户名和密码进行登录,进入下一个阶段。

五、登录阶段

登录(login)是Linux系统中最后一个阶段,它是用户与系统交互的入口。登录可以分为两种方式:

  • 文本模式登录:这是一种基于命令行的登录方式,用户需要在终端(terminal)上输入用户名和密码,然后进入shell(/bin/bash或/bin/sh),shell是一种命令解释器,它可以接收用户输入的命令,并执行相应的操作。文本模式登录通常用于服务器或嵌入式设备等不需要图形界面的场合。
  • 图形模式登录:这是一种基于图形界面的登录方式,用户需要在显示管理器(display manager)上输入用户名和密码,然后进入桌面环境(desktop environment),桌面环境是一种图形化的用户界面,它提供了窗口、菜单、图标、工具栏等元素,以方便用户操作系统。图形模式登录通常用于个人电脑或笔记本等需要图形界面的场合。

当用户成功登录后,就可以开始使用Linux系统了。这样,Linux系统就完成了启动过程。

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

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

相关文章

【链表OJ】相交链表 环形链表1

前言: 💥🎈个人主页:​​​​​​Dream_Chaser~ 🎈💥 ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣上链表OJ题目 目录 一.leetcode 160. 相交链表 1.问题描述: 2.解题思路: 二.leetcode 141.环形链表 …

2024毕业设计选题指南【附选题大全】

title: 毕业设计选题指南 - 如何选择合适的毕业设计题目 date: 2023-08-29 categories: 毕业设计 tags: 选题指南, 毕业设计, 毕业论文, 毕业项目 - 如何选择合适的毕业设计题目 当我们站在大学生活的十字路口,毕业设计便成了我们面临的一项重要使命。这不仅是对我们…

centos安装Nginx配置Nginx

1. 查看操作系统有没有安装Nginx which nginx 2. 使用epel的方式进行安装(方法二) 先安装epel sudo yum install yum-utils 安装完成后,查看安装的epel包即可 sudo yum install epel 3 开始安装nginx 上面的两个方法不管选择哪个&…

数学建模——校园供水系统智能管理

import pandas as pd data1pd.read_excel("C://Users//JJH//Desktop//E//附件_一季度.xlsx") data2pd.read_excel("C://Users//JJH//Desktop//E//附件_二季度.xlsx") data3pd.read_excel("C://Users//JJH//Desktop//E//附件_三季度.xlsx") data4…

MySQL官网下载安装包

MySQL官网: MySQL MySQL 8.0官网下载地址: MySQL :: Download MySQL Community Server 2023-07-18 MySQL 8.1.0 发布,这是 MySQL 变更发版模型后的第一个创新版本 (Innovation Release) 。 如果在官网中找不到下载位置,点击第二个…

【【萌新的STM32-22中断概念的简单补充】】

萌新的STM32学习22-中断概念的简单补充 我们需要注意的是这句话 从上面可以看出,STM32F1 供给 IO 口使用的中断线只有 16 个,但是 STM32F1 的 IO 口却远远不止 16 个,所以 STM32 把 GPIO 管脚 GPIOx.0~GPIOx.15(xA,B,C,D,E,F,G)分别对应中断…

RV64和ARM64栈结构差异

RV64和ARM64栈结构差异 1 RV64和ARM64栈结构差异示意图1.1 RV64和ARM64寄存器介绍1.1.1 RV64寄存器1.1.2 ARM64寄存器 1.2 RV64和ARM64栈结构差异示意图 2 RV64和ARM64栈使用示例2.1 测试的程序2.2 RV64反汇编的汇编程序2.3 ARM64反汇编的汇编程序2.4 RV64和ARM64测试程序的栈结…

Future

Future Future接口由FutureTask 实现类定义了操作异步任务执行的一些方法,比如异步任务的执行结果、取消任务的执行、判断任务是否被取消、判断任务执行是否完毕等。Future 接口可以为主线程开一个分支任务,专门为主线程处理耗时和费力的业务。 Future…

制造业物联网革命:智慧工厂数据采集与远程监控管理

智慧工厂是指运用现代信息技术和物联网技术,实现制造业生产过程的智能数字化。智慧工厂的工业设备不仅能够自动化运行,还可以通过网络技术帮助企业实现数据采集、远程监控与管理。4G工业网关便成为了智慧工厂通讯的重要组成部分,起到了连接工…

uni-app开发小程序中遇到的map地图的点聚合以及polygon划分区域问题

写一篇文章来记录以下我在开发小程序地图过程中遇到的两个小坑吧,一个是点聚合,用的是joinCluster这个指令,另一个是polygon在地图上划分多边形的问题: 1.首先说一下点聚合问题,由于之前没有做过小程序地图问题&#…

LNMP架构之搭建Discuz论坛

LNMP 一、编译安装Nginx1)前置准备2)开始编译安装3)添加到系统服务(systemd启动) 二、编译安装MySQL服务1)前置准备2)编译安装3)编辑配置文件4)更改mysql安装目录和配置文…

【流量分析】Godzilla分析

一、哥斯拉流量的特点: 1.User-Agent (弱特征) 哥斯拉客户端使用JAVA语言编写,在默认的情况下,如果不修改User-Agent,User-Agent会类似于Java/1.8.0_121(具体什么版本取决于JDK环境版本)。但是哥斯拉支持…

Pytest参数详解 — 基于命令行模式

1、--collect-only 查看在给定的配置下哪些测试用例会被执行 2、-k 使用表达式来指定希望运行的测试用例。如果测试名是唯一的或者多个测试名的前缀或者后缀相同,可以使用表达式来快速定位,例如: 命令行-k参数.png 3、-m 标记&#xff0…

K-Means(K-均值)聚类算法理论和实战

目录 K-Means 算法 K-Means 术语 K 值如何确定 K-Means 场景 美国总统大选摇争取摆选民 电商平台用户分层 给亚洲球队做聚类 ​编辑 其他场景 K-Means 工作流程 K-Means 开发流程 K-Means的底层代码实现 K-Means 的评价标准 K-Means 算法 对于 n 个样本点来说&am…

unity VS无法进行断点调试

有时候我们的VS无法进行断点调试,报错如下: 原因是:开启了多个项目,vs无法找到调式项目 解决:点击菜单栏--调试----附加unity调试程序 会弹出一个框,然后选择你要调试的项目 即可

长安链并行调度机制(1):交易调度与冲突检测流程

长安链采用高效的并行调度方式执行交易,了解长安链交易调度、冲突检测和DAG构建流程有助于开发者更好地理解长安链并行调度的运行机制,帮助开发者编写高质量、低冲突的智能合约,更好地构建区块链应用。 我们将用两篇文章说明长安链交易调度、…

Linux特殊指令

目录 1.dd命令 2.mkfs格式化 3.df命令 4.mount实现硬盘的挂载 5.unshare 1.dd命令 dd命令可以用来读取转换并输出数据。 示例一: if表示infile,of表示outfile。这里的/dev/zero是一个特殊文件,会不断产生空白数据。 bs表示复制一块的大…

ZLMediaKit 重建docker包

1.下载容器到本地服务器并运行 #此镜像为github持续集成自动编译推送,跟代码(master分支)保持最新状态 docker run -id -p 1935:1935 -p 8080:80 -p 8443:443 -p 8554:554 -p 10000:10000 -p 10000:10000/udp -p 8000:8000/udp -p 9000:9000/udp zlmediakit/zlmedi…

阿姆达尔定律(Amdahl‘s Law)通俗解释

阿姆达尔定律(Amdahl’s Law),它描述了在对系统的某个部分进行加速时,该部分对整体系统性能的影响,取决于该部分的重要性和加速程度。 原书给的例子不太好懂,下面是一个更好懂的例子。 例子:汽车…

Python数据分析实战-修改 DataFrame 中的字段(列)名(附源码和实现效果)

实现功能 修改 DataFrame 中的字段(列)名 实现代码 import pandas as pd# 创建一个示例 DataFrame df pd.DataFrame({A: [1, 2, 3], B: [4, 5, 6], C: [7, 8, 9]})# 使用 rename 方法修改列名这,将返回一个新的 DataFrame,其中列名已更改…