操作系统引导过程

文章目录


第一阶段:固件初始化 (BIOS/UEFI)

当你按下电源键,CPU从主板上预定义的地址开始执行代码,这个代码就是固件(Firmware)。

核心任务:

  1. POST 上电自检:检查关键硬件(CPU、内存、显卡、键盘)是否正常工作。听到的"滴"声就是POST码提示。
  2. 初始化硬件:枚举和初始化总线、磁盘控制器等设备。
  3. 确定引导设备:按照预设顺序(如:U盘->硬盘->网络)查找可引导的设备。
  4. 读取并执行主引导记录:对于传统 BIOS,它会读取硬盘的第一个扇区(512字节),即 MBR,并执行其中的第一阶段引导加载程序。对于现代
    UEFI,它直接从硬盘上独立的 FAT 格式 ESP 分区 中加载 .efi 应用程序(如 bootx64.efi),这更快速、更安全。

第二阶段:引导加载程序 (Boot Loader)

此阶段的任务是定位并加载操作系统内核。

以经典的 GRUB2 为例

  1. MBR 中的代码(第一阶段)非常小(仅446字节),其作用只是加载位于 MBR 之后、磁盘第一个分区之前 的 GRUB
    核心镜像(core.img,即第1.5阶段)。
  2. GRUB 核心镜像 包含了必要的文件系统驱动,从而能读取 /boot/grub 目录下的模块和配置文件(grub.cfg)。
  3. GRUB 第二阶段 会解析 grub.cfg,在屏幕上显示引导菜单,让你可以选择不同的内核或操作系统。
  4. 选择后,GRUB 会将选定的 Linux
    内核(vmlinuz-xxx)和初始内存磁盘镜像(initramfs-xxx.img)加载到内存中,然后将控制权交给内核。

initramfs 的关键作用:它是一个临时的根文件系统,包含了内核启动初期必需的驱动(如真正的磁盘驱动、LVM、加密模块)和工具。内核用它来挂载真实的根文件系统。没有它,内核可能无法识别硬盘。

第三阶段:内核初始化

内核被加载到内存并取得控制权后,开始"自举"。

  1. 解压与自解压:内核通常是压缩的,先进行自解压。
  2. 初始化核心子系统:依次初始化调度器、内存管理、中断处理,并最终启动空闲进程(swapper 或 idle)。
  3. 探测硬件与加载驱动:内核基于从固件获取的信息和 initramfs 中的模块,探测硬件并加载驱动。
  4. 挂载根文件系统:内核使用 initramfs 中的工具和驱动,挂载真正的根文件系统(/)。之后,它会卸载 initramfs
    并释放其内存。
  5. 启动第一个用户空间进程:内核从根文件系统上寻找并执行 第一个用户空间进程。对于绝大多数现代Linux系统,这就是
    systemd(其PID为1)。至此,内核引导完成,重心转向用户空间。

第四阶段:用户空间初始化 (由 init/systemd 主导)

systemd(或传统的 sysvinit)作为所有进程的父进程,负责启动整个用户空间环境。

  1. 初始化基本系统:systemd 首先执行 default.target 所指向的一系列基础单元。

  2. 解析运行级别/目标:传统的 sysvinit 会读取 /etc/inittab

    确定运行级别(如3为多用户文本,5为图形)。systemd 则有对应的 multi-user.target 或

    graphical.target。

  3. 执行系统初始化脚本:

    sysvinit:顺序执行 /etc/rc.d/rcX.d/ (X为运行级别)目录下以 S 开头的启动脚本。

    systemd:并行启动各个 .service 单元,效率更高。

  4. 启动关键服务:依次启动文件系统挂载、网络配置、日志服务、计划任务等。

  5. 启动图形界面:如果目标为图形界面,则会启动 显示管理器(如 gdm、lightdm),显示登录窗口。

  6. 用户登录:用户输入凭证后,显示管理器启动桌面环境会话(如GNOME、KDE)或窗口管理器。

故障排查

了解引导过程有助于定位启动失败的问题:

  • 查看日志:使用 journalctl -b 或查看 /var/log/boot.log。
  • GRUB 阶段失败:通常与 MBR 损坏、/boot 分区丢失或 grub.cfg 错误有关。可使用 Live CD 修复。
  • 内核 panic:常见于驱动问题、根文件系统挂载失败。观察 initramfs 是否包含正确驱动。
  • systemd 阶段失败:使用 systemctl --failed 查看失败的服务。

总结

这是一个标准流程,具体的发行版(如Ubuntu、CentOS)或初始化系统(如systemd、upstart)会有细微差别。

相关推荐
巨斧空间掌门20 小时前
JDK17 下载 windows Linux
linux·运维·服务器
江畔何人初20 小时前
kube-apiserver、kube-proxy、Calico 关系
运维·服务器·网络·云原生·kubernetes
皮卡蛋炒饭.21 小时前
进程得控制
linux·运维·服务器
weiwx831 天前
Nginx location 和 proxy_pass 配置详解
服务器·网络·nginx
西门吹-禅1 天前
【sap fiori cds up error】
java·服务器·sap cap cds
minji...1 天前
Linux 库制作与原理(三)深入动静态链接原理
linux·运维·服务器·c++
bukeyiwanshui1 天前
Linux实践
linux·运维·服务器
ChoSeitaku1 天前
NO.2|proto3语法|消息类型|通讯录|文件读取|enum类型
java·服务器·前端
MinterFusion1 天前
如何在开放麒麟(openKylin)下安装FTP服务器(v0.1.0)
运维·服务器·网络·vsftpd·开放麒麟·明德融创·openkylin
xlq223221 天前
30.进程池IPC
linux·运维·服务器