操作系统引导过程

文章目录


第一阶段:固件初始化 (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)会有细微差别。

相关推荐
楠奕8 小时前
CentOS7安装GoldenDB单机搭建及常见报错解决方案
linux·运维·服务器
GCTTTTTT9 小时前
远程服务器走本地代理
运维·服务器
剑锋所指,所向披靡!9 小时前
Linux常用指令(2)
linux·运维·服务器
做咩啊~9 小时前
6.增加一个flat网段
服务器·openstack
HXQ_晴天10 小时前
Linux 系统的交互式进程监控工具htop
linux·服务器·网络
LIZhang201610 小时前
linux写一个脚本实时保存内存占用情况
linux·运维·服务器
@LuckY BoY11 小时前
deepin 系统的导航栏或任务栏不见了
运维·服务器
xcLeigh12 小时前
KES数据库表空间目录自动创建特性详解与存储运维最佳实践
大数据·运维·服务器·数据库·表空间·存储
sbjdhjd13 小时前
Docker | 核心概念科普 + 保姆级部署
linux·运维·服务器·docker·云原生·面试·eureka
以太浮标13 小时前
华为eNSP模拟器综合实验之- DHCP、DNS、HTTP和FTP服务器配置案例Client-Server
linux·服务器·windows·http·华为·信息与通信