当前位置: 首页 > ai >正文

【Linux基础】Linux系统启动:深入解析Linux系统启动完整流程

目录

引言

1 Linux系统启动概述

2 启动引导阶段详解

2.1 加载BIOS

2.1.1 BIOS的定义与功能

2.1.2 BIOS的关键信息

2.1.3 BIOS与Linux的关系

2.2 读取MBR

2.2.1 MBR的定义与结构

2.2.2 MBR的结构详解

2.2.3 Boot Loader的作用

2.3 GRUB引导

2.4 加载Kernel

2.4.1 内核加载过程

2.4.2 内核初始化过程

2.4.3 内核模块

3 系统初始化阶段详解

3.1 设定inittab运行等级

3.1.1 init进程与运行等级

3.1.2 Linux运行等级

3.1.3 inittab文件结构

3.2 加载rc.sysinit

3.2.1 rc.sysinit的作用

3.2.2 rc.sysinit的主要功能

3.2.3 网络配置详解

3.3 加载内核模块

3.3.1 内核模块加载机制

3.3.2 常见内核模块

3.4 启动运行级别程序

3.4.1 运行级别程序目录结构

3.4.2 脚本命名规则

3.4.3 服务启动流程

3.5 读取rc.local文件

3.6 执行/bin/login程序

4 总结


引言

Linux系统启动是一个复杂而精密的过程,涉及硬件初始化、引导加载、内核启动、服务初始化等多个阶段。理解Linux系统的启动流程对于系统管理员、开发人员以及Linux爱好者来说都具有重要意义。

1 Linux系统启动概述

Linux系统启动过程可以分为两个主要阶段:启动引导阶段系统初始化阶段。启动引导阶段负责从硬件层面加载操作系统核心,系统初始化阶段则负责建立完整的用户环境。
Linux启动流程总览:
  • 计算机加电:用户按下电源按钮,计算机开始启动
  • BIOS加载:基本输入输出系统进行硬件初始化
  • 读取MBR:从硬盘读取主引导记录
  • GRUB引导:GRUB引导程序加载操作系统内核
  • 加载Kernel:解压并启动Linux内核
  • 设定运行等级:通过init进程设定系统运行级别
  • 加载rc.sysinit:执行系统初始化脚本
  • 加载内核模块:加载必要的内核模块
  • 启动运行级别程序:根据运行级别启动相应服务
  • 读取rc.local:执行用户自定义启动脚本
  • 执行login程序:启动登录程序,等待用户登录
  • 用户登录:用户输入用户名和密码,完成登录

2 启动引导阶段详解

2.1 加载BIOS

2.1.1 BIOS的定义与功能

BIOS(Basic Input/Output System,基本输入输出系统)是固化在计算机主板ROM芯片中的一组程序,是计算机加电后执行的第一段软件代码。
BIOS加载流程描述:
  • 计算机加电:用户按下电源按钮,电源开始向各个硬件组件供电
  • 电源稳定:电源输出稳定的电压,各硬件组件开始工作
  • CPU复位:CPU执行复位操作,程序计数器设置为预定义地址
  • 执行BIOS代码:CPU从ROM芯片中执行BIOS程序
  • POST自检:BIOS执行加电自检(Power-On Self-Test),检测关键硬件
  • 硬件初始化:初始化CPU、内存、硬盘等硬件设备
  • 加载启动顺序:根据BIOS设置中的启动顺序查找可启动设备
  • 移交控制权:将控制权移交给引导程序

2.1.2 BIOS的关键信息

BIOS中包含以下关键信息:
  • 硬件信息:CPU、内存、硬盘等相关硬件信息
  • 启动顺序:设备启动顺序信息
  • 硬盘信息:硬盘的容量、型号等基本信息
  • 内存信息:内存容量、速度等信息
  • 时钟信息:系统时间和日期信息
  • 即插即用特性:PNP(Plug-and-Play)特性,支持自动设备识别

2.1.3 BIOS与Linux的关系

在Linux系统中,BIOS的作用主要体现在:
  • 硬件初始化:为Linux内核提供基本的硬件环境
  • 启动引导:负责加载引导程序(如GRUB)
  • 硬件抽象:提供硬件访问的底层接口
  • 电源管理:通过ACPI提供电源管理功能

2.2 读取MBR

2.2.1 MBR的定义与结构

MBR(Master Boot Record,主引导记录)是硬盘的第一个扇区(512字节),位于硬盘的0磁道0柱面1扇区。
MBR读取流程:
  • BIOS查找启动设备:BIOS根据启动顺序查找可启动设备
  • 读取第一个扇区:从启动设备的第一个扇区读取MBR
  • 验证MBR有效性:检查MBR的结束标志(0x55AA)
  • MBR有效性判断
    • 如果MBR有效,复制到内存地址0x7c00
    • 如果MBR无效,显示错误信息并停止启动
  • 执行Boot Loader:CPU执行内存中的引导程序代码

2.2.2 MBR的结构详解

  • MBR总共512字节,结构如下:
MBR结构说明:
  • 引导程序(446字节)
  • 启动代码:负责加载操作系统的引导程序
  • 错误信息:显示启动错误信息
  • 磁盘签名:标识磁盘的唯一ID
  • 分区表(64字节)
    • 由4个分区项组成,每个分区项16字节
    • 每个分区项包含分区的起始地址、大小和类型等信息
  • 结束标志(2字节)
    • 固定值为"55,AA"(十六进制0x55AA)
    • 用于标识有效的MBR

2.2.3 Boot Loader的作用

Boot Loader是计算机启动过程中运行的第一个软件程序,主要功能包括:
  • 查找活动分区:在分区表中查找标记为活动(0x80)的分区
  • 加载引导程序:从活动分区的第一个扇区加载引导程序
  • 移交控制权:将CPU控制权移交给引导程序

2.3 GRUB引导

GRUB(GRand Unified Bootloader)是GNU项目开发的多操作系统启动程序,负责加载Linux内核。
GRUB引导流程描述:
  • GRUB启动:GRUB被加载到内存中并开始执行
  • 读取配置文件:读取GRUB配置文件(如grub.cfg)
  • 显示启动菜单:显示可用的启动选项菜单
  • 用户选择:用户通过键盘选择要启动的操作系统
  • 加载内核:加载所选操作系统的内核到内存
  • 传递参数:向内核传递启动参数
  • 移交控制权:将控制权移交给内核

2.4 加载Kernel

2.4.1 内核加载过程

内核加载是Linux启动过程中的关键步骤,负责将压缩的内核解压并启动。
内核加载流程描述:
  • GRUB加载内核:GRUB将压缩的内核文件加载到内存中
  • 解压内核:系统对压缩的内核进行解压操作
  • 输出解压信息:屏幕输出"Uncompressing Linux"等提示信息
  • 解压完成判断
    • 如果解压完成,屏幕输出"OK, booting the kernel"
    • 如果解压失败,显示错误信息
  • 放置内核到内存:将解压后的内核放置在内存中
  • 调用start_kernel():调用内核的启动函数

2.4.2 内核初始化过程

内核初始化流程描述:
  • 设置CPU:设置CPU的工作模式和寄存器
  • 初始化内存:设置内存管理单元和页表
  • 初始化进程:创建第一个进程(init进程)
  • 初始化设备:初始化各种硬件设备
  • 挂载根文件系统:挂载根文件系统为只读模式
  • 启动init进程:启动系统的第一个用户进程
  • 移交控制权:将控制权移交给init进程

2.4.3 内核模块

Linux内核采用模块化设计,内核模块可以动态加载:
  • 模块类型:字符设备块、网络设备、文件系统等
  • 模块位置:通常位于/lib/modules/目录下
  • 模块加载:通过insmod、modprobe等命令加载
  • 模块配置:通过/etc/modules.conf和/etc/modules.d/配置

3 系统初始化阶段详解

3.1 设定inittab运行等级

3.1.1 init进程与运行等级

init进程是Linux系统的第一个用户进程,进程ID为1,负责系统的初始化和服务管理。
init进程启动流程描述:
  • 内核启动:Linux内核完成初始化
  • 创建init进程:内核创建第一个用户进程(init)
  • 读取/etc/inittab:init进程读取配置文件
  • 设定运行等级:根据配置设定系统运行等级
  • 启动相应服务:根据运行等级启动相应服务

3.1.2 Linux运行等级

运行等级

描述

主要用途

0

关机模式

系统关机

1

单用户模式

系统维护,只有一个管理员用户

2

多用户模式

不支持网络的多用户模式

3

完整多用户模式

命令行界面,支持网络

4

未定义

保留给用户自定义

5

图形界面模式

图形用户界面

6

重启模式

系统重启

3.1.3 inittab文件结构

inittab文件结构说明:
  • 默认运行等级:设定系统的默认运行等级
  • 初始化脚本:定义系统初始化脚本
  • respawn进程:需要保持运行的进程(如getty)
  • wait进程:等待完成的进程
  • once进程:只运行一次的进程

3.2 加载rc.sysinit

3.2.1 rc.sysinit的作用

rc.sysinit是Linux系统执行的第一个用户层脚本,负责系统的基本初始化。
rc.sysinit执行流程描述:
  • init进程:init进程开始执行
  • 读取/etc/inittab:读取inittab配置文件
  • 确定运行等级:根据配置确定系统运行等级
  • 执行/etc/rc.d/rc.sysinit:执行系统初始化脚本
  • 设置PATH变量:设置系统环境变量PATH
  • 设置网络配置:配置网络参数
  • 启动swap分区:激活交换分区
  • 设置/proc:设置/proc文件系统
  • 配置Selinux:配置安全增强Linux

3.2.2 rc.sysinit的主要功能

rc.sysinit脚本包含以下主要功能:
  • 设定PATH运行变量:设置系统的PATH环境变量
  • 设定网络配置:配置网络接口和路由
  • 启动swap分区:激活交换空间
  • 设定/proc:设置/proc虚拟文件系统
  • 系统函数:定义系统函数和别名
  • 配置Selinux:配置安全增强Linux策略

3.2.3 网络配置详解

rc.sysinit中的网络配置包括:
  • 网络接口:配置以太网、无线网等网络接口
  • IP地址:设置静态IP地址或通过DHCP获取
  • 子网掩码:设置网络子网掩码
  • 网关:设置默认网关
  • DNS:设置域名解析服务器
  • 主机名:设置系统主机名

3.3 加载内核模块

3.3.1 内核模块加载机制

  • Linux内核采用模块化设计,内核模块可以在运行时动态加载
内核模块加载流程描述:
  • 系统初始化:系统进入初始化阶段
  • 读取/etc/modules.conf:读取模块配置文件
  • 读取/etc/modules.d/:读取模块配置目录
  • 加载必要模块:根据配置加载必要的内核模块
  • 模块初始化:执行模块的初始化函数
  • 模块注册:将模块注册到内核中
  • 模块激活:激活模块的功能

3.3.2 常见内核模块

常见的Linux内核模块包括:
  • 文件系统模块:ext4、xfs、btrfs等
  • 网络模块:网卡驱动、网络协议栈
  • 存储模块:磁盘控制器、RAID驱动
  • 硬件模块:显卡、声卡、USB设备驱动

3.4 启动运行级别程序

3.4.1 运行级别程序目录结构

  • 根据运行等级,系统会执行相应的初始化脚本:
运行级别程序目录说明:
  • /etc/rc.d/rc0.d:关机模式的脚本目录
  • /etc/rc.d/rc1.d:单用户模式的脚本目录
  • /etc/rc.d/rc2.d:多用户模式的脚本目录
  • /etc/rc.d/rc3.d:完整多用户模式的脚本目录
  • /etc/rc.d/rc4.d:未定义模式的脚本目录
  • /etc/rc.d/rc5.d:图形界面模式的脚本目录
  • /etc/rc.d/rc6.d:重启模式的脚本目录

3.4.2 脚本命名规则

运行级别目录中的脚本遵循特定的命名规则:
  • S开头:表示启动(Start)脚本
  • K开头:表示停止(Kill)脚本
  • 数字后缀:表示执行顺序编号
脚本命名规则说明:
  • S开头脚本:启动服务脚本
    • 例如:S10network、S11syslog
    • 数字越小,执行优先级越高
  • K开头脚本:停止服务脚本
    • 例如:K10network、K11syslog
    • 数字越小,停止优先级越高

3.4.3 服务启动流程

  • 根据运行等级启动服务的过程:
服务启动流程描述:
  • 确定运行等级:根据系统运行等级确定要执行的脚本目录
  • 扫描对应目录:扫描对应运行等级的脚本目录
  • 排序脚本文件:根据数字后缀对脚本进行排序
  • 执行S开头脚本:按顺序执行S开头的启动脚本
  • 启动相应服务:启动相应的系统服务
  • 执行K开头脚本:执行K开头的停止脚本
  • 停止不需要的服务:停止不需要的服务

3.5 读取rc.local文件

rc.local文件是用户自定义启动脚本,允许用户添加自定义的启动命令。
rc.local执行流程描述:
  • 服务启动完成:系统服务启动完成
  • 读取/etc/rc.d/rc.local:读取用户自定义脚本
  • 执行自定义命令:执行用户定义的启动命令
  • 设置环境变量:设置自定义的环境变量
  • 启动自定义服务:启动用户自定义的服务
  • 完成初始化:系统初始化完成

3.6 执行/bin/login程序

login程序是Linux系统的最后一个启动步骤,负责启动登录界面。
login程序执行流程描述:
  • 系统初始化完成:系统所有初始化工作完成
  • 执行/bin/login:执行登录程序
  • 显示登录界面:显示用户登录界面
  • 等待用户输入:等待用户输入用户名和密码
  • 验证用户凭据:验证用户输入的用户名和密码
  • 验证成功判断
    • 如果验证成功,启动Shell
    • 如果验证失败,显示错误信息并重新等待输入
  • 用户登录完成:用户成功登录到系统

4 总结

Linux系统启动流程是一个复杂而精密的过程,涉及硬件初始化、引导加载、内核启动、服务初始化等多个阶段。理解启动流程对于系统管理和故障排除具有重要意义。在实际应用中,我们应深入理解每个启动步骤的作用,掌握配置和管理技巧,并遵循最佳实践,确保系统的稳定、安全和高效运行。
http://www.xdnf.cn/news/19644.html

相关文章:

  • 仿真波导中超短脉冲传输中的各种非线性效应所产生的超连续谱
  • AI如何理解PDF中的表格和图片?
  • qt安装FFmpeg后编译遇到error: collect2.exe: error: ld returned 1 exit status错误
  • 链表题类型注解解惑:理解Optional,理解ListNode
  • 数据结构--跳表(Skip List)
  • 【学Python自动化】 7. Python 输入与输出学习笔记
  • kaggle中的2D目标检测训练trick总结
  • 用了企业微信 AI 半年,这 5 个功能让我彻底告别重复劳动
  • 一文带你入门 AT 指令集:从串口通信到模块控制
  • 【智能体开发】怎样提升AI智能体的运行速度?
  • 实验2-代理模式和观察者模式设计
  • C++全局变量未初始的和已初始化的位置放在哪里?
  • C语言————实战项目“扫雷游戏”(完整代码)
  • 【Spring Cloud微服务】9.一站式掌握 Seata:架构设计与 AT、TCC、Saga、XA 模式选型指南
  • MD5加密算法详解与实现
  • 【LeetCode_26】删除有序数组中的重复项
  • 手撕Redis底层2-网络模型深度剖析
  • 云电脑是什么?与普通电脑的区别在哪里?——天翼云电脑体验推荐
  • 全国产FT-M6678核心板
  • SQL JOIN 操作全面解析
  • 哈希表-面试题01.02.判定是否互为字符重排-力扣(LeetCode)
  • 【LeetCode数据结构】栈和队列的应用
  • 在windows平台oracle 23ai 数据库上使用bbed
  • 面阵 vs 线阵相机:怎么选不踩坑?选型公式直接套用
  • SQLShift 实现Oracle 到 OceanBase 的存储过程转换初体验
  • 【Vue2 ✨】 Vue2 入门之旅(六):指令与过滤器
  • 阿里云和华为云Rocky LINUX 9.X镜像就绪及低端可用英伟达GPU
  • Google NotebookLM最强替代品评测:AI笔记、语音生成与高效知识管理工具盘点
  • 【Linux基础知识系列:第一百一十八篇】使用perf进行性能分析
  • Day33 网络编程:OSI/TCP/IP模型、协议族与UDP编程